diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index ad09fd8b98..9797ef05e7 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -8,22 +8,21 @@ on: pull_request: types: [ready_for_review, synchronize, opened] +permissions: + contents: read + jobs: benchmark: runs-on: ubuntu-latest strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: '2.7' + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 94aef583d6..2718c95e1e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -10,21 +10,23 @@ on: schedule: - cron: "0 14 * * 3" +permissions: + contents: read + jobs: scan: + permissions: + actions: read # for github/codeql-action/init to get workflow details + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/analyze to upload SARIF results runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: '2.7' - - run: git checkout HEAD^2 if: ${{ github.event_name == 'pull_request' }} diff --git a/.github/workflows/devnet-sync.yml b/.github/workflows/devnet-sync.yml index 2be4e7df3f..95e118ec5d 100644 --- a/.github/workflows/devnet-sync.yml +++ b/.github/workflows/devnet-sync.yml @@ -4,16 +4,19 @@ on: schedule: - cron: "0 10 * * *" +permissions: + contents: read + jobs: devnet-sync: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: ref: develop - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 74374defc7..a918dfe451 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -8,18 +8,21 @@ on: pull_request: types: [ready_for_review, synchronize, opened] +permissions: + contents: read + jobs: e2e: runs-on: ubuntu-latest strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-e2e-${{ hashFiles('**/yarn.lock') }} @@ -31,21 +34,21 @@ jobs: - name: Install and build packages run: yarn setup - name: Docker compose up - run: cd __tests__/e2e/lib/config && docker-compose up -d + run: cd __tests__/e2e/lib/config && docker compose up -d - name: Let the network run during 5min run: sleep 300 - name: Show logs - node0 if: always() - run: docker logs config_core0_1 + run: docker logs config-core0-1 - name: Show logs - node1 if: always() - run: docker logs config_core1_1 + run: docker logs config-core1-1 - name: Show logs - node2 if: always() - run: docker logs config_core2_1 + run: docker logs config-core2-1 - name: Show logs - node3 if: always() - run: docker logs config_core3_1 + run: docker logs config-core3-1 - name: Show logs - node4 if: always() - run: docker logs config_core4_1 + run: docker logs config-core4-1 diff --git a/.github/workflows/functional.yml b/.github/workflows/functional.yml index a99b0a8515..e31c6257fe 100644 --- a/.github/workflows/functional.yml +++ b/.github/workflows/functional.yml @@ -8,6 +8,9 @@ on: pull_request: types: [ready_for_review, synchronize, opened] +permissions: + contents: read + jobs: core-database: runs-on: ubuntu-latest @@ -25,7 +28,7 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] env: CORE_DB_DATABASE: ark_unitnet @@ -35,13 +38,9 @@ jobs: POSTGRES_DB: ark_unitnet steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -67,7 +66,7 @@ jobs: run: yarn test __tests__/functional/core-database/ --coverage --coverageDirectory .coverage/functional/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -88,16 +87,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -126,7 +121,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -147,16 +142,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -185,7 +176,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -206,16 +197,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -244,7 +231,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -265,16 +252,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -303,7 +286,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -324,16 +307,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -362,7 +341,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -383,16 +362,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -421,7 +396,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -442,16 +417,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -480,7 +451,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -501,16 +472,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -539,7 +506,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -560,16 +527,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -598,7 +561,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -619,16 +582,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -657,7 +616,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -678,16 +637,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -716,7 +671,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -737,16 +692,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -775,7 +726,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -796,16 +747,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -834,7 +781,7 @@ jobs: CORE_DB_USERNAME: ark - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/functional/${{ github.job }}/lcov.info @@ -855,16 +802,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -908,16 +851,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -961,16 +900,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -1014,12 +949,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -1063,12 +998,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -1112,12 +1047,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -1161,16 +1096,12 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 6552f6177b..3cfde55b08 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -8,6 +8,9 @@ on: pull_request: types: [ready_for_review, synchronize, opened] +permissions: + contents: read + jobs: integration: runs-on: ubuntu-latest @@ -25,7 +28,7 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] env: CORE_DB_DATABASE: ark_unitnet @@ -35,10 +38,10 @@ jobs: POSTGRES_DB: ark_unitnet steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6f6941b428..3824b69c82 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,19 +8,22 @@ on: pull_request: types: [ready_for_review, synchronize, opened] +permissions: + contents: read + jobs: source: runs-on: ubuntu-latest strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -32,28 +35,7 @@ jobs: node-version: ${{ matrix.node-version }} - name: Install & Build - run: yarn install && yarn bootstrap + run: yarn install - name: Lint Source run: yarn lint - # tests: - # runs-on: ubuntu-latest - # strategy: - # matrix: - # node-version: [12.x] - # steps: - # - uses: actions/checkout@v2 - # - name: Cache node modules - # uses: actions/cache@v1 - # with: - # path: node_modules - # key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} - # restore-keys: ${{ runner.os }}-node- - # - name: Use Node.js ${{ matrix.node-version }} - # uses: actions/setup-node@v1 - # with: - # node-version: ${{ matrix.node-version }} - # - name: Install & Build - # run: yarn install && yarn bootstrap - # - name: Lint Source - # run: yarn lint:tests diff --git a/.github/workflows/publish-develop.yml b/.github/workflows/publish-develop.yml index c5f16fe38a..d9c1629b0c 100644 --- a/.github/workflows/publish-develop.yml +++ b/.github/workflows/publish-develop.yml @@ -5,6 +5,9 @@ on: branches: - "develop" +permissions: + contents: read + jobs: build: if: "contains(github.event.head_commit.message, 'release:')" @@ -12,11 +15,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 16 registry-url: https://registry.npmjs.org/ - name: Install & Build diff --git a/.github/workflows/publish-master.yml b/.github/workflows/publish-master.yml index 7c7ab1c90e..c9710861ed 100644 --- a/.github/workflows/publish-master.yml +++ b/.github/workflows/publish-master.yml @@ -5,6 +5,9 @@ on: branches: - "master" +permissions: + contents: read + jobs: build: if: "contains(github.event.head_commit.message, 'release:')" @@ -12,16 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - name: Set up Python 2.7 - uses: actions/setup-python@v2 - with: - python-version: "2.7" - + - uses: actions/checkout@v4 - uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 16 registry-url: https://registry.npmjs.org/ - name: Install & Build diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index 78448edb6d..f637637ce5 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -8,19 +8,22 @@ on: pull_request: types: [ready_for_review, synchronize, opened] +permissions: + contents: read + jobs: core: runs-on: ubuntu-latest strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -38,7 +41,7 @@ jobs: run: yarn test __tests__/unit/core/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -48,13 +51,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -72,7 +75,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-api/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -82,13 +85,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -106,7 +109,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-blockchain/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -116,13 +119,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -140,7 +143,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-cli/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -150,13 +153,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -174,7 +177,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-database/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -184,13 +187,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -208,7 +211,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-forger/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -218,13 +221,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -242,7 +245,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-kernel/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -252,13 +255,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -276,7 +279,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-logger-pino/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -286,13 +289,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -310,7 +313,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-magistrate-api/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -320,13 +323,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -344,7 +347,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-magistrate-crypto/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -354,13 +357,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -378,7 +381,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-magistrate-transactions/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -388,13 +391,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -412,7 +415,7 @@ jobs: run: yarn test __tests__/unit/core-p2p/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -422,13 +425,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -446,7 +449,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-snapshots/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -456,13 +459,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -480,7 +483,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-state/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -490,13 +493,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -514,7 +517,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-test-framework/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -524,13 +527,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -548,7 +551,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-transaction-pool/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -558,13 +561,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -582,7 +585,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-transactions/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -592,13 +595,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -616,7 +619,7 @@ jobs: run: yarn test:parallel __tests__/unit/core-webhooks/ --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info @@ -626,13 +629,13 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [16.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules - uses: actions/cache@v1 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} @@ -649,7 +652,7 @@ jobs: - name: Test run: yarn test:parallel __tests__/unit/crypto/ --coverage --coverage --coverageDirectory .coverage/unit/${{ github.job }} - name: Archive code coverage - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ github.job }}-coverage path: .coverage/unit/${{ github.job }}/lcov.info diff --git a/CODEOWNERS b/CODEOWNERS index b3f9a66177..8b675c3833 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @faustbrian @air1one @rainydio @sebastijankuzner +* @itsanametoo @sebastijankuzner @boldninja @oXtxNt9U diff --git a/README.md b/README.md index 31d44e4ec1..c235707f5d 100644 --- a/README.md +++ b/README.md @@ -4,30 +4,26 @@

-[![Build Status](https://badgen.now.sh/github/status/ArkEcosystem/core/master)](https://github.com/ArkEcosystem/core/actions) [![License: MIT](https://badgen.now.sh/badge/license/MIT/green)](https://opensource.org/licenses/MIT) -> Lead Maintainer: [Erwann Gentric](https://github.com/air1one) +> **Note** +> Please checkout [MainSail](https://github.com/ArkEcosystem/mainsail) for the next generation of the ARK-Core blockchain protocol featuring a new DPoS consensus engine that is more reliable and efficient. Currently in development. ## Introduction > This repository contains all plugins that make up the ARK Core. -Check our [dedicated documentation site](https://learn.ark.dev) for information about all available plugins and [How to write a Core Plugin -](https://learn.ark.dev/application-development/how-to-write-core-dapps) if you want to get started with developing your own plugins. +Check our [dedicated documentation site](https://ark.dev/docs/core) for information about all available plugins and [How to write a Core Plugin +](https://ark.dev/docs/core/development/plugins/intro) if you want to get started with developing your own plugins. ## Documentation -- Development : https://learn.ark.dev/core-getting-started/setting-up-your-development-environment -- Docker : https://guides.ark.dev/devops-guides/how-to-setup-a-node-with-docker +- Development : https://ark.dev/docs/core/installation/intro +- Docker : https://ark.dev/docs/core/development/docker ## API Documentation -- API v2 : https://api.ark.dev - -## GitHub Development Bounty - -- Get involved with the development and start earning ARK : https://bounty.ark.io +- API v2 : https://ark.dev/docs/api ## Security diff --git a/__tests__/e2e/README.md b/__tests__/e2e/README.md index 79e429fe64..e80f783773 100644 --- a/__tests__/e2e/README.md +++ b/__tests__/e2e/README.md @@ -16,8 +16,8 @@ You can launch and stop a network like this : ```bash cd lib/config -docker-compose up -d # launches the network -docker-compose down -v # shuts down the network +docker compose up -d # launches the network +docker compose down -v # shuts down the network ``` This will launch a network of 5 nodes on testnet. diff --git a/__tests__/functional/transaction-forging/entity-register.test.ts b/__tests__/functional/transaction-forging/entity-register.test.ts index 12ddcf7a76..9d58622c87 100644 --- a/__tests__/functional/transaction-forging/entity-register.test.ts +++ b/__tests__/functional/transaction-forging/entity-register.test.ts @@ -75,48 +75,10 @@ describe("Transaction Forging - Entity registration", () => { await expect(entityRegistration.id).not.toBeForged(); await expect(entityRegistration).not.entityRegistered(); }); - - it("should reject entity registration, because entity type is > 255 [Signed with 1 Passphrase]", async () => { - // entity registration - const entityRegistration = TransactionFactory.initialize(app).entity({ - type: 256, - subType: 1, - action: Enums.EntityAction.Register, - data: { - name: "name256", - }, - }) - .withPassphrase(secrets[0]) - .createOne(); - - await expect(entityRegistration).toBeRejected(); - await snoozeForBlock(1); - await expect(entityRegistration.id).not.toBeForged(); - await expect(entityRegistration).not.entityRegistered(); - }); - - it("should reject entity registration, because entity sub type is > 255 [Signed with 1 Passphrase]", async () => { - // entity registration - const entityRegistration = TransactionFactory.initialize(app).entity({ - type: 1, - subType: 256, - action: Enums.EntityAction.Register, - data: { - name: "namesubtype256", - }, - }) - .withPassphrase(secrets[0]) - .createOne(); - - await expect(entityRegistration).toBeRejected(); - await snoozeForBlock(1); - await expect(entityRegistration.id).not.toBeForged(); - await expect(entityRegistration).not.entityRegistered(); - }); }); describe("Signed with 2 Passphrases", () => { - it("should broadcast, accept and forge it [Signed with 2 Passphrases] ", async () => { + it("should broadcast, accept and forge it [Signed with 2 Passphrases]", async () => { // Prepare a fresh wallet for the tests const passphrase = generateMnemonic(); const secondPassphrase = generateMnemonic(); diff --git a/__tests__/integration/core-api/handlers/delegates.test.ts b/__tests__/integration/core-api/handlers/delegates.test.ts index 7075a642f4..55c980443a 100644 --- a/__tests__/integration/core-api/handlers/delegates.test.ts +++ b/__tests__/integration/core-api/handlers/delegates.test.ts @@ -60,7 +60,7 @@ describe("API 2.0 - Delegates", () => { const response = await api.request("GET", `delegates`, { address }); expect(response).toBeSuccessfulResponse(); expect(response.data.data).toBeArray(); - expect(response.data.data.map(d => d.address).sort()).toEqual(address.sort()); + expect(response.data.data.map((d) => d.address).sort()).toEqual(address.sort()); }); }); @@ -74,7 +74,11 @@ describe("API 2.0 - Delegates", () => { // save a new block so that we can make the request with generatorPublicKey await app - .get(Container.Identifiers.DatabaseBlockRepository) + .getTagged( + Container.Identifiers.DatabaseBlockRepository, + "connection", + "api", + ) .saveBlocks([block2]); const response = await api.request("GET", `delegates/${block2.data.generatorPublicKey}/blocks`); @@ -86,7 +90,11 @@ describe("API 2.0 - Delegates", () => { } await app - .get(Container.Identifiers.DatabaseBlockRepository) + .getTagged( + Container.Identifiers.DatabaseBlockRepository, + "connection", + "api", + ) .deleteBlocks([block2.data]); // reset to genesis block }); diff --git a/__tests__/integration/core-api/handlers/locks.test.ts b/__tests__/integration/core-api/handlers/locks.test.ts index fc824d2a44..a11c3c58d2 100644 --- a/__tests__/integration/core-api/handlers/locks.test.ts +++ b/__tests__/integration/core-api/handlers/locks.test.ts @@ -68,8 +68,10 @@ describe("API 2.0 - Locks", () => { }) .build()[0]; - const transactionRepository = app.get( + const transactionRepository = app.getTagged( Container.Identifiers.DatabaseTransactionRepository, + "connection", + "api", ); jest.spyOn(transactionRepository, "listByExpression").mockResolvedValueOnce({ diff --git a/__tests__/integration/core-api/handlers/transactions.test.ts b/__tests__/integration/core-api/handlers/transactions.test.ts index 4f6ebc01d8..180c1329d0 100644 --- a/__tests__/integration/core-api/handlers/transactions.test.ts +++ b/__tests__/integration/core-api/handlers/transactions.test.ts @@ -208,7 +208,7 @@ describe("API 2.0 - Transactions", () => { const response = await api.request("GET", "transactions", { recipientId: recipientAddress }); expect(response).toBeSuccessfulResponse(); expect(response.data.data).toBeArray(); - expect(response.data.data).toHaveLength(3); + expect(response.data.data).toHaveLength(2); for (const transaction of response.data.data) { api.expectTransaction(transaction); @@ -224,7 +224,7 @@ describe("API 2.0 - Transactions", () => { expect(response).toBeSuccessfulResponse(); expect(response.data.data).toBeArray(); - expect(response.data.data).toHaveLength(6); + expect(response.data.data).toHaveLength(4); for (const transaction of response.data.data) { api.expectTransaction(transaction); diff --git a/__tests__/integration/core-api/services/__support__/setup.ts b/__tests__/integration/core-api/services/__support__/setup.ts index 023d6506c4..3e4e63e5c8 100644 --- a/__tests__/integration/core-api/services/__support__/setup.ts +++ b/__tests__/integration/core-api/services/__support__/setup.ts @@ -29,7 +29,13 @@ export const setUp = async (): Promise => { await transactionsServiceProvider.register(); await apiServiceProvider.register(); - app.rebind(Container.Identifiers.StateStore).toConstantValue(null); + app.rebind(Container.Identifiers.StateStore).toConstantValue({ + getLastBlock: jest.fn().mockReturnValue({ + data: { + height: 1, + }, + }), + }); const walletAttributes = app.get(Container.Identifiers.WalletAttributes); walletAttributes.set("delegate.username"); diff --git a/__tests__/integration/core-api/services/delegate-search-service.test.ts b/__tests__/integration/core-api/services/delegate-search-service.test.ts index f333fc5ff2..1dfdca1ce7 100644 --- a/__tests__/integration/core-api/services/delegate-search-service.test.ts +++ b/__tests__/integration/core-api/services/delegate-search-service.test.ts @@ -94,7 +94,7 @@ describe("DelegateSearchService.getDelegate", () => { }); describe("DelegateSearchService.getDelegatesPage", () => { - it("should get all delegates when criteria is empty", () => { + it("should get all delegates when criteria is empty", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret1")); wallet1.setAttribute("delegate", delegateAttribute1); walletRepository.index(wallet1); @@ -103,7 +103,7 @@ describe("DelegateSearchService.getDelegatesPage", () => { wallet2.setAttribute("delegate", delegateAttribute2); walletRepository.index(wallet2); - const delegatesPage = delegateSearchService.getDelegatesPage({ offset: 0, limit: 100 }, [ + const delegatesPage = await delegateSearchService.getDelegatesPage({ offset: 0, limit: 100 }, [ { property: "username", direction: "asc" }, ]); @@ -112,7 +112,7 @@ describe("DelegateSearchService.getDelegatesPage", () => { expect(delegatesPage.results[1].username).toBe("cryptology"); }); - it("should get delegates that match criteria", () => { + it("should get delegates that match criteria", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret1")); wallet1.setAttribute("delegate", delegateAttribute1); walletRepository.index(wallet1); @@ -121,7 +121,7 @@ describe("DelegateSearchService.getDelegatesPage", () => { wallet2.setAttribute("delegate", delegateAttribute2); walletRepository.index(wallet2); - const delegatesPage = delegateSearchService.getDelegatesPage( + const delegatesPage = await delegateSearchService.getDelegatesPage( { offset: 0, limit: 100 }, [{ property: "username", direction: "asc" }], { username: "binance_staking" }, diff --git a/__tests__/integration/core-api/services/lock-search-service.test.ts b/__tests__/integration/core-api/services/lock-search-service.test.ts index b7047e9337..331ced8c86 100644 --- a/__tests__/integration/core-api/services/lock-search-service.test.ts +++ b/__tests__/integration/core-api/services/lock-search-service.test.ts @@ -59,13 +59,13 @@ beforeEach(async () => { }); describe("LockSearchService.getLock", () => { - it("should return lock resource by id", () => { + it("should return lock resource by id", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("htlc.locks", { [lockId1]: lockAttribute1 }); walletRepository.index(wallet1); stateStore.getLastBlock.mockReturnValue({ data: { height: 1000 } } as any); - const lockResource1 = lockSearchService.getLock(lockId1); + const lockResource1 = await lockSearchService.getLock(lockId1); expect(lockResource1.lockId).toEqual(lockId1); }); @@ -77,7 +77,7 @@ describe("LockSearchService.getLock", () => { }); describe("LockSearchService.getLocksPage", () => { - it("should return all locks", () => { + it("should return all locks", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("htlc.locks", { [lockId1]: lockAttribute1 }); walletRepository.index(wallet1); @@ -87,7 +87,7 @@ describe("LockSearchService.getLocksPage", () => { walletRepository.index(wallet2); stateStore.getLastBlock.mockReturnValue({ data: { height: 1000 } } as any); - const locksPage = lockSearchService.getLocksPage({ offset: 0, limit: 100 }, [ + const locksPage = await lockSearchService.getLocksPage({ offset: 0, limit: 100 }, [ { property: "amount", direction: "asc" }, ]); @@ -96,7 +96,7 @@ describe("LockSearchService.getLocksPage", () => { expect(locksPage.results[1].lockId).toBe(lockId2); }); - it("should return locks that match criteria", () => { + it("should return locks that match criteria", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("htlc.locks", { [lockId1]: lockAttribute1 }); walletRepository.index(wallet1); @@ -106,7 +106,7 @@ describe("LockSearchService.getLocksPage", () => { walletRepository.index(wallet2); stateStore.getLastBlock.mockReturnValue({ data: { height: 1000 } } as any); - const locksPage = lockSearchService.getLocksPage( + const locksPage = await lockSearchService.getLocksPage( { offset: 0, limit: 100 }, [{ property: "amount", direction: "asc" }], { amount: "1000" }, @@ -118,13 +118,13 @@ describe("LockSearchService.getLocksPage", () => { }); describe("LockSearchService.getWalletLocksPage", () => { - it("should return all wallet locks", () => { + it("should return all wallet locks", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("htlc.locks", { [lockId1]: lockAttribute1, [lockId2]: lockAttribute2 }); walletRepository.index(wallet1); stateStore.getLastBlock.mockReturnValue({ data: { height: 1000 } } as any); - const locksPage = lockSearchService.getWalletLocksPage( + const locksPage = await lockSearchService.getWalletLocksPage( { offset: 0, limit: 100 }, [{ property: "amount", direction: "asc" }], wallet1.getAddress(), @@ -135,13 +135,13 @@ describe("LockSearchService.getWalletLocksPage", () => { expect(locksPage.results[1].lockId).toBe(lockId2); }); - it("should return all wallet locks that match criteria", () => { + it("should return all wallet locks that match criteria", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("htlc.locks", { [lockId1]: lockAttribute1, [lockId2]: lockAttribute2 }); walletRepository.index(wallet1); stateStore.getLastBlock.mockReturnValue({ data: { height: 1000 } } as any); - const locksPage = lockSearchService.getWalletLocksPage( + const locksPage = await lockSearchService.getWalletLocksPage( { offset: 0, limit: 100 }, [{ property: "amount", direction: "asc" }], wallet1.getAddress(), @@ -152,7 +152,7 @@ describe("LockSearchService.getWalletLocksPage", () => { expect(locksPage.results[0].lockId).toBe(lockId1); }); - it("should return only wallet locks", () => { + it("should return only wallet locks", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("htlc.locks", { [lockId1]: lockAttribute1 }); walletRepository.index(wallet1); @@ -162,7 +162,7 @@ describe("LockSearchService.getWalletLocksPage", () => { walletRepository.index(wallet2); stateStore.getLastBlock.mockReturnValue({ data: { height: 1000 } } as any); - const locksPage = lockSearchService.getWalletLocksPage( + const locksPage = await lockSearchService.getWalletLocksPage( { offset: 0, limit: 100 }, [{ property: "amount", direction: "asc" }], wallet1.getAddress(), diff --git a/__tests__/integration/core-api/services/wallet-search-service.test.ts b/__tests__/integration/core-api/services/wallet-search-service.test.ts index c4e9660bd0..004655319b 100644 --- a/__tests__/integration/core-api/services/wallet-search-service.test.ts +++ b/__tests__/integration/core-api/services/wallet-search-service.test.ts @@ -68,7 +68,7 @@ describe("WalletSearchService.getWallet", () => { }); describe("WalletSearchService.getWalletsPage", () => { - it("should get first three wallets sorted by balance:desc", () => { + it("should get first three wallets sorted by balance:desc", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret1")); const wallet2 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret2")); const wallet3 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret3")); @@ -81,7 +81,7 @@ describe("WalletSearchService.getWalletsPage", () => { wallet4.setBalance(Utils.BigNumber.make("40")); wallet5.setBalance(Utils.BigNumber.make("50")); - const page = walletSearchService.getWalletsPage({ limit: 3, offset: 0 }, []); + const page = await walletSearchService.getWalletsPage({ limit: 3, offset: 0 }, []); expect(page.results.length).toBe(3); expect(page.results[0].address).toBe(wallet3.getAddress()); @@ -90,7 +90,7 @@ describe("WalletSearchService.getWalletsPage", () => { expect(page.totalCount).toBe(5); }); - it("should get last two wallets sorted by balance:desc", () => { + it("should get last two wallets sorted by balance:desc", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret1")); const wallet2 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret2")); const wallet3 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret3")); @@ -103,7 +103,7 @@ describe("WalletSearchService.getWalletsPage", () => { wallet4.setBalance(Utils.BigNumber.make("40")); wallet5.setBalance(Utils.BigNumber.make("50")); - const page = walletSearchService.getWalletsPage({ limit: 3, offset: 3 }, []); + const page = await walletSearchService.getWalletsPage({ limit: 3, offset: 3 }, []); expect(page.results.length).toBe(2); expect(page.results[0].address).toBe(wallet5.getAddress()); @@ -111,7 +111,7 @@ describe("WalletSearchService.getWalletsPage", () => { expect(page.totalCount).toBe(5); }); - it("should get only three wallets sorted by balance:desc", () => { + it("should get only three wallets sorted by balance:desc", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret1")); const wallet2 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret2")); const wallet3 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret3")); @@ -124,7 +124,9 @@ describe("WalletSearchService.getWalletsPage", () => { wallet4.setBalance(Utils.BigNumber.make("40")); wallet5.setBalance(Utils.BigNumber.make("50")); - const page = walletSearchService.getWalletsPage({ limit: 5, offset: 0 }, [], { balance: { from: "100" } }); + const page = await walletSearchService.getWalletsPage({ limit: 5, offset: 0 }, [], { + balance: { from: "100" }, + }); expect(page.results.length).toBe(3); expect(page.results[0].address).toBe(wallet3.getAddress()); @@ -135,7 +137,7 @@ describe("WalletSearchService.getWalletsPage", () => { }); describe("WalletSearchService.getActiveWalletsPage", () => { - it("should only get wallets with public keys", () => { + it("should only get wallets with public keys", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret1")); const wallet2 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("secret2")); const wallet3 = walletRepository.findByAddress(Identities.Address.fromPassphrase("secret3")); @@ -148,7 +150,7 @@ describe("WalletSearchService.getActiveWalletsPage", () => { wallet4.setBalance(Utils.BigNumber.make("400")); wallet5.setBalance(Utils.BigNumber.make("500")); - const page = walletSearchService.getActiveWalletsPage({ offset: 0, limit: 100 }, [ + const page = await walletSearchService.getActiveWalletsPage({ offset: 0, limit: 100 }, [ { property: "balance", direction: "asc" }, ]); diff --git a/__tests__/integration/core-magistrate-api/services/entity-search-service.test.ts b/__tests__/integration/core-magistrate-api/services/entity-search-service.test.ts index b69f8ee4b0..794d3cbc7a 100644 --- a/__tests__/integration/core-magistrate-api/services/entity-search-service.test.ts +++ b/__tests__/integration/core-magistrate-api/services/entity-search-service.test.ts @@ -1,11 +1,11 @@ -import { EntitySearchService, Identifiers as MagistrateApiIdentifiers } from "@arkecosystem/core-magistrate-api/src"; import { Container, Contracts } from "@arkecosystem/core-kernel"; - -import { setUp } from "./__support__/setup"; -import { setIndexes } from "../__support__/set-indexes"; +import { EntitySearchService, Identifiers as MagistrateApiIdentifiers } from "@arkecosystem/core-magistrate-api/src"; import { Enums } from "@arkecosystem/core-magistrate-crypto"; import { Identities } from "@arkecosystem/crypto"; +import { setIndexes } from "../__support__/set-indexes"; +import { setUp } from "./__support__/setup"; + const entityId1 = "2a2498072a798318f5e321b312dfc7dcb87f33e10a251baf07ed8f950bd499ec"; const entityAttribute1 = { type: Enums.EntityType.Business, @@ -56,7 +56,7 @@ describe("EntitySearchService.getEntity", () => { }); describe("EntitySearchService.getEntitiesPage", () => { - it("should return all entities", () => { + it("should return all entities", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("entities", { [entityId1]: entityAttribute1 }); setIndexes(walletRepository, wallet1); @@ -65,14 +65,14 @@ describe("EntitySearchService.getEntitiesPage", () => { wallet2.setAttribute("entities", { [entityId2]: entityAttribute2 }); setIndexes(walletRepository, wallet2); - const entitiesPage = entitySearchService.getEntitiesPage({ offset: 0, limit: 100 }, []); + const entitiesPage = await entitySearchService.getEntitiesPage({ offset: 0, limit: 100 }, []); expect(entitiesPage.totalCount).toBe(2); expect(entitiesPage.results[0].data.name).toBe("entity 1"); expect(entitiesPage.results[1].data.name).toBe("entity 2"); }); - it("should entities that match criteria", () => { + it("should entities that match criteria", async () => { const wallet1 = walletRepository.findByPublicKey(Identities.PublicKey.fromPassphrase("wallet1")); wallet1.setAttribute("entities", { [entityId1]: entityAttribute1 }); setIndexes(walletRepository, wallet1); @@ -81,7 +81,7 @@ describe("EntitySearchService.getEntitiesPage", () => { wallet2.setAttribute("entities", { [entityId2]: entityAttribute2 }); setIndexes(walletRepository, wallet2); - const entitiesPage = entitySearchService.getEntitiesPage({ offset: 0, limit: 100 }, [], { + const entitiesPage = await entitySearchService.getEntitiesPage({ offset: 0, limit: 100 }, [], { data: { name: "entity 1" }, }); diff --git a/__tests__/integration/core-state/__support__/setup.ts b/__tests__/integration/core-state/__support__/setup.ts index c448410035..144de24372 100644 --- a/__tests__/integration/core-state/__support__/setup.ts +++ b/__tests__/integration/core-state/__support__/setup.ts @@ -7,6 +7,7 @@ EventEmitter.prototype.constructor = Object.prototype.constructor; const sandbox: Sandbox = new Sandbox(); +const transactionPoolIndexRegistry = null; const transactionPoolQuery = null; const transactionPoolService = null; const peerNetworkMonitor = { @@ -45,6 +46,9 @@ export const setUp = async (): Promise => { }, }) .boot(async ({ app }) => { + app.bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry).toConstantValue( + transactionPoolIndexRegistry, + ); app.bind(Container.Identifiers.TransactionPoolQuery).toConstantValue(transactionPoolQuery); app.bind(Container.Identifiers.TransactionPoolService).toConstantValue(transactionPoolService); app.bind(Container.Identifiers.PeerNetworkMonitor).toConstantValue(peerNetworkMonitor); diff --git a/__tests__/integration/core-state/block-state/lock-then-claim.test.ts b/__tests__/integration/core-state/block-state/lock-then-claim.test.ts index 9c516b71ac..3ad592ee8c 100644 --- a/__tests__/integration/core-state/block-state/lock-then-claim.test.ts +++ b/__tests__/integration/core-state/block-state/lock-then-claim.test.ts @@ -33,8 +33,10 @@ test("BlockState handling [lock], [claim] blocks", async () => { "blockchain", ); - const transactionRepository = app.get( + const transactionRepository = app.getTagged( Container.Identifiers.DatabaseTransactionRepository, + "connection", + "default", ); const lockSecret = Buffer.from("a".repeat(32), "utf-8"); diff --git a/__tests__/integration/core-state/block-state/lock-then-refund.test.ts b/__tests__/integration/core-state/block-state/lock-then-refund.test.ts index c8a6c001ea..b466af13af 100644 --- a/__tests__/integration/core-state/block-state/lock-then-refund.test.ts +++ b/__tests__/integration/core-state/block-state/lock-then-refund.test.ts @@ -33,8 +33,10 @@ test("BlockState handling [lock], [claim] blocks", async () => { "blockchain", ); - const transactionRepository = app.get( + const transactionRepository = app.getTagged( Container.Identifiers.DatabaseTransactionRepository, + "connection", + "default", ); const lockSecret = Buffer.from("a".repeat(32), "utf-8"); diff --git a/__tests__/unit/core-api/__support__/app.ts b/__tests__/unit/core-api/__support__/app.ts index 8384fd56b8..5d463e4266 100644 --- a/__tests__/unit/core-api/__support__/app.ts +++ b/__tests__/unit/core-api/__support__/app.ts @@ -19,11 +19,12 @@ import { } from "@packages/core-state/src/wallets/indexers/indexers"; import { Mocks } from "@packages/core-test-framework"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; +import { MempoolIndexRegistry } from "@packages/core-transaction-pool/src/mempool-index-registry"; import { One, Two } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerProvider } from "@packages/core-transactions/src/handlers/handler-provider"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; -import { Identities, Utils } from "@packages/crypto"; import { ServiceProvider } from "@packages/core-transactions/src/service-provider"; +import { Identities, Utils } from "@packages/crypto"; export type PaginatedResponse = { totalCount: number; @@ -84,6 +85,11 @@ export const initApp = (): Application => { app.bind(Container.Identifiers.EventDispatcherService).toConstantValue({}); + app.bind(Container.Identifiers.TransactionSecondSignatureVerification).toConstantValue({}); + app.bind(Container.Identifiers.TransactionMultiSignatureVerification).toConstantValue({}); + + app.bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry).to(MempoolIndexRegistry).inSingletonScope(); + app.bind(Identifiers.TransactionHandler).to(One.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(Two.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(One.SecondSignatureRegistrationTransactionHandler); diff --git a/__tests__/unit/core-api/controllers/delegates.test.ts b/__tests__/unit/core-api/controllers/delegates.test.ts index fca2e28c13..c72b1023eb 100644 --- a/__tests__/unit/core-api/controllers/delegates.test.ts +++ b/__tests__/unit/core-api/controllers/delegates.test.ts @@ -97,16 +97,16 @@ const voterWalletResource: Resources.WalletResource = { describe("DelegatesController", () => { describe("Index", () => { - it("should get criteria from query and return delegates page from DelegateSearchService", () => { + it("should get criteria from query and return delegates page from DelegateSearchService", async () => { const delegatesPage: Contracts.Search.ResultsPage = { results: [delegateResource], totalCount: 1, meta: { totalCountIsEstimate: false }, }; - delegateSearchService.getDelegatesPage.mockReturnValueOnce(delegatesPage); + delegateSearchService.getDelegatesPage.mockResolvedValueOnce(delegatesPage); const delegatesController = container.resolve(DelegatesController); - const result = delegatesController.index({ + const result = await delegatesController.index({ query: { page: 1, limit: 100, @@ -174,7 +174,7 @@ describe("DelegatesController", () => { }); describe("Voters", () => { - it("should get delegate id from pathname and criteria from query and return voter wallets from WalletSearchService", () => { + it("should get delegate id from pathname and criteria from query and return voter wallets from WalletSearchService", async () => { walletSearchService.getWallet.mockReturnValueOnce(delegateWalletResource); delegateSearchService.getDelegate.mockReturnValueOnce(delegateResource); @@ -183,10 +183,10 @@ describe("DelegatesController", () => { totalCount: 1, meta: { totalCountIsEstimate: false }, }; - walletSearchService.getActiveWalletsPage.mockReturnValueOnce(voterWalletsPage); + walletSearchService.getActiveWalletsPage.mockResolvedValueOnce(voterWalletsPage); const delegatesController = container.resolve(DelegatesController); - const result = delegatesController.voters({ + const result = await delegatesController.voters({ params: { id: "biz_classic", }, @@ -211,11 +211,11 @@ describe("DelegatesController", () => { expect(result).toBe(voterWalletsPage); }); - it("should return 404 when wallet wasn't found", () => { + it("should return 404 when wallet wasn't found", async () => { walletSearchService.getWallet.mockReturnValueOnce(undefined); const delegatesController = container.resolve(DelegatesController); - const result = delegatesController.voters({ + const result = await delegatesController.voters({ params: { id: "non-existing-wallet-id", }, @@ -231,12 +231,12 @@ describe("DelegatesController", () => { expect(result).toBeInstanceOf(Boom); }); - it("should return 404 when wallet isn't delegate", () => { + it("should return 404 when wallet isn't delegate", async () => { walletSearchService.getWallet.mockReturnValueOnce(voterWalletResource); delegateSearchService.getDelegate.mockReturnValueOnce(undefined); const delegatesController = container.resolve(DelegatesController); - const result = delegatesController.voters({ + const result = await delegatesController.voters({ params: { id: "ATL9kyo71wjPPXqvGMUD89t5RazmQfQMc6", }, diff --git a/__tests__/unit/core-api/controllers/locks.test.ts b/__tests__/unit/core-api/controllers/locks.test.ts index e9805aaf3c..03ea93ef52 100644 --- a/__tests__/unit/core-api/controllers/locks.test.ts +++ b/__tests__/unit/core-api/controllers/locks.test.ts @@ -57,16 +57,16 @@ const lockResource1: Resources.LockResource = { describe("LocksController", () => { describe("Index", () => { - it("should get criteria from query and return locks page from LockSearchService", () => { + it("should get criteria from query and return locks page from LockSearchService", async () => { const locksPage: Contracts.Search.ResultsPage = { results: [lockResource1], totalCount: 1, meta: { totalCountIsEstimate: false }, }; - lockSearchService.getLocksPage.mockReturnValueOnce(locksPage); + lockSearchService.getLocksPage.mockResolvedValueOnce(locksPage); const locksController = container.resolve(LocksController); - const result = locksController.index({ + const result = await locksController.index({ query: { page: 1, limit: 100, diff --git a/__tests__/unit/core-api/controllers/transactions.test.ts b/__tests__/unit/core-api/controllers/transactions.test.ts index 28fdb9b533..62c0950e9a 100644 --- a/__tests__/unit/core-api/controllers/transactions.test.ts +++ b/__tests__/unit/core-api/controllers/transactions.test.ts @@ -1,8 +1,8 @@ import "jest-extended"; -import { Contracts } from "@packages/core-kernel"; import Hapi from "@hapi/hapi"; import { TransactionsController } from "@packages/core-api/src/controllers/transactions"; +import { Contracts } from "@packages/core-kernel"; import { Application, Utils } from "@packages/core-kernel"; import { Identifiers } from "@packages/core-kernel/src/ioc"; import { Transactions as MagistrateTransactions } from "@packages/core-magistrate-crypto"; @@ -11,9 +11,9 @@ import { Generators } from "@packages/core-test-framework/src"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Identities, Interfaces, Managers, Transactions } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { TransactionType } from "@packages/crypto/src/enums"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { initApp, ItemResponse, PaginatedResponse } from "../__support__"; diff --git a/__tests__/unit/core-api/controllers/votes.test.ts b/__tests__/unit/core-api/controllers/votes.test.ts index 1909f71101..5b01938a12 100644 --- a/__tests__/unit/core-api/controllers/votes.test.ts +++ b/__tests__/unit/core-api/controllers/votes.test.ts @@ -9,7 +9,7 @@ import { Mocks } from "@packages/core-test-framework"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Identities, Interfaces, Transactions } from "@packages/crypto"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { initApp, ItemResponse, PaginatedResponse } from "../__support__"; diff --git a/__tests__/unit/core-api/controllers/wallets.test.ts b/__tests__/unit/core-api/controllers/wallets.test.ts index a47c4d2ad2..2c54e14a60 100644 --- a/__tests__/unit/core-api/controllers/wallets.test.ts +++ b/__tests__/unit/core-api/controllers/wallets.test.ts @@ -83,16 +83,16 @@ const wallet1LockResource1: Resources.LockResource = { describe("WalletsController", () => { describe("Index", () => { - it("should get criteria from query and return wallets page from WalletSearchService", () => { + it("should get criteria from query and return wallets page from WalletSearchService", async () => { const walletsPage: Contracts.Search.ResultsPage = { results: [walletResource1], totalCount: 1, meta: { totalCountIsEstimate: false }, }; - walletSearchService.getWalletsPage.mockReturnValueOnce(walletsPage); + walletSearchService.getWalletsPage.mockResolvedValueOnce(walletsPage); const walletsController = container.resolve(WalletsController); - const result = walletsController.index({ + const result = await walletsController.index({ query: { page: 1, limit: 100, @@ -114,16 +114,16 @@ describe("WalletsController", () => { describe("Top", () => { // it is exact duplicate of WalletsController.index - it("should get criteria from query and return wallets page from WalletSearchService", () => { + it("should get criteria from query and return wallets page from WalletSearchService", async () => { const walletsPage: Contracts.Search.ResultsPage = { results: [walletResource1], totalCount: 1, meta: { totalCountIsEstimate: false }, }; - walletSearchService.getWalletsPage.mockReturnValueOnce(walletsPage); + walletSearchService.getWalletsPage.mockResolvedValueOnce(walletsPage); const walletsController = container.resolve(WalletsController); - const result = walletsController.top({ + const result = await walletsController.top({ query: { page: 1, limit: 100, @@ -173,7 +173,7 @@ describe("WalletsController", () => { }); describe("Locks", () => { - it("should get wallet id from pathname and criteria from query and return locks page from LockSearchService", () => { + it("should get wallet id from pathname and criteria from query and return locks page from LockSearchService", async () => { walletSearchService.getWallet.mockReturnValueOnce(walletResource1); const locksPage: Contracts.Search.ResultsPage = { @@ -181,10 +181,10 @@ describe("WalletsController", () => { totalCount: 1, meta: { totalCountIsEstimate: false }, }; - lockSearchService.getWalletLocksPage.mockReturnValueOnce(locksPage); + lockSearchService.getWalletLocksPage.mockResolvedValueOnce(locksPage); const walletsController = container.resolve(WalletsController); - const result = walletsController.locks({ + const result = await walletsController.locks({ params: { id: walletResource1.publicKey, }, @@ -208,11 +208,11 @@ describe("WalletsController", () => { expect(result).toBe(locksPage); }); - it("should return 404 when wallet wasn't found", () => { + it("should return 404 when wallet wasn't found", async () => { walletSearchService.getWallet.mockReturnValueOnce(undefined); const walletsController = container.resolve(WalletsController); - const result = walletsController.locks({ + const result = await walletsController.locks({ params: { id: "non-existing-wallet-id", }, diff --git a/__tests__/unit/core-api/plugins/log.test.ts b/__tests__/unit/core-api/plugins/log.test.ts new file mode 100644 index 0000000000..6eec6c3fa2 --- /dev/null +++ b/__tests__/unit/core-api/plugins/log.test.ts @@ -0,0 +1,59 @@ +import { log } from "@packages/core-api/src/plugins/log"; + +const logger = { + debug: jest.fn(), +}; + +const server = { + ext: jest.fn(), + app: { + app: { + get: jest.fn().mockReturnValue(logger), + }, + }, +}; + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe("Log", () => { + it("should register extension when enabled", () => { + log.register(server, { enabled: true, trustProxy: false }); + + expect(server.ext).toBeCalled(); + }); + + it("should not register extension when disabled", () => { + log.register(server, { enabled: false, trustProxy: false }); + + expect(server.ext).not.toBeCalled(); + }); + + it("should log request and continue", () => { + const request = { + path: "api/method", + url: { search: "?param=value" }, + info: { + remoteAddress: "127.0.0.1", + }, + }; + + const h = { + continue: Symbol, + }; + + log.register(server, { enabled: true, trustProxy: false }); + + expect(server.ext).toBeCalled(); + + const onRequest = server.ext.mock.calls[0][1]; + + const ret = onRequest(request, h); + + expect(ret).toBe(h.continue); + expect(logger.debug).toHaveBeenCalledWith( + `API request on: "${request.path}" from: "${request.info.remoteAddress}" with query: "${request.url.search}"`, + ); + }); +}); diff --git a/__tests__/unit/core-api/plugins/semaphore.test.ts b/__tests__/unit/core-api/plugins/semaphore.test.ts new file mode 100644 index 0000000000..f7e83003a8 --- /dev/null +++ b/__tests__/unit/core-api/plugins/semaphore.test.ts @@ -0,0 +1,392 @@ +import "jest-extended"; + +import { blockQueryLevelOptions, blockSortingSchema } from "@packages/core-api/src/resources-new"; +import * as Schemas from "@packages/core-api/src/schemas.ts"; +import { Application } from "@packages/core-kernel"; +import Joi from "joi"; + +import { initApp, initServer } from "../__support__"; + +let app: Application; + +beforeEach(() => { + app = initApp(); +}); + +describe("Semaphore", () => { + let defaults: any; + let customResponse: any; + let customRoute: any; + let injectOptions: any; + + let resolve: () => void; + let promise: Promise; + + beforeEach(() => { + defaults = { + plugins: { + pagination: { + limit: 100, + }, + socketTimeout: 5000, + semaphore: { + enabled: true, + database: { + levelOne: { + concurrency: 2, + queueLimit: 0, + maxOffset: 10_000, + }, + levelTwo: { + concurrency: 1, + queueLimit: 0, + }, + }, + memory: { + levelOne: { + concurrency: 2, + queueLimit: 0, + maxOffset: 100, + }, + levelTwo: { + concurrency: 3, + queueLimit: 0, + }, + }, + }, + }, + }; + + customResponse = { + results: [], + totalCount: 0, + meta: { totalCountIsEstimate: false }, + }; + + promise = new Promise((res) => { + resolve = res; + }); + + customRoute = { + method: "GET", + path: "/test", + handler: jest.fn().mockImplementation(async () => { + await promise; + return customResponse; + }), + options: { + validate: { + query: Joi.object({ + ...Schemas.blockCriteriaSchemas, + orderBy: Schemas.blocksOrderBy, + transform: Joi.bool().default(true), + }) + .concat(blockSortingSchema) + .concat(Schemas.pagination), + }, + plugins: { + pagination: { + enabled: true, + }, + semaphore: { + enabled: true, + queryLevelOptions: blockQueryLevelOptions, + }, + }, + }, + }; + + injectOptions = { + method: "GET", + url: "/test", + }; + }); + + it("should not use semaphore if semaphore plugin is not on route", async () => { + customRoute.options.plugins = {}; + + const server = await initServer(app, defaults, customRoute); + + const responses: Promise[] = [server.inject(injectOptions), server.inject(injectOptions)]; + + resolve(); + + for (let i = 0; i < 2; i++) { + expect((await responses[i]).statusCode).toBe(200); + } + expect(customRoute.handler).toHaveBeenCalledTimes(2); + }); + + it("should not use semaphore if not enabled", async () => { + customRoute.options.plugins.semaphore = { + ...customRoute.options.plugins.semaphore, + enabled: false, + }; + + const server = await initServer(app, defaults, customRoute); + + const responses: Promise[] = [server.inject(injectOptions), server.inject(injectOptions)]; + + resolve(); + + for (let i = 0; i < 2; i++) { + expect((await responses[i]).statusCode).toBe(200); + } + expect(customRoute.handler).toHaveBeenCalledTimes(2); + }); + + it("should not use semaphore if levelTwoFields fields are not in semaphore options", async () => { + customRoute.options.plugins.semaphore = {}; + + const server = await initServer(app, defaults, customRoute); + + const responses: Promise[] = [server.inject(injectOptions), server.inject(injectOptions)]; + + resolve(); + + for (let i = 0; i < 2; i++) { + expect((await responses[i]).statusCode).toBe(200); + } + expect(customRoute.handler).toHaveBeenCalledTimes(2); + }); + + const levelOneQueries = [ + "/test", // Default + "/test?timestamp=1", // Indexed field value + "/test?timestamp.from=1", // Indexed field from + "/test?timestamp.to=1", // Indexed field to + "/test?version=0", // Indexed field value + "/test?version=0,1,2", // Indexed field from + "/test?orderBy=version:asc", // Indexed field asc = true + "/test?orderBy=version:desc", // Indexed field desc = true + "/test?orderBy=timestamp:asc,version:asc", // allowSecondOrderBy = true + "/test?orderBy=payloadHash:asc&height=2", // Uses diverse index direct value + ]; + + const levelTwoOffsetQueries = [ + "/test?page=101&limit=100", // Offset is > 10_000 + "/test?offset=10001", // Offset is > 10_000 + ]; + + const levelTwoQueries = [ + "/test?payloadLength=1", // Non indexed field value + "/test?payloadLength.from=1", // Non indexed field from + "/test?payloadLength.to=1", // Non indexed field to + "/test?payloadHash=abc", // Non indexed field to + "/test?payloadHash=abc,def", // Non indexed field to + "/test?orderBy=id:asc", // Indexed field asc = false + "/test?orderBy=id:desc", // Indexed field desc = false + "/test?orderBy=payloadHash:asc", // Non indexed field orderBy asc + "/test?orderBy=payloadHash:desc", // Non indexed field orderBy desc, + "/test?orderBy=version:asc,timestamp:asc", // allowSecondOrderBy = false + "/test?orderBy=payloadHash:asc&height.from=2", // Uses diverse index indirect value + "/test?orderBy=payloadHash:asc&version=0", // Uses non-diverse index + ]; + + it.each(levelOneQueries)("should use level 1 semaphore", async (url) => { + const server = await initServer(app, defaults, customRoute); + + const customInjectOptions = { + ...injectOptions, + url: url, + }; + + const responses: Promise[] = [ + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + ]; + + resolve(); + + for (let i = 0; i < 2; i++) { + expect((await responses[i]).statusCode).toBe(200); + } + expect((await responses[2]).statusCode).toBe(429); + expect(customRoute.handler).toHaveBeenCalledTimes(2); + }); + + it.each([...levelTwoOffsetQueries, ...levelTwoQueries])("should use level 2 semaphore", async (url) => { + const server = await initServer(app, defaults, customRoute); + + const customInjectOptions = { + ...injectOptions, + url: url, + }; + + const responses: Promise[] = [server.inject(customInjectOptions), server.inject(customInjectOptions)]; + + resolve(); + + expect((await responses[0]).statusCode).toBe(200); + expect((await responses[1]).statusCode).toBe(429); + expect(customRoute.handler).toHaveBeenCalledTimes(1); + }); + + // Skip offsets + it.each(levelTwoQueries)("should use level 1 semaphore when queryLevelSchema is not defined", async (url) => { + customRoute = { + method: "GET", + path: "/test", + handler: jest.fn().mockImplementation(async () => { + await promise; + return customResponse; + }), + options: { + validate: { + query: Joi.object({ + ...Schemas.blockCriteriaSchemas, + orderBy: Schemas.blocksOrderBy, + transform: Joi.bool().default(true), + }) + .concat(blockSortingSchema) + .concat(Schemas.pagination), + }, + plugins: { + pagination: { + enabled: true, + }, + semaphore: { + enabled: true, + }, + }, + }, + }; + + const server = await initServer(app, defaults, customRoute); + + const customInjectOptions = { + ...injectOptions, + url: url, + }; + + const responses: Promise[] = [ + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + ]; + + resolve(); + + for (let i = 0; i < 2; i++) { + expect((await responses[i]).statusCode).toBe(200); + } + expect((await responses[2]).statusCode).toBe(429); + expect(customRoute.handler).toHaveBeenCalledTimes(2); + }); + + it("should use memory semaphore when type = memory", async () => { + customRoute = { + method: "GET", + path: "/test", + handler: jest.fn().mockImplementation(async () => { + await promise; + return customResponse; + }), + options: { + validate: { + query: Joi.object({ + ...Schemas.blockCriteriaSchemas, + orderBy: Schemas.blocksOrderBy, + transform: Joi.bool().default(true), + }) + .concat(blockSortingSchema) + .concat(Schemas.pagination), + }, + plugins: { + pagination: { + enabled: true, + }, + semaphore: { + enabled: true, + type: "memory", + }, + }, + }, + }; + + const server = await initServer(app, defaults, customRoute); + + const customInjectOptions = { + ...injectOptions, + url: "/test?page=10&limit=11", // Offset is > 100, + }; + + const responses: Promise[] = [ + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + ]; + + resolve(); + + expect((await responses[0]).statusCode).toBe(200); + expect((await responses[1]).statusCode).toBe(200); + expect((await responses[2]).statusCode).toBe(200); + expect((await responses[3]).statusCode).toBe(429); + expect(customRoute.handler).toHaveBeenCalledTimes(3); + }); + + it("should should respond with 429 when queue is full", async () => { + const server = await initServer( + app, + (defaults = { + plugins: { + pagination: { + limit: 100, + }, + socketTimeout: 5000, + semaphore: { + enabled: true, + database: { + levelOne: { + concurrency: 2, + queueLimit: 2, + maxOffset: 10_000, + }, + levelTwo: { + concurrency: 1, + queueLimit: 0, + }, + }, + memory: { + levelOne: { + concurrency: 2, + queueLimit: 2, + maxOffset: 100, + }, + levelTwo: { + concurrency: 1, + queueLimit: 0, + }, + }, + }, + }, + }), + customRoute, + ); + + const customInjectOptions = { + method: "GET", + url: "/test", + }; + + const responses: Promise[] = [ + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + server.inject(customInjectOptions), + ]; + + resolve(); + + // 2 x concurrent + 2x queue + for (let i = 0; i < 4; i++) { + expect((await responses[i]).statusCode).toBe(200); + } + expect((await responses[4]).statusCode).toBe(429); + expect(customRoute.handler).toHaveBeenCalledTimes(2); + }); +}); diff --git a/__tests__/unit/core-api/service-provider.test.ts b/__tests__/unit/core-api/service-provider.test.ts index 38ad03f46c..cbc347b366 100644 --- a/__tests__/unit/core-api/service-provider.test.ts +++ b/__tests__/unit/core-api/service-provider.test.ts @@ -188,10 +188,24 @@ describe("ServiceProvider", () => { expect(result.value.server.https.tls.key).toBeUndefined(); expect(result.value.server.https.tls.cert).toBeUndefined(); + expect(result.value.plugins.log.enabled).toBeFalse(); + expect(result.value.plugins.cache.enabled).toBeFalse(); expect(result.value.plugins.cache.stdTTL).toBeNumber(); expect(result.value.plugins.cache.checkperiod).toBeNumber(); + expect(result.value.plugins.semaphore.enabled).toBeTrue(); + expect(result.value.plugins.semaphore.database.levelOne.concurrency).toBeNumber(); + expect(result.value.plugins.semaphore.database.levelOne.queueLimit).toBeNumber(); + expect(result.value.plugins.semaphore.database.levelOne.maxOffset).toBeNumber(); + expect(result.value.plugins.semaphore.database.levelTwo.concurrency).toBeNumber(); + expect(result.value.plugins.semaphore.database.levelTwo.queueLimit).toBeNumber(); + expect(result.value.plugins.semaphore.memory.levelOne.concurrency).toBeNumber(); + expect(result.value.plugins.semaphore.memory.levelOne.queueLimit).toBeNumber(); + expect(result.value.plugins.semaphore.memory.levelOne.maxOffset).toBeNumber(); + expect(result.value.plugins.semaphore.memory.levelTwo.concurrency).toBeNumber(); + expect(result.value.plugins.semaphore.memory.levelTwo.queueLimit).toBeNumber(); + expect(result.value.plugins.rateLimit.enabled).toBeTrue(); expect(result.value.plugins.rateLimit.points).toBeNumber(); expect(result.value.plugins.rateLimit.duration).toBeNumber(); @@ -333,6 +347,30 @@ describe("ServiceProvider", () => { }); }); + describe("process.env.CORE_API_LOG", () => { + it("should return false if process.env.CORE_API_LOG is undefined", async () => { + jest.resetModules(); + const result = (coreApiServiceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-api/src/defaults")).defaults, + ); + + expect(result.error).toBeUndefined(); + expect(result.value.plugins.log.enabled).toEqual(false); + }); + + it("should return true if process.env.CORE_API_LOG is defined", async () => { + process.env.CORE_API_LOG = "true"; + + jest.resetModules(); + const result = (coreApiServiceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-api/src/defaults")).defaults, + ); + + expect(result.error).toBeUndefined(); + expect(result.value.plugins.log.enabled).toEqual(true); + }); + }); + describe("process.env.CORE_API_CACHE", () => { it("should return false if process.env.CORE_API_CACHE is undefined", async () => { jest.resetModules(); @@ -357,6 +395,30 @@ describe("ServiceProvider", () => { }); }); + describe("process.env.CORE_API_SEMAPHORE_DISABLED", () => { + it("should return true if process.env.CORE_API_SEMAPHORE_DISABLED is undefined", async () => { + jest.resetModules(); + const result = (coreApiServiceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-api/src/defaults")).defaults, + ); + + expect(result.error).toBeUndefined(); + expect(result.value.plugins.semaphore.enabled).toEqual(true); + }); + + it("should return false if process.env.CORE_API_SEMAPHORE_DISABLED is defined", async () => { + process.env.CORE_API_SEMAPHORE_DISABLED = "true"; + + jest.resetModules(); + const result = (coreApiServiceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-api/src/defaults")).defaults, + ); + + expect(result.error).toBeUndefined(); + expect(result.value.plugins.semaphore.enabled).toEqual(false); + }); + }); + describe("process.env.CORE_API_RATE_LIMIT_DISABLED", () => { it("should return true if process.env.CORE_API_RATE_LIMIT_DISABLED is undefined", async () => { jest.resetModules(); @@ -782,6 +844,368 @@ describe("ServiceProvider", () => { expect(result.error!.message).toEqual('"plugins.cache.checkperiod" is required'); }); + it("plugins.semaphore is required && is object", async () => { + defaults.plugins.semaphore = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore" must be of type object'); + + delete defaults.plugins.semaphore; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore" is required'); + }); + + it("plugins.semaphore.database is required && is object", async () => { + defaults.plugins.semaphore.database = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database" must be of type object'); + + delete defaults.plugins.semaphore.database; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database" is required'); + }); + + it("plugins.semaphore.database.levelOne is required && is object", async () => { + defaults.plugins.semaphore.database.levelOne = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelOne" must be of type object'); + + delete defaults.plugins.semaphore.database.levelOne; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelOne" is required'); + }); + + it("plugins.semaphore.database.levelOne.concurrency is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.database.levelOne.concurrency = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.concurrency" must be a number', + ); + + defaults.plugins.semaphore.database.levelOne.concurrency = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.concurrency" must be an integer', + ); + + defaults.plugins.semaphore.database.levelOne.concurrency = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.concurrency" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.database.levelOne.concurrency; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelOne.concurrency" is required'); + }); + + it("plugins.semaphore.database.levelOne.queueLimit is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.database.levelOne.queueLimit = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.queueLimit" must be a number', + ); + + defaults.plugins.semaphore.database.levelOne.queueLimit = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.queueLimit" must be an integer', + ); + + defaults.plugins.semaphore.database.levelOne.queueLimit = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.queueLimit" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.database.levelOne.queueLimit; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelOne.queueLimit" is required'); + }); + + it("plugins.semaphore.database.levelOne.maxOffset is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.database.levelOne.maxOffset = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.maxOffset" must be a number', + ); + + defaults.plugins.semaphore.database.levelOne.maxOffset = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.maxOffset" must be an integer', + ); + + defaults.plugins.semaphore.database.levelOne.maxOffset = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelOne.maxOffset" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.database.levelOne.maxOffset; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelOne.maxOffset" is required'); + }); + + it("plugins.semaphore.database.levelTwo is required && is object", async () => { + defaults.plugins.semaphore.database.levelTwo = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelTwo" must be of type object'); + + delete defaults.plugins.semaphore.database.levelTwo; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelTwo" is required'); + }); + + it("plugins.semaphore.database.levelTwo.concurrency is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.database.levelTwo.concurrency = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelTwo.concurrency" must be a number', + ); + + defaults.plugins.semaphore.database.levelTwo.concurrency = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelTwo.concurrency" must be an integer', + ); + + defaults.plugins.semaphore.database.levelTwo.concurrency = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelTwo.concurrency" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.database.levelTwo.concurrency; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelTwo.concurrency" is required'); + }); + + it("plugins.semaphore.database.levelTwo.queueLimit is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.database.levelTwo.queueLimit = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelTwo.queueLimit" must be a number', + ); + + defaults.plugins.semaphore.database.levelTwo.queueLimit = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelTwo.queueLimit" must be an integer', + ); + + defaults.plugins.semaphore.database.levelTwo.queueLimit = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.database.levelTwo.queueLimit" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.database.levelTwo.queueLimit; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.database.levelTwo.queueLimit" is required'); + }); + + it("plugins.semaphore.memory is required && is object", async () => { + defaults.plugins.semaphore.memory = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory" must be of type object'); + + delete defaults.plugins.semaphore.memory; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory" is required'); + }); + + it("plugins.semaphore.memory.levelOne is required && is object", async () => { + defaults.plugins.semaphore.memory.levelOne = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelOne" must be of type object'); + + delete defaults.plugins.semaphore.memory.levelOne; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelOne" is required'); + }); + + it("plugins.semaphore.memory.levelOne.concurrency is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.memory.levelOne.concurrency = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.concurrency" must be a number', + ); + + defaults.plugins.semaphore.memory.levelOne.concurrency = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.concurrency" must be an integer', + ); + + defaults.plugins.semaphore.memory.levelOne.concurrency = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.concurrency" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.memory.levelOne.concurrency; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelOne.concurrency" is required'); + }); + + it("plugins.semaphore.memory.levelOne.maxOffset is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.memory.levelOne.maxOffset = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelOne.maxOffset" must be a number'); + + defaults.plugins.semaphore.memory.levelOne.maxOffset = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.maxOffset" must be an integer', + ); + + defaults.plugins.semaphore.memory.levelOne.maxOffset = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.maxOffset" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.memory.levelOne.maxOffset; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelOne.maxOffset" is required'); + }); + + it("plugins.semaphore.memory.levelOne.queueLimit is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.memory.levelOne.queueLimit = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.queueLimit" must be a number', + ); + + defaults.plugins.semaphore.memory.levelOne.queueLimit = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.queueLimit" must be an integer', + ); + + defaults.plugins.semaphore.memory.levelOne.queueLimit = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelOne.queueLimit" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.memory.levelOne.queueLimit; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelOne.queueLimit" is required'); + }); + + it("plugins.semaphore.memory.levelTwo is required && is object", async () => { + defaults.plugins.semaphore.memory.levelTwo = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelTwo" must be of type object'); + + delete defaults.plugins.semaphore.memory.levelTwo; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelTwo" is required'); + }); + + it("plugins.semaphore.memory.levelTwo.concurrency is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.memory.levelTwo.concurrency = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelTwo.concurrency" must be a number', + ); + + defaults.plugins.semaphore.memory.levelTwo.concurrency = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelTwo.concurrency" must be an integer', + ); + + defaults.plugins.semaphore.memory.levelTwo.concurrency = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelTwo.concurrency" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.memory.levelTwo.concurrency; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelTwo.concurrency" is required'); + }); + + it("plugins.semaphore.memory.levelTwo.queueLimit is required && is integer && >= 0", async () => { + defaults.plugins.semaphore.memory.levelTwo.queueLimit = false; + let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelTwo.queueLimit" must be a number', + ); + + defaults.plugins.semaphore.memory.levelTwo.queueLimit = 1.12; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelTwo.queueLimit" must be an integer', + ); + + defaults.plugins.semaphore.memory.levelTwo.queueLimit = -1; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual( + '"plugins.semaphore.memory.levelTwo.queueLimit" must be greater than or equal to 0', + ); + + delete defaults.plugins.semaphore.memory.levelTwo.queueLimit; + result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"plugins.semaphore.memory.levelTwo.queueLimit" is required'); + }); + it("plugins.rateLimit is required && is object", async () => { defaults.plugins.rateLimit = false; let result = (coreApiServiceProvider.configSchema() as AnySchema).validate(defaults); diff --git a/__tests__/unit/core-api/services/delegate-search-service.test.ts b/__tests__/unit/core-api/services/delegate-search-service.test.ts index 8faaebb1ff..2c703d8bef 100644 --- a/__tests__/unit/core-api/services/delegate-search-service.test.ts +++ b/__tests__/unit/core-api/services/delegate-search-service.test.ts @@ -13,8 +13,17 @@ const standardCriteriaService = { testStandardCriterias: jest.fn(), }; +const stateStore = { + getLastBlock: jest.fn().mockReturnValue({ + data: { + height: 100, + }, + }), +}; + const container = new Container.Container(); container.bind(Container.Identifiers.WalletRepository).toConstantValue(walletRepository); +container.bind(Container.Identifiers.StateStore).toConstantValue(stateStore); container.bind(Container.Identifiers.StandardCriteriaService).toConstantValue(standardCriteriaService); container.bind(Container.Identifiers.PaginationService).to(Services.Search.PaginationService); @@ -22,7 +31,11 @@ const delegateSearchService = container.resolve(DelegateSearchService); let attributeMap; +let spyOnCalculateApproval; + beforeEach(() => { + spyOnCalculateApproval = jest.spyOn(AppUtils.delegateCalculator, "calculateApproval"); + const attributeSet = new Services.Attributes.AttributeSet(); attributeSet.set("delegate"); attributeSet.set("delegate.approval"); @@ -63,6 +76,8 @@ describe("DelegateSearchService", () => { expect(delegateSearchService.getDelegate("ANBkoGqWeTSiaEVgVzSKZd3jS7UWzv9PSo")).toEqual( Delegates.delegateResource, ); + + expect(spyOnCalculateApproval).toHaveBeenCalledWith(delegate, 100); }); it("should return delegate by wallet address with produced blocks", () => { @@ -88,6 +103,7 @@ describe("DelegateSearchService", () => { expect(delegateSearchService.getDelegate("ANBkoGqWeTSiaEVgVzSKZd3jS7UWzv9PSo")).toEqual( Delegates.delegateResourceWithLastBlock, ); + expect(spyOnCalculateApproval).toHaveBeenCalledWith(delegate, 100); }); it("should return undefined if walled is not delegate", () => { @@ -101,7 +117,7 @@ describe("DelegateSearchService", () => { }); describe("getDelegatesPage", () => { - it("should return results with delegate", () => { + it("should return results with delegate", async () => { const delegate = new Wallets.Wallet("ANBkoGqWeTSiaEVgVzSKZd3jS7UWzv9PSo", attributeMap); delegate.setPublicKey("03287bfebba4c7881a0509717e71b34b63f31e40021c321f89ae04f84be6d6ac37"); @@ -117,7 +133,7 @@ describe("DelegateSearchService", () => { walletRepository.allByUsername.mockReturnValue([delegate]); standardCriteriaService.testStandardCriterias.mockReturnValue(true); - const result = delegateSearchService.getDelegatesPage( + const result = await delegateSearchService.getDelegatesPage( { offset: 0, limit: 100, @@ -130,9 +146,10 @@ describe("DelegateSearchService", () => { expect(walletRepository.allByUsername).toHaveBeenCalled(); expect(standardCriteriaService.testStandardCriterias).toHaveBeenCalled(); + expect(spyOnCalculateApproval).toHaveBeenCalledWith(delegate, 100); }); - it("should return empty array if all tested criterias are false", () => { + it("should return empty array if all tested criterias are false", async () => { const delegate = new Wallets.Wallet("ANBkoGqWeTSiaEVgVzSKZd3jS7UWzv9PSo", attributeMap); delegate.setPublicKey("03287bfebba4c7881a0509717e71b34b63f31e40021c321f89ae04f84be6d6ac37"); @@ -148,7 +165,7 @@ describe("DelegateSearchService", () => { walletRepository.allByUsername.mockReturnValue([delegate]); standardCriteriaService.testStandardCriterias.mockReturnValue(false); - const result = delegateSearchService.getDelegatesPage( + const result = await delegateSearchService.getDelegatesPage( { offset: 0, limit: 100, diff --git a/__tests__/unit/core-api/services/lock-search-service.test.ts b/__tests__/unit/core-api/services/lock-search-service.test.ts index ad03ed24fd..784603171e 100644 --- a/__tests__/unit/core-api/services/lock-search-service.test.ts +++ b/__tests__/unit/core-api/services/lock-search-service.test.ts @@ -94,11 +94,11 @@ describe("LockSearchService", () => { }); }); - it("should check all locks in locks index", () => { + it("should check all locks in locks index", async () => { standardCriteriaService.testStandardCriterias.mockReturnValue(true); AppUtils.expirationCalculator.calculateLockExpirationStatus = jest.fn().mockReturnValue(false); - const result = lockSearchService.getLocksPage( + const result = await lockSearchService.getLocksPage( { offset: 0, limit: 100, @@ -110,11 +110,11 @@ describe("LockSearchService", () => { expect(result.results).toEqual([Locks.lockResource]); }); - it("should return empty array if all tested criterias are false", () => { + it("should return empty array if all tested criterias are false", async () => { standardCriteriaService.testStandardCriterias.mockReturnValue(false); AppUtils.expirationCalculator.calculateLockExpirationStatus = jest.fn().mockReturnValue(false); - const result = lockSearchService.getLocksPage( + const result = await lockSearchService.getLocksPage( { offset: 0, limit: 100, @@ -140,11 +140,11 @@ describe("LockSearchService", () => { walletRepository.findByAddress.mockReturnValue(walletWithLock); }); - it("should check and return all wallet locks", () => { + it("should check and return all wallet locks", async () => { standardCriteriaService.testStandardCriterias.mockReturnValue(true); AppUtils.expirationCalculator.calculateLockExpirationStatus = jest.fn().mockReturnValue(false); - const result = lockSearchService.getWalletLocksPage( + const result = await lockSearchService.getWalletLocksPage( { offset: 0, limit: 100, @@ -157,11 +157,11 @@ describe("LockSearchService", () => { expect(result.results).toEqual([Locks.lockResource]); }); - it("should return empty array if all tested criterias are false", () => { + it("should return empty array if all tested criterias are false", async () => { standardCriteriaService.testStandardCriterias.mockReturnValue(false); AppUtils.expirationCalculator.calculateLockExpirationStatus = jest.fn().mockReturnValue(false); - const result = lockSearchService.getWalletLocksPage( + const result = await lockSearchService.getWalletLocksPage( { offset: 0, limit: 100, diff --git a/__tests__/unit/core-api/services/wallet-search-service.test.ts b/__tests__/unit/core-api/services/wallet-search-service.test.ts index 4864f87f00..581f8e5188 100644 --- a/__tests__/unit/core-api/services/wallet-search-service.test.ts +++ b/__tests__/unit/core-api/services/wallet-search-service.test.ts @@ -135,11 +135,11 @@ describe("WalletSearchService", () => { }); describe("getWalletsPage", () => { - it("should return wallets page with wallet on positive criteria tests", () => { + it("should return wallets page with wallet on positive criteria tests", async () => { walletRepository.allByAddress.mockReturnValue([wallet]); standardCriteriaService.testStandardCriterias.mockReturnValue(true); - const result = walletSearchService.getWalletsPage( + const result = await walletSearchService.getWalletsPage( { offset: 0, limit: 100, @@ -151,11 +151,11 @@ describe("WalletSearchService", () => { expect(result.results).toEqual([walletResource]); }); - it("should return wallets page with empty array on negative criteria tests", () => { + it("should return wallets page with empty array on negative criteria tests", async () => { walletRepository.allByAddress.mockReturnValue([wallet]); standardCriteriaService.testStandardCriterias.mockReturnValue(false); - const result = walletSearchService.getWalletsPage( + const result = await walletSearchService.getWalletsPage( { offset: 0, limit: 100, @@ -169,11 +169,11 @@ describe("WalletSearchService", () => { }); describe("getActiveWalletsPage", () => { - it("should return wallets page with wallet on positive criteria tests", () => { + it("should return wallets page with wallet on positive criteria tests", async () => { walletRepository.allByPublicKey.mockReturnValue([wallet]); standardCriteriaService.testStandardCriterias.mockReturnValue(true); - const result = walletSearchService.getActiveWalletsPage( + const result = await walletSearchService.getActiveWalletsPage( { offset: 0, limit: 100, @@ -185,11 +185,11 @@ describe("WalletSearchService", () => { expect(result.results).toEqual([walletResource]); }); - it("should return wallets page with empty array on negative criteria tests", () => { + it("should return wallets page with empty array on negative criteria tests", async () => { walletRepository.allByPublicKey.mockReturnValue([wallet]); standardCriteriaService.testStandardCriterias.mockReturnValue(false); - const result = walletSearchService.getActiveWalletsPage( + const result = await walletSearchService.getActiveWalletsPage( { offset: 0, limit: 100, diff --git a/__tests__/unit/core-blockchain/blockchain.test.ts b/__tests__/unit/core-blockchain/blockchain.test.ts index dbc7d97331..7487682044 100644 --- a/__tests__/unit/core-blockchain/blockchain.test.ts +++ b/__tests__/unit/core-blockchain/blockchain.test.ts @@ -18,7 +18,9 @@ EventEmitter.prototype.constructor = Object.prototype.constructor; describe("Blockchain", () => { let sandbox: Sandbox; - const configuration: any = {}; + const configuration: any = { + getRequired: jest.fn(), + }; const logService: any = {}; const stateStore: any = {}; const databaseService: any = {}; @@ -59,11 +61,11 @@ describe("Blockchain", () => { .get(Container.Identifiers.TriggerService) .bind("getActiveDelegates", new GetActiveDelegatesAction(sandbox.app)); - sandbox.app - .bind(Identifiers.QueueFactory) - .toFactory((context: interfaces.Context) => async (name?: string): Promise => - sandbox.app.resolve(MemoryQueue).make(), - ); + sandbox.app.bind(Identifiers.QueueFactory).toFactory( + (context: interfaces.Context) => + async (name?: string): Promise => + sandbox.app.resolve(MemoryQueue).make(), + ); Managers.configManager.setFromPreset("testnet"); }); @@ -278,14 +280,18 @@ describe("Blockchain", () => { it("should set wakeUpTimeout on stateStore", () => { const blockchain = sandbox.app.resolve(Blockchain); + configuration.getRequired.mockReturnValueOnce(false); + blockchain.setWakeUp(); expect(stateStore.setWakeUpTimeout).toHaveBeenCalled(); }); - it("should dispatch WAKEUP when wake up function is called", () => { + it("should dispatch WAKEUP when wake up function is called after 60 second", () => { const blockchain = sandbox.app.resolve(Blockchain); const spyDispatch = jest.spyOn(blockchain, "dispatch"); + configuration.getRequired.mockReturnValueOnce(false); + blockchain.setWakeUp(); expect(spyDispatch).toBeCalledTimes(0); @@ -297,6 +303,24 @@ describe("Blockchain", () => { expect(spyDispatch).toBeCalledTimes(1); expect(spyDispatch).toBeCalledWith("WAKEUP"); }); + + it("should dispatch WAKEUP when wake up function is called after 8 second, when fastSync === true", () => { + const blockchain = sandbox.app.resolve(Blockchain); + const spyDispatch = jest.spyOn(blockchain, "dispatch"); + + configuration.getRequired.mockReturnValueOnce(true); + + blockchain.setWakeUp(); + expect(spyDispatch).toBeCalledTimes(0); + + expect(stateStore.setWakeUpTimeout).toHaveBeenCalledWith(expect.toBeFunction(), 8000); + + // Call given callback function + stateStore.setWakeUpTimeout.mock.calls[0][0](); + + expect(spyDispatch).toBeCalledTimes(1); + expect(spyDispatch).toBeCalledWith("WAKEUP"); + }); }); describe("resetWakeUp", () => { @@ -829,12 +853,24 @@ describe("Blockchain", () => { it("should return false if last block is more than 3 blocktimes away from current slot time", () => { const blockchain = sandbox.app.resolve(Blockchain); + configuration.getRequired.mockReturnValueOnce(false); peerRepository.hasPeers = jest.fn().mockReturnValue(true); const mockBlock = { data: { id: "123", height: 444, timestamp: Crypto.Slots.getTime() - 25 } }; stateStore.getLastBlock = jest.fn().mockReturnValue(mockBlock); expect(blockchain.isSynced()).toBeFalse(); }); + + it("should return false if last block is more than 1 blocktimes away from current slot time and fastSync === true", () => { + const blockchain = sandbox.app.resolve(Blockchain); + + configuration.getRequired.mockReturnValueOnce(true); + peerRepository.hasPeers = jest.fn().mockReturnValue(true); + const mockBlock = { data: { id: "123", height: 444, timestamp: Crypto.Slots.getTime() - 8 } }; + stateStore.getLastBlock = jest.fn().mockReturnValue(mockBlock); + + expect(blockchain.isSynced()).toBeFalse(); + }); }); describe("getLastBlock", () => { diff --git a/__tests__/unit/core-blockchain/process-blocks-job.test.ts b/__tests__/unit/core-blockchain/process-blocks-job.test.ts index 915559e563..0004ae7b1d 100644 --- a/__tests__/unit/core-blockchain/process-blocks-job.test.ts +++ b/__tests__/unit/core-blockchain/process-blocks-job.test.ts @@ -16,6 +16,10 @@ describe("Blockchain", () => { getState: jest.fn(), }; const blockProcessor: any = {}; + const transactionPool: any = { + applyBlock: jest.fn(), + cleanUp: jest.fn(), + }; const stateStore: any = {}; const databaseService: any = {}; const databaseBlockRepository: any = {}; @@ -40,6 +44,7 @@ describe("Blockchain", () => { sandbox.app.bind(Container.Identifiers.DatabaseInteraction).toConstantValue(databaseInteraction); sandbox.app.bind(Container.Identifiers.PeerNetworkMonitor).toConstantValue(peerNetworkMonitor); sandbox.app.bind(Container.Identifiers.LogService).toConstantValue(logService); + sandbox.app.bind(Container.Identifiers.TransactionPoolService).toConstantValue(transactionPool); sandbox.app.bind(Container.Identifiers.TriggerService).to(Services.Triggers.Triggers).inSingletonScope(); sandbox.app @@ -92,6 +97,8 @@ describe("Blockchain", () => { expect(databaseBlockRepository.saveBlocks).toHaveBeenCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).toHaveBeenCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).toHaveBeenCalledWith(currentBlock.height); + expect(transactionPool.applyBlock).toHaveBeenCalledTimes(1); + expect(transactionPool.cleanUp).toHaveBeenCalledTimes(1); }); it("should process a valid block already known", async () => { @@ -104,6 +111,8 @@ describe("Blockchain", () => { expect(blockchainService.clearQueue).toBeCalledTimes(1); expect(blockchainService.resetLastDownloadedBlock).toBeCalledTimes(1); + expect(transactionPool.applyBlock).not.toBeCalled(); + expect(transactionPool.cleanUp).not.toBeCalled(); }); it("should not process the remaining blocks if one is not accepted (BlockProcessorResult.Rollback)", async () => { @@ -117,6 +126,8 @@ describe("Blockchain", () => { expect(blockProcessor.process).toBeCalledTimes(1); // only 1 out of the 2 blocks expect(blockchainService.forkBlock).toBeCalledTimes(1); // because Rollback + expect(transactionPool.applyBlock).not.toBeCalled(); + expect(transactionPool.cleanUp).not.toBeCalled(); }); it("should not process the remaining blocks if one is not accepted (BlockProcessorResult.Rejected)", async () => { @@ -136,6 +147,8 @@ describe("Blockchain", () => { expect(blockProcessor.process).toBeCalledTimes(1); expect(blockchainService.clearQueue).toBeCalledTimes(1); expect(blockchainService.resetLastDownloadedBlock).toBeCalledTimes(1); + expect(transactionPool.applyBlock).not.toBeCalled(); + expect(transactionPool.cleanUp).not.toBeCalled(); }); it("should not process the remaining blocks if second is not accepted (BlockProcessorResult.Rejected)", async () => { @@ -168,6 +181,8 @@ describe("Blockchain", () => { expect(blockchainService.resetLastDownloadedBlock).toBeCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).toBeCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).toHaveBeenCalledWith(lastBlock.height); + expect(transactionPool.applyBlock).toBeCalledTimes(1); + expect(transactionPool.cleanUp).toBeCalledTimes(1); }); it("should not process the remaining blocks if one is not accepted (BlockProcessorResult.Corrupted)", async () => { @@ -190,6 +205,8 @@ describe("Blockchain", () => { expect(blockProcessor.process).toBeCalledTimes(1); expect(blockchainService.clearQueue).not.toBeCalled(); expect(blockchainService.resetLastDownloadedBlock).not.toBeCalled(); + expect(transactionPool.applyBlock).not.toBeCalled(); + expect(transactionPool.cleanUp).not.toBeCalled(); expect(process.exit).toHaveBeenCalled(); }); @@ -220,6 +237,8 @@ describe("Blockchain", () => { expect(databaseInteraction.restoreCurrentRound).toBeCalledTimes(1); expect(databaseService.deleteRound).toBeCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).not.toBeCalled(); + expect(transactionPool.applyBlock).not.toBeCalled(); + expect(transactionPool.cleanUp).not.toBeCalled(); }); it("should stop app when revertBlockHandler return Corrupted", async () => { @@ -251,6 +270,8 @@ describe("Blockchain", () => { expect(databaseInteraction.restoreCurrentRound).toBeCalledTimes(1); expect(databaseService.deleteRound).toBeCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).not.toHaveBeenCalled(); + expect(transactionPool.applyBlock).not.toBeCalled(); + expect(transactionPool.cleanUp).not.toBeCalled(); expect(process.exit).toHaveBeenCalled(); }); @@ -296,6 +317,8 @@ describe("Blockchain", () => { expect(stateStore.setLastStoredBlockHeight).toBeCalledWith(block.height); expect(peerNetworkMonitor.broadcastBlock).toBeCalledTimes(1); + expect(transactionPool.applyBlock).toBeCalledTimes(1); + expect(transactionPool.cleanUp).toBeCalledTimes(1); }); it("should skip broadcasting if state is downloadFinished", async () => { @@ -337,6 +360,8 @@ describe("Blockchain", () => { expect(databaseBlockRepository.saveBlocks).toBeCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).toBeCalledTimes(1); expect(stateStore.setLastStoredBlockHeight).toBeCalledWith(block.height); + expect(transactionPool.applyBlock).toBeCalledTimes(1); + expect(transactionPool.cleanUp).toBeCalledTimes(1); expect(peerNetworkMonitor.broadcastBlock).toBeCalledTimes(0); }); diff --git a/__tests__/unit/core-blockchain/processor/block-processor.test.ts b/__tests__/unit/core-blockchain/processor/block-processor.test.ts index af32ec0a51..77ba2863a5 100644 --- a/__tests__/unit/core-blockchain/processor/block-processor.test.ts +++ b/__tests__/unit/core-blockchain/processor/block-processor.test.ts @@ -33,6 +33,7 @@ describe("BlockProcessor", () => { const walletRepository = { findByPublicKey: jest.fn(), + hasByPublicKey: jest.fn(), getNonce: jest.fn(), }; const transactionHandlerRegistry = { @@ -310,6 +311,8 @@ describe("BlockProcessor", () => { const generatorWallet = { getAttribute: jest.fn().mockReturnValue("generatorusername"), }; + + walletRepository.hasByPublicKey = jest.fn().mockReturnValue(true); walletRepository.findByPublicKey = jest .fn() .mockReturnValueOnce(generatorWallet) @@ -331,6 +334,30 @@ describe("BlockProcessor", () => { await expect(blockProcessor.process(block)).toResolve(); expect(InvalidGeneratorHandler.prototype.execute).toBeCalledTimes(1); + expect(walletRepository.hasByPublicKey).toHaveBeenCalledWith(block.data.generatorPublicKey); + expect(walletRepository.findByPublicKey).toHaveBeenCalledWith(block.data.generatorPublicKey); + expect(walletRepository.findByPublicKey).toHaveBeenCalledTimes(2); + expect(generatorWallet.getAttribute).toHaveBeenCalledTimes(2); + }); + + it("should execute InvalidGeneratorHandler when wallet doesn't exists", async () => { + const block = { + ...chainedBlock, + }; + blockchain.getLastBlock = jest.fn().mockReturnValueOnce(baseBlock); + const generatorWallet = { + getAttribute: jest.fn().mockReturnValue("generatorusername"), + }; + walletRepository.hasByPublicKey = jest.fn().mockReturnValue(false); + walletRepository.findByPublicKey = jest.fn().mockReturnValueOnce(generatorWallet); + + const blockProcessor = sandbox.app.resolve(BlockProcessor); + + await expect(blockProcessor.process(block)).toResolve(); + + expect(InvalidGeneratorHandler.prototype.execute).toBeCalledTimes(1); + expect(walletRepository.hasByPublicKey).toHaveBeenCalledWith(block.data.generatorPublicKey); + expect(walletRepository.findByPublicKey).not.toBeCalled(); }); it("should execute InvalidGeneratorHandler when generatorWallet.getAttribute() throws", async () => { @@ -343,6 +370,7 @@ describe("BlockProcessor", () => { throw new Error("oops"); }), }; + walletRepository.hasByPublicKey = jest.fn().mockReturnValue(true); walletRepository.findByPublicKey = jest .fn() .mockReturnValueOnce(generatorWallet) @@ -358,6 +386,10 @@ describe("BlockProcessor", () => { await blockProcessor.process(block); expect(InvalidGeneratorHandler.prototype.execute).toBeCalledTimes(1); + + expect(walletRepository.hasByPublicKey).toHaveBeenCalledWith(block.data.generatorPublicKey); + expect(walletRepository.findByPublicKey).toHaveBeenCalledWith(block.data.generatorPublicKey); + expect(generatorWallet.getAttribute).toHaveBeenCalledTimes(1); }); }); @@ -379,6 +411,7 @@ describe("BlockProcessor", () => { const generatorWallet = { getAttribute: jest.fn().mockReturnValue("generatorusername"), }; + walletRepository.hasByPublicKey = jest.fn().mockReturnValue(true); walletRepository.findByPublicKey = jest.fn().mockReturnValueOnce(generatorWallet); stateStore.getLastBlock.mockReturnValueOnce(baseBlock); stateStore.getLastStoredBlockHeight.mockReturnValueOnce(baseBlock.data.height); @@ -415,6 +448,7 @@ describe("BlockProcessor", () => { const generatorWallet = { getAttribute: jest.fn().mockReturnValue("generatorusername"), }; + walletRepository.hasByPublicKey = jest.fn().mockReturnValue(true); walletRepository.findByPublicKey = jest.fn().mockReturnValueOnce(generatorWallet); stateStore.getLastBlock.mockReturnValueOnce({ data: { height: 2 } }); stateStore.getLastBlocks.mockReturnValueOnce([ @@ -439,6 +473,7 @@ describe("BlockProcessor", () => { const generatorWallet = { getAttribute: jest.fn().mockReturnValue("generatorusername"), }; + walletRepository.hasByPublicKey = jest.fn().mockReturnValue(true); walletRepository.findByPublicKey = jest.fn().mockReturnValueOnce(generatorWallet); const blockProcessor = sandbox.app.resolve(BlockProcessor); diff --git a/__tests__/unit/core-blockchain/processor/handlers/accept-block-handler.test.ts b/__tests__/unit/core-blockchain/processor/handlers/accept-block-handler.test.ts index 46f440300b..edcce12830 100644 --- a/__tests__/unit/core-blockchain/processor/handlers/accept-block-handler.test.ts +++ b/__tests__/unit/core-blockchain/processor/handlers/accept-block-handler.test.ts @@ -18,7 +18,6 @@ describe("AcceptBlockHandler", () => { setForkedBlock: jest.fn(), clearForkedBlock: jest.fn(), }; - const transactionPool = { removeForgedTransaction: jest.fn() }; const databaseInteractions = { walletRepository: { getNonce: jest.fn(), @@ -43,7 +42,6 @@ describe("AcceptBlockHandler", () => { container.bind(Container.Identifiers.BlockchainService).toConstantValue(blockchain); container.bind(Container.Identifiers.StateStore).toConstantValue(state); container.bind(Container.Identifiers.DatabaseInteraction).toConstantValue(databaseInteractions); - container.bind(Container.Identifiers.TransactionPoolService).toConstantValue(transactionPool); }); beforeEach(() => { @@ -68,10 +66,6 @@ describe("AcceptBlockHandler", () => { expect(databaseInteractions.applyBlock).toHaveBeenCalledWith(block); expect(blockchain.resetWakeUp).toBeCalledTimes(1); - - expect(transactionPool.removeForgedTransaction).toBeCalledTimes(2); - expect(transactionPool.removeForgedTransaction).toHaveBeenCalledWith(block.transactions[0]); - expect(transactionPool.removeForgedTransaction).toHaveBeenCalledWith(block.transactions[1]); }); it("should clear forkedBlock if incoming block has same height", async () => { diff --git a/__tests__/unit/core-blockchain/processor/handlers/revert-block-handler.test.ts b/__tests__/unit/core-blockchain/processor/handlers/revert-block-handler.test.ts index da86ad6c18..8fbb78700f 100644 --- a/__tests__/unit/core-blockchain/processor/handlers/revert-block-handler.test.ts +++ b/__tests__/unit/core-blockchain/processor/handlers/revert-block-handler.test.ts @@ -11,7 +11,6 @@ describe("AcceptBlockHandler", () => { getLastBlocks: jest.fn(), setLastBlock: jest.fn(), }; - const transactionPool = { addTransaction: jest.fn() }; const databaseInteractions = { revertBlock: jest.fn(), }; @@ -25,7 +24,6 @@ describe("AcceptBlockHandler", () => { container.bind(Container.Identifiers.StateStore).toConstantValue(state); container.bind(Container.Identifiers.DatabaseInteraction).toConstantValue(databaseInteractions); container.bind(Container.Identifiers.DatabaseService).toConstantValue(databaseService); - container.bind(Container.Identifiers.TransactionPoolService).toConstantValue(transactionPool); }); beforeEach(() => { @@ -59,10 +57,6 @@ describe("AcceptBlockHandler", () => { expect(databaseInteractions.revertBlock).toBeCalledTimes(1); expect(databaseInteractions.revertBlock).toHaveBeenCalledWith(block); - expect(transactionPool.addTransaction).toBeCalledTimes(2); - expect(transactionPool.addTransaction).toHaveBeenCalledWith(block.transactions[0]); - expect(transactionPool.addTransaction).toHaveBeenCalledWith(block.transactions[1]); - expect(databaseService.getLastBlock).not.toHaveBeenCalled(); expect(state.setLastBlock).toHaveBeenCalledWith(previousBlock); }); @@ -80,10 +74,6 @@ describe("AcceptBlockHandler", () => { expect(databaseInteractions.revertBlock).toBeCalledTimes(1); expect(databaseInteractions.revertBlock).toHaveBeenCalledWith(block); - expect(transactionPool.addTransaction).toBeCalledTimes(2); - expect(transactionPool.addTransaction).toHaveBeenCalledWith(block.transactions[0]); - expect(transactionPool.addTransaction).toHaveBeenCalledWith(block.transactions[1]); - expect(databaseService.getLastBlock).toHaveBeenCalledTimes(1); expect(state.setLastBlock).toHaveBeenCalledWith(previousBlock); }); @@ -114,10 +104,6 @@ describe("AcceptBlockHandler", () => { expect(databaseInteractions.revertBlock).toBeCalledTimes(1); expect(databaseInteractions.revertBlock).toHaveBeenCalledWith(block); - expect(transactionPool.addTransaction).toBeCalledTimes(2); - expect(transactionPool.addTransaction).toHaveBeenCalledWith(block.transactions[0]); - expect(transactionPool.addTransaction).toHaveBeenCalledWith(block.transactions[1]); - expect(databaseService.getLastBlock).toHaveBeenCalledTimes(1); expect(state.setLastBlock).not.toHaveBeenCalled(); }); diff --git a/__tests__/unit/core-cli/commands/discover-plugins.test.ts b/__tests__/unit/core-cli/commands/discover-plugins.test.ts deleted file mode 100644 index d62edfa7fe..0000000000 --- a/__tests__/unit/core-cli/commands/discover-plugins.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Console } from "@arkecosystem/core-test-framework"; -import { DiscoverPlugins } from "@packages/core-cli/src/commands"; -import { join } from "path"; -import { setGracefulCleanup } from "tmp"; - -let cli; -let cmd; - -beforeAll(() => setGracefulCleanup()); - -beforeEach(() => { - cli = new Console(); - - cmd = cli.app.resolve(DiscoverPlugins); -}); - -describe("DiscoverPlugins", () => { - describe("discover", () => { - it("should discover packages containing package.json", async () => { - const pluginsPath: string = join(__dirname, "./plugins"); - - const plugins = await cmd.discover(pluginsPath); - - expect(plugins).toEqual([ - { - name: "@namespace/package2", - path: join(pluginsPath, "/namespace/package2"), - version: "2.0.0", - }, - { - name: "package1", - path: join(pluginsPath, "/package1"), - version: "1.0.0", - }, - ]); - }); - - it("should return empty array if path doesn't exist", async () => { - const plugins = await cmd.discover("invalid/path"); - - expect(plugins).toEqual([]); - }) - }); -}); diff --git a/__tests__/unit/core-cli/services/installer.test.ts b/__tests__/unit/core-cli/services/installer.test.ts index 71d8832bde..f8669b3d99 100644 --- a/__tests__/unit/core-cli/services/installer.test.ts +++ b/__tests__/unit/core-cli/services/installer.test.ts @@ -31,6 +31,10 @@ describe("Installer.install", () => { installer.install("@arkecosystem/core"); + expect(spySync).toHaveBeenCalledWith( + 'rm -f "`yarn global dir`"/node_modules/better-sqlite3/build/Release/better_sqlite3.node', + { shell: true }, + ); expect(spySync).toHaveBeenCalledWith("yarn global add @arkecosystem/core@latest --force", { shell: true }); }); @@ -44,6 +48,10 @@ describe("Installer.install", () => { installer.install("@arkecosystem/core", "3.0.0"); + expect(spySync).toHaveBeenCalledWith( + 'rm -f "`yarn global dir`"/node_modules/better-sqlite3/build/Release/better_sqlite3.node', + { shell: true }, + ); expect(spySync).toHaveBeenCalledWith("yarn global add @arkecosystem/core@3.0.0 --force", { shell: true }); }); @@ -57,6 +65,10 @@ describe("Installer.install", () => { expect(() => installer.install("@arkecosystem/core")).toThrow("stderr"); + expect(spySync).toHaveBeenCalledWith( + 'rm -f "`yarn global dir`"/node_modules/better-sqlite3/build/Release/better_sqlite3.node', + { shell: true }, + ); expect(spySync).toHaveBeenCalledWith("yarn global add @arkecosystem/core@latest --force", { shell: true }); }); }); diff --git a/__tests__/unit/core-cli/services/plugin-manager.test.ts b/__tests__/unit/core-cli/services/plugin-manager.test.ts new file mode 100644 index 0000000000..7996018740 --- /dev/null +++ b/__tests__/unit/core-cli/services/plugin-manager.test.ts @@ -0,0 +1,154 @@ +import { Console } from "@arkecosystem/core-test-framework"; +import { PluginManager } from "@packages/core-cli/src/services"; +import fs from "fs-extra"; +import { join } from "path"; +import { setGracefulCleanup } from "tmp"; + +const token = "ark"; +const network = "testnet"; +const packageName = "dummyPackageName"; +const install = jest.fn(); +const exists = jest.fn().mockReturnValue(false); + +let npmUpdateCalled = false; +let gitUpdateCalled = false; +const updateNPM = () => (npmUpdateCalled = true); +const updateGIT = () => (gitUpdateCalled = true); + +jest.mock("@packages/core-cli/src/services/source-providers/npm", () => ({ + NPM: jest.fn().mockImplementation(() => ({ + exists, + install, + update: updateNPM, + })), +})); + +jest.mock("@packages/core-cli/src/services/source-providers/git", () => ({ + Git: jest.fn().mockImplementation(() => ({ + exists, + install, + update: updateGIT, + })), +})); + +jest.mock("@packages/core-cli/src/services/source-providers/file", () => ({ + File: jest.fn().mockImplementation(() => ({ + exists, + install, + })), +})); + +let cli; +let pluginManager; + +beforeAll(() => setGracefulCleanup()); + +beforeEach(() => { + gitUpdateCalled = false; + npmUpdateCalled = false; + + cli = new Console(); + + pluginManager = cli.app.resolve(PluginManager); +}); + +describe("DiscoverPlugins", () => { + describe("discover", () => { + it("should discover packages containing package.json", async () => { + const pluginsPath: string = join(__dirname, "./plugins"); + + jest.spyOn(pluginManager, "getPluginsPath").mockReturnValue(pluginsPath); + + const plugins = await pluginManager.list(token, network); + + expect(plugins).toEqual([ + { + name: "@namespace/package2", + path: join(pluginsPath, "/@namespace/package2"), + version: "2.0.0", + }, + { + name: "package1", + path: join(pluginsPath, "/package1"), + version: "1.0.0", + }, + ]); + }); + + it("should return empty array if path doesn't exist", async () => { + const plugins = await pluginManager.list(token, "undefined"); + + expect(plugins).toEqual([]); + }); + }); + + describe("install", () => { + it("should throw an error when package doesn't exist", async () => { + const errorMessage = `The given package [${packageName}] is neither a git nor a npm package.`; + await expect(pluginManager.install(token, network, packageName)).rejects.toThrow(errorMessage); + + expect(exists).toHaveBeenCalledWith(packageName, undefined); + expect(install).not.toHaveBeenCalled(); + }); + + it("should call install on existing packages", async () => { + exists.mockReturnValue(true); + + await expect(pluginManager.install(token, network, packageName)).toResolve(); + + expect(exists).toHaveBeenCalledWith(packageName, undefined); + expect(install).toHaveBeenCalledWith(packageName, undefined); + }); + + it("should call install on existing packages with version", async () => { + exists.mockReturnValue(true); + + const version = "3.0.0"; + await expect(pluginManager.install(token, network, packageName, version)).toResolve(); + + expect(exists).toHaveBeenCalledWith(packageName, version); + expect(install).toHaveBeenCalledWith(packageName, version); + }); + }); + + describe("update", () => { + it("should throw when the plugin doesn't exist", async () => { + await expect(pluginManager.update(token, network, packageName)).rejects.toThrow( + `The package [${packageName}] does not exist.`, + ); + }); + + it("if the plugin is a git directory, it should be updated", async () => { + expect(gitUpdateCalled).toEqual(false); + + jest.spyOn(fs, "existsSync").mockReturnValueOnce(true).mockReturnValueOnce(true); + + await expect(pluginManager.update(token, network, packageName)).toResolve(); + expect(gitUpdateCalled).toEqual(true); + }); + + it("if the plugin is a NPM package, it should be updated on default path", async () => { + expect(npmUpdateCalled).toEqual(false); + jest.spyOn(fs, "existsSync").mockReturnValueOnce(true).mockReturnValueOnce(false); + + await expect(pluginManager.update(token, network, packageName)).toResolve(); + expect(npmUpdateCalled).toEqual(true); + }); + }); + + describe("remove", () => { + it("should throw when the plugin doesn't exist", async () => { + await expect(pluginManager.remove(token, network, packageName)).rejects.toThrow( + `The package [${packageName}] does not exist.`, + ); + }); + + it("remove plugin if exist", async () => { + jest.spyOn(fs, "existsSync").mockReturnValue(true); + const removeSync = jest.spyOn(fs, "removeSync"); + + await expect(pluginManager.remove(token, network, packageName)).toResolve(); + expect(removeSync).toHaveBeenCalled(); + }); + }); +}); diff --git a/__tests__/unit/core-cli/commands/plugins/namespace/package2/package.json b/__tests__/unit/core-cli/services/plugins/@namespace/package2/package.json similarity index 100% rename from __tests__/unit/core-cli/commands/plugins/namespace/package2/package.json rename to __tests__/unit/core-cli/services/plugins/@namespace/package2/package.json diff --git a/__tests__/unit/core-cli/commands/plugins/package1/package.json b/__tests__/unit/core-cli/services/plugins/package1/package.json similarity index 100% rename from __tests__/unit/core-cli/commands/plugins/package1/package.json rename to __tests__/unit/core-cli/services/plugins/package1/package.json diff --git a/__tests__/unit/core-cli/services/process-manager.test.ts b/__tests__/unit/core-cli/services/process-manager.test.ts index c2b4aa0357..b913abc0b6 100644 --- a/__tests__/unit/core-cli/services/process-manager.test.ts +++ b/__tests__/unit/core-cli/services/process-manager.test.ts @@ -26,7 +26,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const processes: Contracts.ProcessDescription[] | undefined = processManager.list(); @@ -43,7 +43,7 @@ describe("ProcessManager", () => { stdout: "\n", stderr: undefined, failed: false, - }); + } as any); // Act... const processes: Contracts.ProcessDescription[] | undefined = processManager.list(); @@ -60,7 +60,7 @@ describe("ProcessManager", () => { stdout: "{", stderr: undefined, failed: false, - }); + } as any); // Act... const processes: Contracts.ProcessDescription[] | undefined = processManager.list(); @@ -92,7 +92,7 @@ describe("ProcessManager", () => { stdout: '[{ "key": "value" }]', stderr: undefined, failed: false, - }); + } as any); // Act... const processes: Contracts.ProcessDescription[] | undefined = processManager.list(); @@ -111,7 +111,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "unknown" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const process: Contracts.ProcessDescription | undefined = processManager.describe("stub"); @@ -127,7 +127,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub-other", "pm2_env": { "status": "unknown" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const process: Contracts.ProcessDescription | undefined = processManager.describe("stub"); @@ -143,7 +143,7 @@ describe("ProcessManager", () => { stdout: "[]", stderr: undefined, failed: false, - }); + } as any); // Act... const process: Contracts.ProcessDescription | undefined = processManager.describe("stub"); @@ -175,7 +175,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.start( @@ -196,7 +196,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.start( @@ -221,7 +221,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.start( @@ -234,7 +234,9 @@ describe("ProcessManager", () => { // Assert... expect(failed).toBeFalse(); - expect(spySync).toHaveBeenCalledWith("pm2 start stub.js --name='stub' -- core:run --daemon", { shell: true }); + expect(spySync).toHaveBeenCalledWith("pm2 start stub.js --name='stub' -- core:run --daemon", { + shell: true, + }); }); it("should ignore the flags if they are undefined", () => { @@ -243,7 +245,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.start( @@ -266,7 +268,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.stop("stub"); @@ -282,7 +284,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.stop("stub", { key: "value" }); @@ -297,10 +299,11 @@ describe("ProcessManager", () => { it("should be OK if failed is false", () => { // Arrange... const spySync: jest.SpyInstance = jest.spyOn(execa, "sync").mockReturnValue({ + // @ts-ignore stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.restart("stub"); @@ -316,7 +319,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.restart("stub", { key: "value" }); @@ -332,7 +335,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.restart("stub", {}); @@ -350,7 +353,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.reload("stub"); @@ -368,7 +371,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.reset("stub"); @@ -386,7 +389,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.delete("stub"); @@ -404,7 +407,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.flush("stub"); @@ -422,7 +425,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.reloadLogs(); @@ -440,7 +443,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.ping(); @@ -458,7 +461,7 @@ describe("ProcessManager", () => { stdout: null, stderr: undefined, failed: false, - }); + } as any); // Act... const { failed } = processManager.update(); @@ -472,6 +475,7 @@ describe("ProcessManager", () => { describe("#trigger", () => { it(".trigger()", async () => { // Arrange... + // @ts-ignore execa.mockResolvedValue({ stdout: null, stderr: undefined, @@ -494,7 +498,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "online" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.status("stub"); @@ -526,7 +530,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub-other", "pm2_env": { "status": "online" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.status("stub"); @@ -544,7 +548,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "online" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isOnline("stub"); @@ -562,7 +566,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "stopped" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isStopped("stub"); @@ -580,7 +584,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "stopping" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isStopping("stub"); @@ -598,7 +602,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "waiting restart" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isWaiting("stub"); @@ -616,7 +620,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "launching" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isLaunching("stub"); @@ -634,7 +638,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "errored" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isErrored("stub"); @@ -652,7 +656,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "one-launch-status" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isOneLaunch("stub"); @@ -670,7 +674,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "unknown" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isUnknown("stub"); @@ -686,7 +690,7 @@ describe("ProcessManager", () => { stdout: '[{ "id": "stub", "pm2_env": { "status": "online" } }]', stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.isUnknown("stub"); @@ -718,7 +722,7 @@ describe("ProcessManager", () => { stdout: 1, stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.has("stub"); @@ -734,7 +738,7 @@ describe("ProcessManager", () => { stdout: "", stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.has("stub"); @@ -766,7 +770,7 @@ describe("ProcessManager", () => { stdout: "", stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.missing("stub"); @@ -782,7 +786,7 @@ describe("ProcessManager", () => { stdout: 1, stderr: undefined, failed: false, - }); + } as any); // Act... const status = processManager.missing("stub"); diff --git a/__tests__/unit/core/source-providers/file.test.ts b/__tests__/unit/core-cli/services/source-providers/file.test.ts similarity index 97% rename from __tests__/unit/core/source-providers/file.test.ts rename to __tests__/unit/core-cli/services/source-providers/file.test.ts index f95e521d90..d37593cc60 100644 --- a/__tests__/unit/core/source-providers/file.test.ts +++ b/__tests__/unit/core-cli/services/source-providers/file.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; -import { File, Errors } from "@packages/core/src/source-providers"; +import { File, Errors } from "@packages/core-cli/src/services/source-providers"; import fs from "fs-extra"; import { dirSync, fileSync, setGracefulCleanup } from "tmp"; import { join } from "path"; diff --git a/__tests__/unit/core/source-providers/git.test.ts b/__tests__/unit/core-cli/services/source-providers/git.test.ts similarity index 95% rename from __tests__/unit/core/source-providers/git.test.ts rename to __tests__/unit/core-cli/services/source-providers/git.test.ts index e4b8418ed8..b6b5b97bf1 100644 --- a/__tests__/unit/core/source-providers/git.test.ts +++ b/__tests__/unit/core-cli/services/source-providers/git.test.ts @@ -1,11 +1,11 @@ import "jest-extended"; -import { Git } from "@packages/core/src/source-providers"; +import { Git } from "@packages/core-cli/src/services/source-providers"; import fs from "fs-extra"; import { dirSync, setGracefulCleanup } from "tmp"; import { join } from "path"; -import execa from "../../../../__mocks__/execa"; +import execa from "../../../../../__mocks__/execa"; let dataPath: string; let tempPath: string; diff --git a/__tests__/unit/core/source-providers/invalid-utils-0.9.1.tgz b/__tests__/unit/core-cli/services/source-providers/invalid-utils-0.9.1.tgz similarity index 100% rename from __tests__/unit/core/source-providers/invalid-utils-0.9.1.tgz rename to __tests__/unit/core-cli/services/source-providers/invalid-utils-0.9.1.tgz diff --git a/__tests__/unit/core/source-providers/missing-utils-0.9.1.tgz b/__tests__/unit/core-cli/services/source-providers/missing-utils-0.9.1.tgz similarity index 100% rename from __tests__/unit/core/source-providers/missing-utils-0.9.1.tgz rename to __tests__/unit/core-cli/services/source-providers/missing-utils-0.9.1.tgz diff --git a/__tests__/unit/core/source-providers/npm.test.ts b/__tests__/unit/core-cli/services/source-providers/npm.test.ts similarity index 98% rename from __tests__/unit/core/source-providers/npm.test.ts rename to __tests__/unit/core-cli/services/source-providers/npm.test.ts index e0f00476a0..6742bf0b36 100644 --- a/__tests__/unit/core/source-providers/npm.test.ts +++ b/__tests__/unit/core-cli/services/source-providers/npm.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; -import { NPM } from "@packages/core/src/source-providers"; +import { NPM } from "@packages/core-cli/src/services/source-providers"; import execa from "execa"; import fs from "fs-extra"; import nock from "nock"; diff --git a/__tests__/unit/core/source-providers/utils-0.9.1.tgz b/__tests__/unit/core-cli/services/source-providers/utils-0.9.1.tgz similarity index 100% rename from __tests__/unit/core/source-providers/utils-0.9.1.tgz rename to __tests__/unit/core-cli/services/source-providers/utils-0.9.1.tgz diff --git a/__tests__/unit/core-database/database-service.test.ts b/__tests__/unit/core-database/database-service.test.ts index b1932c5e9f..311050fd43 100644 --- a/__tests__/unit/core-database/database-service.test.ts +++ b/__tests__/unit/core-database/database-service.test.ts @@ -83,6 +83,18 @@ describe("DatabaseService.initialize", () => { } }); + it("should analyze database", async () => { + try { + const databaseService = container.resolve(DatabaseService); + + await databaseService.initialize(); + + expect(connection.query).toBeCalledWith("ANALYZE;"); + } finally { + delete process.env.CORE_RESET_DATABASE; + } + }); + it("should terminate app if exception was raised", async () => { try { const databaseService = container.resolve(DatabaseService); diff --git a/__tests__/unit/core-database/service-provider.test.ts b/__tests__/unit/core-database/service-provider.test.ts index d3d54f10dd..012f865e3b 100644 --- a/__tests__/unit/core-database/service-provider.test.ts +++ b/__tests__/unit/core-database/service-provider.test.ts @@ -43,7 +43,7 @@ describe("ServiceProvider.register", () => { await serviceProvider.register(); expect(createConnection).toBeCalled(); - expect(getCustomRepository).toBeCalledTimes(3); + expect(getCustomRepository).toBeCalledTimes(6); expect(events.dispatch).toBeCalled(); @@ -127,6 +127,7 @@ describe("ServiceProvider.configSchema", () => { expect(result.value.connection.entityPrefix).toBeString(); expect(result.value.connection.synchronize).toBeFalse(); expect(result.value.connection.logging).toBeFalse(); + expect(result.value.apiConnectionTimeout).toEqual(3000); }); it("should allow configuration extension", async () => { @@ -349,5 +350,27 @@ describe("ServiceProvider.configSchema", () => { expect(result.error!.message).toEqual('"connection.logging" is required'); }); + + it("apiConnectionTimeout is required && is integer && is >= 1", async () => { + defaults.apiConnectionTimeout = false; + let result = (serviceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"apiConnectionTimeout" must be a number'); + + defaults.apiConnectionTimeout = 1.12; + result = (serviceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"apiConnectionTimeout" must be an integer'); + + defaults.apiConnectionTimeout = 0; + result = (serviceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"apiConnectionTimeout" must be greater than or equal to 1'); + + delete defaults.apiConnectionTimeout; + result = (serviceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error!.message).toEqual('"apiConnectionTimeout" is required'); + }); }); }); diff --git a/__tests__/unit/core-database/transaction-filter.test.ts b/__tests__/unit/core-database/transaction-filter.test.ts index 04668f37bf..5b766fa8ec 100644 --- a/__tests__/unit/core-database/transaction-filter.test.ts +++ b/__tests__/unit/core-database/transaction-filter.test.ts @@ -4,6 +4,7 @@ import { Enums, Utils } from "@packages/crypto"; const walletRepository = { findByAddress: jest.fn(), + hasByAddress: jest.fn(), }; const container = new Container.Container(); @@ -11,6 +12,7 @@ container.bind(Container.Identifiers.WalletRepository).toConstantValue(walletRep beforeEach(() => { walletRepository.findByAddress.mockReset(); + walletRepository.hasByAddress.mockReset(); }); describe("TransactionFilter.getExpression", () => { @@ -24,7 +26,8 @@ describe("TransactionFilter.getExpression", () => { }); describe("TransactionCriteria.address", () => { - it("should compare senderPublicKey, recipientId, multipayment recipientId, delegate registration sender", async () => { + it("should compare senderPublicKey, recipientId, multipayment recipientId", async () => { + walletRepository.hasByAddress.mockReturnValue(true); walletRepository.findByAddress .mockReturnValueOnce({ getPublicKey: () => { @@ -40,49 +43,31 @@ describe("TransactionFilter.getExpression", () => { const transactionFilter = container.resolve(TransactionFilter); const expression = await transactionFilter.getExpression({ address: "123" }); + expect(walletRepository.hasByAddress).toBeCalledWith("123"); expect(walletRepository.findByAddress).toBeCalledWith("123"); expect(expression).toEqual({ op: "or", expressions: [ { property: "senderPublicKey", op: "equal", value: "456" }, { property: "recipientId", op: "equal", value: "123" }, - { - op: "and", - expressions: [ - { property: "typeGroup", op: "equal", value: Enums.TransactionTypeGroup.Core }, - { property: "type", op: "equal", value: Enums.TransactionType.MultiPayment }, - { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, - ], - }, - { - op: "and", - expressions: [ - { property: "typeGroup", op: "equal", value: Enums.TransactionTypeGroup.Core }, - { property: "type", op: "equal", value: Enums.TransactionType.DelegateRegistration }, - { property: "senderPublicKey", op: "equal", value: "456" }, - ], - }, + { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, ], }); }); it("should compare recipientId, multipayment recipientId when wallet not found", async () => { + walletRepository.hasByAddress.mockReturnValue(false); + const transactionFilter = container.resolve(TransactionFilter); const expression = await transactionFilter.getExpression({ address: "123" }); - expect(walletRepository.findByAddress).toBeCalledWith("123"); + expect(walletRepository.hasByAddress).toBeCalledWith("123"); + expect(walletRepository.findByAddress).not.toBeCalled(); expect(expression).toEqual({ op: "or", expressions: [ { property: "recipientId", op: "equal", value: "123" }, - { - op: "and", - expressions: [ - { property: "typeGroup", op: "equal", value: Enums.TransactionTypeGroup.Core }, - { property: "type", op: "equal", value: Enums.TransactionType.MultiPayment }, - { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, - ], - }, + { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, ], }); }); @@ -90,6 +75,7 @@ describe("TransactionFilter.getExpression", () => { describe("TransactionCriteria.senderId", () => { it("should compare senderPublicKey using equal expression", async () => { + walletRepository.hasByAddress.mockReturnValue(true); walletRepository.findByAddress.mockReturnValueOnce({ getPublicKey: () => { return "456"; @@ -99,21 +85,26 @@ describe("TransactionFilter.getExpression", () => { const transactionFilter = container.resolve(TransactionFilter); const expression = await transactionFilter.getExpression({ senderId: "123" }); + expect(walletRepository.hasByAddress).toBeCalledWith("123"); expect(walletRepository.findByAddress).toBeCalledWith("123"); expect(expression).toEqual({ property: "senderPublicKey", op: "equal", value: "456" }); }); it("should produce false expression when wallet not found", async () => { + walletRepository.hasByAddress.mockReturnValue(false); + const transactionFilter = container.resolve(TransactionFilter); const expression = await transactionFilter.getExpression({ senderId: "123" }); - expect(walletRepository.findByAddress).toBeCalledWith("123"); + expect(walletRepository.hasByAddress).toBeCalledWith("123"); + expect(walletRepository.findByAddress).not.toBeCalled(); expect(expression).toEqual({ op: "false" }); }); }); describe("TransactionCriteria.recipientId", () => { - it("should compare using equal expression and include multipayment and include delegate registration transaction", async () => { + it("should compare using equal expression and include multipayment", async () => { + walletRepository.hasByAddress.mockReturnValue(true); walletRepository.findByAddress.mockReturnValueOnce({ getPublicKey: () => { return "456"; @@ -123,48 +114,11 @@ describe("TransactionFilter.getExpression", () => { const transactionFilter = container.resolve(TransactionFilter); const expression = await transactionFilter.getExpression({ recipientId: "123" }); - expect(walletRepository.findByAddress).toBeCalledWith("123"); expect(expression).toEqual({ op: "or", expressions: [ { property: "recipientId", op: "equal", value: "123" }, - { - op: "and", - expressions: [ - { property: "typeGroup", op: "equal", value: Enums.TransactionTypeGroup.Core }, - { property: "type", op: "equal", value: Enums.TransactionType.MultiPayment }, - { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, - ], - }, - { - op: "and", - expressions: [ - { property: "typeGroup", op: "equal", value: Enums.TransactionTypeGroup.Core }, - { property: "type", op: "equal", value: Enums.TransactionType.DelegateRegistration }, - { property: "senderPublicKey", op: "equal", value: "456" }, - ], - }, - ], - }); - }); - - it("should compare using equal expression and include multipayment when wallet not found", async () => { - const transactionFilter = container.resolve(TransactionFilter); - const expression = await transactionFilter.getExpression({ recipientId: "123" }); - - expect(walletRepository.findByAddress).toBeCalledWith("123"); - expect(expression).toEqual({ - op: "or", - expressions: [ - { property: "recipientId", op: "equal", value: "123" }, - { - op: "and", - expressions: [ - { property: "typeGroup", op: "equal", value: Enums.TransactionTypeGroup.Core }, - { property: "type", op: "equal", value: Enums.TransactionType.MultiPayment }, - { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, - ], - }, + { property: "asset", op: "contains", value: { payments: [{ recipientId: "123" }] } }, ], }); }); @@ -374,7 +328,7 @@ describe("TransactionFilter.getExpression", () => { expect(expression).toEqual({ property: "vendorField", op: "like", - pattern: "%pattern%", + pattern: Buffer.from("%pattern%", "utf-8"), }); }); }); diff --git a/__tests__/unit/core-forger/mocks/nes.ts b/__tests__/unit/core-forger/mocks/nes.ts index 0a41803be6..9439018c60 100644 --- a/__tests__/unit/core-forger/mocks/nes.ts +++ b/__tests__/unit/core-forger/mocks/nes.ts @@ -1,5 +1,5 @@ export const nesClient = { - connect: jest.fn().mockReturnValue(new Promise((resolve) => resolve())), + connect: jest.fn().mockReturnValue(new Promise((resolve) => resolve())), disconnect: jest.fn(), request: jest.fn().mockReturnValue({ payload: Buffer.from(JSON.stringify({})) }), onError: jest.fn(), diff --git a/__tests__/unit/core-kernel/services/schedule/block-job.test.ts b/__tests__/unit/core-kernel/services/schedule/block-job.test.ts index d695174282..d22de56677 100644 --- a/__tests__/unit/core-kernel/services/schedule/block-job.test.ts +++ b/__tests__/unit/core-kernel/services/schedule/block-job.test.ts @@ -11,7 +11,7 @@ let job: BlockJob; let eventDispatcher: MemoryEventDispatcher; const delay = async (timeout) => { - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, timeout); diff --git a/__tests__/unit/core-kernel/services/search/pagination-service.test.ts b/__tests__/unit/core-kernel/services/search/pagination-service.test.ts index 6df57fbcfb..96841d2c6a 100644 --- a/__tests__/unit/core-kernel/services/search/pagination-service.test.ts +++ b/__tests__/unit/core-kernel/services/search/pagination-service.test.ts @@ -18,12 +18,12 @@ describe("PaginationService.getEmptyPage", () => { }); describe("PaginationService.getPage", () => { - it("should leave items order intact when sorting isn't provided", () => { + it("should leave items order intact when sorting isn't provided", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: 1 }, { v: 3 }, {}, { v: 2 }]; const sorting = []; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [{ v: 1 }, { v: 3 }, {}, { v: 2 }], @@ -32,12 +32,26 @@ describe("PaginationService.getPage", () => { }); }); - it("should return items with undefined properties at the end", () => { + it("should leave items order intact when sorting by undefined property", async () => { + const paginationService = container.resolve(PaginationService); + const pagination = { offset: 0, limit: 100 }; + const items = [{ v: 1 }, { v: 3 }, {}, { v: 2 }]; + const sorting = [{ property: "dummy", direction: "asc" as const }]; + const resultsPage = await paginationService.getPage(pagination, sorting, items); + + expect(resultsPage).toEqual({ + results: [{ v: 1 }, { v: 3 }, {}, { v: 2 }], + totalCount: 4, + meta: { totalCountIsEstimate: false }, + }); + }); + + it("should return items with undefined properties at the end", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: 1 }, {}, { v: 3 }, {}, { v: 2 }]; const sorting = [{ property: "v", direction: "asc" as const }]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [{ v: 1 }, { v: 2 }, { v: 3 }, {}, {}], @@ -46,12 +60,12 @@ describe("PaginationService.getPage", () => { }); }); - it("should return items with undefined properties at the end regardless of direction", () => { + it("should return items with undefined properties at the end regardless of direction", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: 1 }, { v: 3 }, {}, { v: 2 }]; const sorting = [{ property: "v", direction: "desc" as const }]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [{ v: 3 }, { v: 2 }, { v: 1 }, {}], @@ -60,12 +74,12 @@ describe("PaginationService.getPage", () => { }); }); - it("should return items with null properties at the end before items with undefined properties", () => { + it("should return items with null properties at the end before items with undefined properties", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: 1 }, { v: 3 }, {}, { v: null }, { v: 2 }, { v: null }]; const sorting = [{ property: "v", direction: "asc" as const }]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [{ v: 1 }, { v: 2 }, { v: 3 }, { v: null }, { v: null }, {}], @@ -74,12 +88,12 @@ describe("PaginationService.getPage", () => { }); }); - it("should return items with null properties at the end before items with undefined properties regardless of direction", () => { + it("should return items with null properties at the end before items with undefined properties regardless of direction", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: 1 }, { v: null }, { v: 3 }, {}, { v: 2 }]; const sorting = [{ property: "v", direction: "desc" as const }]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [{ v: 3 }, { v: 2 }, { v: 1 }, { v: null }, {}], @@ -88,7 +102,7 @@ describe("PaginationService.getPage", () => { }); }); - it("should sort using second sorting instruction when first properties are equal booleans", () => { + it("should sort using second sorting instruction when first properties are equal booleans", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [ @@ -100,7 +114,7 @@ describe("PaginationService.getPage", () => { { property: "a", direction: "asc" as const }, { property: "b", direction: "asc" as const }, ]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [ @@ -113,7 +127,7 @@ describe("PaginationService.getPage", () => { }); }); - it("should sort using second sorting instruction when first properties are equal strings", () => { + it("should sort using second sorting instruction when first properties are equal strings", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [ @@ -125,7 +139,7 @@ describe("PaginationService.getPage", () => { { property: "a", direction: "asc" as const }, { property: "b", direction: "asc" as const }, ]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [ @@ -138,7 +152,7 @@ describe("PaginationService.getPage", () => { }); }); - it("should sort using second sorting instruction when first properties are equal numbers", () => { + it("should sort using second sorting instruction when first properties are equal numbers", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [ @@ -150,7 +164,7 @@ describe("PaginationService.getPage", () => { { property: "a", direction: "asc" as const }, { property: "b", direction: "asc" as const }, ]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [ @@ -163,7 +177,7 @@ describe("PaginationService.getPage", () => { }); }); - it("should sort using second sorting instruction when first properties are equal bigints", () => { + it("should sort using second sorting instruction when first properties are equal bigints", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [ @@ -175,7 +189,7 @@ describe("PaginationService.getPage", () => { { property: "a", direction: "asc" as const }, { property: "b", direction: "asc" as const }, ]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [ @@ -188,7 +202,7 @@ describe("PaginationService.getPage", () => { }); }); - it("should sort using second sorting instruction when first properties are equal Utils.BigNumber instances", () => { + it("should sort using second sorting instruction when first properties are equal Utils.BigNumber instances", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [ @@ -200,7 +214,7 @@ describe("PaginationService.getPage", () => { { property: "a", direction: "asc" as const }, { property: "b", direction: "asc" as const }, ]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [ @@ -213,12 +227,62 @@ describe("PaginationService.getPage", () => { }); }); - it("should sort by Utils.BigNumber property", () => { + it("should sort using second sorting instruction when first properties are null", async () => { + const paginationService = container.resolve(PaginationService); + const pagination = { offset: 0, limit: 100 }; + const items = [ + { a: null, b: 101 }, + { a: true, b: 100 }, + { a: null, b: 200 }, + ]; + const sorting = [ + { property: "a", direction: "asc" as const }, + { property: "b", direction: "asc" as const }, + ]; + const resultsPage = await paginationService.getPage(pagination, sorting, items); + + expect(resultsPage).toEqual({ + results: [ + { a: true, b: 100 }, + { a: null, b: 101 }, + { a: null, b: 200 }, + ], + totalCount: 3, + meta: { totalCountIsEstimate: false }, + }); + }); + + it("should sort using second sorting instruction when first properties are undefined", async () => { + const paginationService = container.resolve(PaginationService); + const pagination = { offset: 0, limit: 100 }; + const items = [ + { a: undefined, b: 200 }, + { a: undefined, b: 101 }, + { a: true, b: 100 }, + ]; + const sorting = [ + { property: "a", direction: "asc" as const }, + { property: "b", direction: "asc" as const }, + ]; + const resultsPage = await paginationService.getPage(pagination, sorting, items); + + expect(resultsPage).toEqual({ + results: [ + { a: true, b: 100 }, + { a: undefined, b: 101 }, + { a: undefined, b: 200 }, + ], + totalCount: 3, + meta: { totalCountIsEstimate: false }, + }); + }); + + it("should sort by Utils.BigNumber property", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: Utils.BigNumber.make(1) }, { v: Utils.BigNumber.make(3) }, { v: Utils.BigNumber.make(2) }]; const sorting = [{ property: "v", direction: "asc" as const }]; - const resultsPage = paginationService.getPage(pagination, sorting, items); + const resultsPage = await paginationService.getPage(pagination, sorting, items); expect(resultsPage).toEqual({ results: [{ v: Utils.BigNumber.make(1) }, { v: Utils.BigNumber.make(2) }, { v: Utils.BigNumber.make(3) }], @@ -227,23 +291,25 @@ describe("PaginationService.getPage", () => { }); }); - it("should throw when sorting over property with union type", () => { + it("should throw when sorting over property with union type", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items: { v: number | string }[] = [{ v: 1 }, { v: "2" }]; const sorting = [{ property: "v", direction: "asc" as const }]; - expect(() => paginationService.getPage(pagination, sorting, items)).toThrowError( + await expect(() => paginationService.getPage(pagination, sorting, items)).rejects.toThrowError( "Mismatched types 'string' and 'number' at 'v'", ); }); - it("should throw when sorting over property with invalid type", () => { + it("should throw when sorting over property with invalid type", async () => { const paginationService = container.resolve(PaginationService); const pagination = { offset: 0, limit: 100 }; const items = [{ v: Symbol() }, { v: Symbol() }]; const sorting = [{ property: "v", direction: "asc" as const }]; - expect(() => paginationService.getPage(pagination, sorting, items)).toThrowError("Unexpected type at 'v'"); + await expect(() => paginationService.getPage(pagination, sorting, items)).rejects.toThrowError( + "Unexpected type at 'v'", + ); }); }); diff --git a/__tests__/unit/core-kernel/utils/lock.test.ts b/__tests__/unit/core-kernel/utils/lock.test.ts index 29b369df8c..a8d365954b 100644 --- a/__tests__/unit/core-kernel/utils/lock.test.ts +++ b/__tests__/unit/core-kernel/utils/lock.test.ts @@ -3,7 +3,7 @@ import { Lock } from "../../../../packages/core-kernel/src/utils/lock"; describe("Lock", () => { it("should run exclusive executions in series", async () => { let resolve: () => void; - const promise = new Promise((r) => (resolve = r)); + const promise = new Promise((r) => (resolve = r)); let executions = 0; const fn = async () => { @@ -21,7 +21,7 @@ describe("Lock", () => { it("should run non-exclusive executions in parallel", async () => { let resolve: () => void; - const promise = new Promise((r) => (resolve = r)); + const promise = new Promise((r) => (resolve = r)); let executions = 0; const fn = async () => { @@ -39,7 +39,7 @@ describe("Lock", () => { it("should run exclusive execution after non-exclusive had finished", async () => { let resolve: () => void; - const promise = new Promise((r) => (resolve = r)); + const promise = new Promise((r) => (resolve = r)); let executions = 0; const fn = async () => { @@ -57,7 +57,7 @@ describe("Lock", () => { it("should run non-exclusive execution after exclusive had finished", async () => { let resolve: () => void; - const promise = new Promise((r) => (resolve = r)); + const promise = new Promise((r) => (resolve = r)); let executions = 0; const fn = async () => { diff --git a/__tests__/unit/core-logger-pino/driver.test.ts b/__tests__/unit/core-logger-pino/driver.test.ts index 573dc725d0..690947e195 100644 --- a/__tests__/unit/core-logger-pino/driver.test.ts +++ b/__tests__/unit/core-logger-pino/driver.test.ts @@ -157,6 +157,8 @@ describe("Logger", () => { await sleep(100); expect(message).toMatch("File stream closed due to an error: Error: Test error"); + + await expect(logger.dispose()).toResolve(); }); it("should rotate the log 3 times", async () => { @@ -188,4 +190,38 @@ describe("Logger", () => { expect(files.filter((file) => file.endsWith(".log.gz"))).toHaveLength(3); expect(files).toHaveLength(5); }); + + describe("make", () => { + it("should create a file stream if level is valid", () => { + // @ts-ignore + expect(logger.combinedFileStream).toBeDefined(); + }); + + it("should not create a file stream if level not is valid", async () => { + const logger = await app.resolve(PinoLogger).make({ + levels: { + console: process.env.CORE_LOG_LEVEL || "debug", + file: "invalid", + }, + fileRotator: { + interval: "1d", + }, + }); + + // @ts-ignore + expect(logger.combinedFileStream).not.toBeDefined(); + }); + }); + + describe("dispose", () => { + it("should dispose before make", async () => { + const logger = await app.resolve(PinoLogger); + + await expect(logger.dispose()).toResolve(); + }); + + it("should dispose after make", async () => { + await expect(logger.dispose()).toResolve(); + }); + }); }); diff --git a/__tests__/unit/core-logger-pino/service-provider.test.ts b/__tests__/unit/core-logger-pino/service-provider.test.ts index ea1fc029f8..16d4a93713 100644 --- a/__tests__/unit/core-logger-pino/service-provider.test.ts +++ b/__tests__/unit/core-logger-pino/service-provider.test.ts @@ -5,6 +5,8 @@ import { ServiceProvider } from "@packages/core-logger-pino/src"; import { defaults } from "@packages/core-logger-pino/src/defaults"; import { AnySchema } from "joi"; import { dirSync } from "tmp"; +import { Identifiers, interfaces } from "@arkecosystem/core-kernel/dist/ioc"; +import { LogManager } from "@arkecosystem/core-kernel/dist/services/log"; let app: Application; @@ -37,6 +39,23 @@ describe("ServiceProvider", () => { }); it("should be disposable", async () => { + app.bind(Container.Identifiers.LogManager) + .to(Services.Log.LogManager) + .inSingletonScope(); + + await app.get(Container.Identifiers.LogManager).boot(); + + serviceProvider.setConfig(app.resolve(Providers.PluginConfiguration).merge(defaults)); + + app.bind(Container.Identifiers.ApplicationNamespace).toConstantValue("token-network"); + app.bind("path.log").toConstantValue(dirSync().name); + + app.bind(Identifiers.LogService).toDynamicValue((context: interfaces.Context) => + context.container.get(Identifiers.LogManager).driver(), + ); + + await expect(serviceProvider.register()).toResolve(); + await expect(serviceProvider.dispose()).toResolve(); }); diff --git a/__tests__/unit/core-magistrate-api/controllers/entities.test.ts b/__tests__/unit/core-magistrate-api/controllers/entities.test.ts index 543e359b09..c89b0e02c5 100644 --- a/__tests__/unit/core-magistrate-api/controllers/entities.test.ts +++ b/__tests__/unit/core-magistrate-api/controllers/entities.test.ts @@ -39,17 +39,17 @@ const entityResource1 = { }; describe("EntityController.index", () => { - it("should get criteria from query and return page from EntitySearchService", () => { + it("should get criteria from query and return page from EntitySearchService", async () => { const entitiesPage: Contracts.Search.ResultsPage = { results: [entityResource1], totalCount: 1, meta: { totalCountIsEstimate: false }, }; - entitySearchService.getEntitiesPage.mockReturnValueOnce(entitiesPage); + entitySearchService.getEntitiesPage.mockResolvedValueOnce(entitiesPage); const entityController = container.resolve(EntityController); - const result = entityController.index({ + const result = await entityController.index({ query: { type: Enums.EntityType.Business, page: 1, diff --git a/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/register.ts b/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/register.ts index 83aaa0f6c2..6742654f98 100644 --- a/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/register.ts +++ b/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/register.ts @@ -1,4 +1,5 @@ -import { Enums, Interfaces } from "@arkecosystem/core-magistrate-crypto/src"; +import { Enums, Interfaces } from "@packages/core-magistrate-crypto/src"; + import { invalidAssetData, validAssetData } from "./utils"; export const validRegisters: Interfaces.IEntityAsset[] = [ @@ -10,7 +11,7 @@ export const validRegisters: Interfaces.IEntityAsset[] = [ name: "my_plugin_for_desktop_wallet", }, }, - ...validAssetData.map(data => ({ + ...validAssetData.map((data) => ({ type: Enums.EntityType.Module, subType: 0, action: Enums.EntityAction.Register, @@ -29,32 +30,44 @@ export const invalidRegisters: Interfaces.IEntityAsset[] = [ data: {}, // should have at least a name }, { - type: 256, // max 255 + type: Enums.EntityType.Plugin, subType: 1, action: Enums.EntityAction.Register, data: { - name: "validname", + name: "my plugin for desktop wallet that has a name too loong", // name max 40 characters }, }, { - type: -1, // min 0 + type: Enums.EntityType.Plugin, subType: 1, action: Enums.EntityAction.Register, data: { - name: "validname", + name: "invalid \u0000 char", }, }, + ...invalidAssetData.map((data) => ({ + type: Enums.EntityType.Module, + subType: 0, + action: Enums.EntityAction.Update, + data: { + name: "my_module", + ...data, + }, + })), +]; + +export const unserializableRegisters: Interfaces.IEntityAsset[] = [ { - type: Enums.EntityType.Plugin, - subType: 256, // max 255 + type: 256, // max 255 + subType: 1, action: Enums.EntityAction.Register, data: { name: "validname", }, }, { - type: Enums.EntityType.Plugin, - subType: -1, // min 0 + type: -1, // min 0 + subType: 1, action: Enums.EntityAction.Register, data: { name: "validname", @@ -62,27 +75,18 @@ export const invalidRegisters: Interfaces.IEntityAsset[] = [ }, { type: Enums.EntityType.Plugin, - subType: 1, + subType: 256, // max 255 action: Enums.EntityAction.Register, data: { - name: "my plugin for desktop wallet that has a name too loong", // name max 40 characters + name: "validname", }, }, { type: Enums.EntityType.Plugin, - subType: 1, + subType: -1, // min 0 action: Enums.EntityAction.Register, data: { - name: "invalid \u0000 char", + name: "validname", }, }, - ...invalidAssetData.map(data => ({ - type: Enums.EntityType.Module, - subType: 0, - action: Enums.EntityAction.Update, - data: { - name: "my_module", - ...data, - }, - })), ]; diff --git a/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/resign.ts b/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/resign.ts index f87d11a9ef..1bba9fdc66 100644 --- a/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/resign.ts +++ b/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/resign.ts @@ -1,4 +1,5 @@ -import { Enums, Interfaces } from "@arkecosystem/core-magistrate-crypto/src"; +import { Enums, Interfaces } from "@packages/core-magistrate-crypto/src"; + import { invalidAssetData, validAssetData } from "./utils"; export const validResigns: Interfaces.IEntityAsset[] = [ @@ -28,6 +29,22 @@ export const invalidResigns: Interfaces.IEntityAsset[] = [ name: "why a name", // no property allowed in data for resign }, }, + ...invalidAssetData.map((data) => ({ + type: Enums.EntityType.Module, + subType: 0, + action: Enums.EntityAction.Update, + data, + })), + ...validAssetData.map((data) => ({ + // even "valid" data are invalid for resign as we allow no property in data + type: Enums.EntityType.Module, + subType: 0, + action: Enums.EntityAction.Update, + data, + })), +]; + +export const unserializableResigns: Interfaces.IEntityAsset[] = [ { type: Enums.EntityType.Plugin, subType: 256, // max 255 @@ -56,17 +73,4 @@ export const invalidResigns: Interfaces.IEntityAsset[] = [ registrationId: "e77a1d1d080ebce113dd27e1cb0a242ec8600fb72cd62ace4e46148bee1d3acc", data: {}, }, - ...invalidAssetData.map(data => ({ - type: Enums.EntityType.Module, - subType: 0, - action: Enums.EntityAction.Update, - data, - })), - ...validAssetData.map(data => ({ - // even "valid" data are invalid for resign as we allow no property in data - type: Enums.EntityType.Module, - subType: 0, - action: Enums.EntityAction.Update, - data, - })), ]; diff --git a/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/update.ts b/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/update.ts index 636ea66bf9..ec93a0617d 100644 --- a/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/update.ts +++ b/__tests__/unit/core-magistrate-crypto/fixtures/entity/schemas/update.ts @@ -1,4 +1,5 @@ -import { Enums, Interfaces } from "@arkecosystem/core-magistrate-crypto/src"; +import { Enums, Interfaces } from "@packages/core-magistrate-crypto/src"; + import { invalidAssetData, validAssetData } from "./utils"; export const validUpdates: Interfaces.IEntityAsset[] = [ @@ -11,7 +12,7 @@ export const validUpdates: Interfaces.IEntityAsset[] = [ ipfsData: "Qmbw6QmF6tuZpyV6WyEsTmExkEG3rW4khattQidPfbpmNZ", }, }, - ...validAssetData.map(data => ({ + ...validAssetData.map((data) => ({ type: Enums.EntityType.Module, subType: 0, action: Enums.EntityAction.Update, @@ -29,6 +30,15 @@ export const invalidUpdates: Interfaces.IEntityAsset[] = [ name: "name cannot be updated", // name is the only prop that cannot be updated }, }, + ...invalidAssetData.map((data) => ({ + type: Enums.EntityType.Module, + subType: 0, + action: Enums.EntityAction.Update, + data, + })), +]; + +export const unserializableUpdates: Interfaces.IEntityAsset[] = [ { type: Enums.EntityType.Plugin, subType: 256, // max 255 @@ -65,10 +75,4 @@ export const invalidUpdates: Interfaces.IEntityAsset[] = [ ipfsData: "Qmbw6QmF6tuZpyV6WyEsTmExkEG3rW4khattQidPfbpmNZ", }, }, - ...invalidAssetData.map(data => ({ - type: Enums.EntityType.Module, - subType: 0, - action: Enums.EntityAction.Update, - data, - })), ]; diff --git a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts index 3cae29f9cc..3812e9a5f1 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-registration.test.ts @@ -26,9 +26,8 @@ describe("Bridgechain registration transaction", () => { .sign("passphrase") .getStruct(); - const serialized = Transactions.TransactionFactory.fromData(bridgechainRegistration).serialized.toString( - "hex", - ); + const serialized = + Transactions.TransactionFactory.fromData(bridgechainRegistration).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, bridgechainRegistration); @@ -45,9 +44,8 @@ describe("Bridgechain registration transaction", () => { .sign("passphrase") .getStruct(); - const serialized = Transactions.TransactionFactory.fromData(bridgechainRegistration).serialized.toString( - "hex", - ); + const serialized = + Transactions.TransactionFactory.fromData(bridgechainRegistration).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, bridgechainRegistration); @@ -133,7 +131,7 @@ describe("Bridgechain registration transaction", () => { }); describe("should test edge cases of bridgechain genesisHash", () => { - it("should fail because genesisHash is to short (63chars) ", () => { + it("should fail because genesisHash is to short (63chars)", () => { const bridgechainRegistration = builder .bridgechainRegistrationAsset({ name: "google", @@ -148,7 +146,7 @@ describe("Bridgechain registration transaction", () => { expect(error).not.toBeUndefined(); }); - it("should fail because genesisHash is to long (65chars) ", () => { + it("should fail because genesisHash is to long (65chars)", () => { const bridgechainRegistration = builder .bridgechainRegistrationAsset({ name: "google", diff --git a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts index 287758c256..80e20f7571 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/bridgechain-update.test.ts @@ -1,10 +1,8 @@ import "jest-extended"; -import ByteBuffer from "bytebuffer"; - import { BridgechainUpdateBuilder } from "@packages/core-magistrate-crypto/src/builders"; -import { Managers, Transactions, Validation } from "@packages/crypto"; import { BridgechainUpdateTransaction } from "@packages/core-magistrate-crypto/src/transactions"; +import { Managers, Transactions, Validation } from "@packages/crypto"; import { bridgechainUpdateAsset1, checkCommonFields } from "../helper"; @@ -28,7 +26,7 @@ describe("Bridgechain update ser/deser", () => { .bridgechainUpdateAsset({ bridgechainId: genesisHash, seedNodes: ["74.125.224.72"], - ports: {"@arkecosystem/core-api": 12345}, + ports: { "@arkecosystem/core-api": 12345 }, bridgechainRepository: "http://www.repository.com/myorg/myrepo", bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", }) @@ -47,7 +45,7 @@ describe("Bridgechain update ser/deser", () => { .bridgechainUpdateAsset({ bridgechainId: genesisHash, seedNodes: ["74.125.224.72"], - ports: {"@arkecosystem/core-api": 12345}, + ports: { "@arkecosystem/core-api": 12345 }, bridgechainRepository: "http://www.repository.com/myorg/myrepo", bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", }) @@ -56,14 +54,13 @@ describe("Bridgechain update ser/deser", () => { const transaction = Transactions.TransactionFactory.fromData(businessResignation); - transaction.data.asset!.seedNodes = []; transaction.data.asset!.ports = {}; transaction.data.asset!.bridgechainRepository = ""; transaction.data.asset!.bridgechainAssetRepository = ""; - const serialized = ByteBuffer.fromHex(transaction.serialize().toString("hex")); - + const serialized = transaction.serialize()!; + serialized.reset(); transaction.deserialize(serialized); }); @@ -73,7 +70,7 @@ describe("Bridgechain update ser/deser", () => { .bridgechainUpdateAsset({ bridgechainId: genesisHash, seedNodes: ["74.125.224.72"], - ports: {"@arkecosystem/core-api": 12345}, + ports: { "@arkecosystem/core-api": 12345 }, bridgechainRepository: "http://www.repository.com/myorg/myrepo", bridgechainAssetRepository: "http://www.repository.com/myorg/myassetrepo", }) diff --git a/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts index 60639852b5..70b439e14d 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/business-registration.test.ts @@ -32,9 +32,8 @@ describe("Business registration transaction", () => { .sign("passphrase") .getStruct(); - const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( - "hex", - ); + const serialized = + Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -48,9 +47,8 @@ describe("Business registration transaction", () => { .sign("passphrase") .getStruct(); - const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( - "hex", - ); + const serialized = + Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -64,9 +62,8 @@ describe("Business registration transaction", () => { .sign("passphrase") .getStruct(); - const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( - "hex", - ); + const serialized = + Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -80,9 +77,8 @@ describe("Business registration transaction", () => { .sign("passphrase") .getStruct(); - const serialized = Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString( - "hex", - ); + const serialized = + Transactions.TransactionFactory.fromData(businessRegistration).serialized.toString("hex"); const deserialized = Transactions.Deserializer.deserialize(serialized); checkCommonFields(deserialized, businessRegistration); @@ -115,7 +111,7 @@ describe("Business registration transaction", () => { transactionSchema = BusinessRegistrationTransaction.getSchema(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessRegistration = builder .businessRegistrationAsset(businessRegistrationAsset1) .network(23) @@ -124,7 +120,7 @@ describe("Business registration transaction", () => { const { error } = Ajv.validator.validate(transactionSchema, businessRegistration.getStruct()); expect(error).toBeUndefined(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessRegistration = builder .businessRegistrationAsset(businessRegistrationAsset2) .network(23) @@ -133,7 +129,7 @@ describe("Business registration transaction", () => { const { error } = Ajv.validator.validate(transactionSchema, businessRegistration.getStruct()); expect(error).toBeUndefined(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessRegistration = builder .businessRegistrationAsset(businessRegistrationAsset3) .network(23) @@ -142,7 +138,7 @@ describe("Business registration transaction", () => { const { error } = Ajv.validator.validate(transactionSchema, businessRegistration.getStruct()); expect(error).toBeUndefined(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessRegistration = builder .businessRegistrationAsset(businessRegistrationAsset4) .network(23) diff --git a/__tests__/unit/core-magistrate-crypto/transactions/business-resgination.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/business-resgination.test.ts index 2834927bc6..2ee13e408f 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/business-resgination.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/business-resgination.test.ts @@ -17,6 +17,7 @@ describe("Business resignation ser/deser", () => { beforeEach(() => { builder = new BusinessResignationBuilder(); }); + it("should ser/deserialize giving back original fields", () => { const businessResignation = builder.network(23).version(2).sign("passphrase").getStruct(); diff --git a/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts index a80490c285..9edbe8ee71 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/business-update.test.ts @@ -99,7 +99,7 @@ describe("Business update transaction", () => { transactionSchema = BusinessUpdateTransaction.getSchema(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessUpdateBuilder = builder .businessUpdateAsset(businessUpdateAsset1) .network(23) @@ -109,7 +109,7 @@ describe("Business update transaction", () => { expect(error).toBeUndefined(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessUpdateBuilder = builder .businessUpdateAsset(businessUpdateAsset2) .network(23) @@ -119,7 +119,7 @@ describe("Business update transaction", () => { expect(error).toBeUndefined(); }); - it("should not throw any error ", () => { + it("should not throw any error", () => { const businessUpdateBuilder = builder .businessUpdateAsset(businessUpdateAsset3) .network(23) diff --git a/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts b/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts index b1cd15120b..077d2c28e2 100644 --- a/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts +++ b/__tests__/unit/core-magistrate-crypto/transactions/entity.test.ts @@ -6,9 +6,9 @@ import { EntityTransaction } from "@arkecosystem/core-magistrate-crypto/src/tran import { Managers, Transactions, Validation } from "@arkecosystem/crypto"; import { generateAssets, generateSpecialAssets } from "../fixtures/entity/assets/generate"; -import { invalidRegisters, validRegisters } from "../fixtures/entity/schemas/register"; -import { invalidResigns, validResigns } from "../fixtures/entity/schemas/resign"; -import { invalidUpdates, validUpdates } from "../fixtures/entity/schemas/update"; +import { invalidRegisters, unserializableRegisters, validRegisters } from "../fixtures/entity/schemas/register"; +import { invalidResigns, unserializableResigns, validResigns } from "../fixtures/entity/schemas/resign"; +import { invalidUpdates, unserializableUpdates, validUpdates } from "../fixtures/entity/schemas/update"; import { checkCommonFields } from "../helper"; let builder: EntityBuilder; @@ -61,6 +61,14 @@ describe("Entity transaction", () => { mockVerifySchema.mockRestore(); }, ); + + it.each( + [...unserializableRegisters, ...unserializableResigns, ...unserializableUpdates].map((asset) => [asset]), + )("should throw error", (asset: Interfaces.IEntityAsset) => { + expect(() => { + builder.asset(asset).sign("passphrase"); + }).toThrowError(); + }); }); describe("Schema tests", () => { @@ -80,16 +88,16 @@ describe("Entity transaction", () => { entityRegistration.getStruct(), ); expect(error).toBeUndefined(); - expect(value.asset).toEqual(asset); + expect(value!.asset).toEqual(asset); }, ); it.each([...invalidRegisters, ...invalidResigns, ...invalidUpdates].map((asset) => [asset]))( "should give validation error", (asset: Interfaces.IEntityAsset) => { - const entityRegistration = builder.asset(asset).sign("passphrase"); + const entity = builder.asset(asset).sign("passphrase"); - const { error } = Validation.validator.validate(transactionSchema, entityRegistration.getStruct()); + const { error } = Validation.validator.validate(transactionSchema, entity.getStruct()); expect(error).not.toBeUndefined(); }, ); diff --git a/__tests__/unit/core-magistrate-transactions/__support__/app.ts b/__tests__/unit/core-magistrate-transactions/__support__/app.ts index 5861c55062..8e33600cef 100644 --- a/__tests__/unit/core-magistrate-transactions/__support__/app.ts +++ b/__tests__/unit/core-magistrate-transactions/__support__/app.ts @@ -27,6 +27,8 @@ import { RevertTransactionAction, ThrowIfCannotEnterPoolAction, VerifyTransactionAction, + OnPoolEnterAction, + OnPoolLeaveAction, } from "@packages/core-transaction-pool/src/actions"; import { DynamicFeeMatcher } from "@packages/core-transaction-pool/src/dynamic-fee-matcher"; import { ExpirationService } from "@packages/core-transaction-pool/src/expiration-service"; @@ -40,6 +42,11 @@ import { TransactionHandlerRegistry } from "@packages/core-transactions/src/hand import { Identities, Utils } from "@packages/crypto"; import { IMultiSignatureAsset } from "@packages/crypto/src/interfaces"; import { ServiceProvider } from "@packages/core-transactions/src/service-provider"; +import { + SecondSignatureVerificationMemoized, + MultiSignatureVerificationMemoized, +} from "@packages/core-transactions/src/verification"; +import { MempoolIndexRegistry } from "@packages/core-transaction-pool/src/mempool-index-registry"; const logger = { notice: jest.fn(), @@ -132,6 +139,7 @@ export const initApp = (): Application => { "maxTransactionsPerSender", 300, ); + app.get(Container.Identifiers.PluginConfiguration).set("memoizerCacheSize", 20000); app.bind(Container.Identifiers.StateStore).to(StateStore).inTransientScope(); @@ -143,6 +151,7 @@ export const initApp = (): Application => { app.bind(Container.Identifiers.TransactionPoolDynamicFeeMatcher).to(DynamicFeeMatcher); app.bind(Container.Identifiers.TransactionPoolExpirationService).to(ExpirationService); + app.bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry).to(MempoolIndexRegistry).inSingletonScope(); app.bind(Container.Identifiers.TransactionPoolSenderMempool).to(SenderMempool); app.bind(Container.Identifiers.TransactionPoolSenderMempoolFactory).toAutoFactory( Container.Identifiers.TransactionPoolSenderMempool, @@ -157,6 +166,14 @@ export const initApp = (): Application => { app.bind(Identifiers.DatabaseTransactionRepository).toConstantValue(Mocks.TransactionRepository.instance); + app.bind(Identifiers.TransactionSecondSignatureVerification) + .to(SecondSignatureVerificationMemoized) + .inSingletonScope(); + + app.bind(Identifiers.TransactionMultiSignatureVerification) + .to(MultiSignatureVerificationMemoized) + .inSingletonScope(); + app.bind(Identifiers.TransactionHandler).to(One.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(Two.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(One.SecondSignatureRegistrationTransactionHandler); @@ -202,6 +219,16 @@ export const initApp = (): Application => { new RevertTransactionAction(), ); + app.get(Container.Identifiers.TriggerService).bind( + "onPoolEnter", + new OnPoolEnterAction(), + ); + + app.get(Container.Identifiers.TriggerService).bind( + "onPoolLeave", + new OnPoolLeaveAction(), + ); + return app; }; diff --git a/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts b/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts index 8cfe420ea6..16624f5c2a 100644 --- a/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts +++ b/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts @@ -1,11 +1,12 @@ import "jest-extended"; -import { Container, Utils } from "@packages/core-kernel"; +import { Container, Contracts, Utils } from "@packages/core-kernel"; import { PoolError } from "@packages/core-kernel/dist/contracts/transaction-pool"; import { Enums } from "@packages/core-magistrate-crypto"; import { EntityBuilder } from "@packages/core-magistrate-crypto/src/builders"; import { EntityAction, EntityType } from "@packages/core-magistrate-crypto/src/enums"; import { EntityTransaction } from "@packages/core-magistrate-crypto/src/transactions"; +import { MempoolIndexes } from "@packages/core-magistrate-transactions/src/enums"; import { EntityAlreadyRegisteredError, EntityAlreadyResignedError, @@ -18,9 +19,9 @@ import { StaticFeeMismatchError, } from "@packages/core-magistrate-transactions/src/errors"; import { EntityTransactionHandler } from "@packages/core-magistrate-transactions/src/handlers/entity"; +import { MempoolIndexRegistry } from "@packages/core-transaction-pool/src/mempool-index-registry"; import { Utils as CryptoUtils } from "@packages/crypto"; import { Managers, Transactions } from "@packages/crypto"; -import { cloneDeep } from "lodash"; import { validRegisters, validResigns, validUpdates } from "./__fixtures__/entity"; import { walletRepository } from "./__mocks__/wallet-repository"; @@ -67,6 +68,11 @@ describe("Entity handler", () => { container.unbindAll(); container.bind(Container.Identifiers.TransactionHistoryService).toConstantValue(transactionHistoryService); container.bind(Container.Identifiers.TransactionPoolQuery).toConstantValue(poolQuery); + container.bind(Container.Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.EntityName); + container + .bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + .to(MempoolIndexRegistry) + .inSingletonScope(); }); let wallet, walletAttributes; @@ -196,39 +202,191 @@ describe("Entity handler", () => { }); it("should resolve", async () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexHas = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "has"); + await expect(entityHandler.throwIfCannotEnterPool(transaction)).toResolve(); - expect(poolQuery.getAll).toHaveBeenCalled(); + + expect(spyOnIndexHas).toHaveBeenCalledTimes(1); + expect(spyOnIndexHas).toHaveBeenCalledWith(transaction.data.asset.data.name.toLowerCase()); }); it("should resolve if transaction action is update or resign", async () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexHas = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "has"); + transaction.data.asset!.action = Enums.EntityAction.Update; await expect(entityHandler.throwIfCannotEnterPool(transaction)).toResolve(); - expect(poolQuery.getAll).not.toHaveBeenCalled(); + expect(spyOnIndexHas).not.toHaveBeenCalled(); transaction.data.asset!.action = Enums.EntityAction.Resign; await expect(entityHandler.throwIfCannotEnterPool(transaction)).toResolve(); - expect(poolQuery.getAll).not.toHaveBeenCalled(); + expect(spyOnIndexHas).not.toHaveBeenCalled(); }); it("should throw if transaction with same type and name is already in the pool", async () => { - poolQuery.has.mockReturnValue(true); + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "has") + .mockReturnValue(true); await expect(entityHandler.throwIfCannotEnterPool(transaction)).rejects.toBeInstanceOf(PoolError); - expect(poolQuery.wherePredicate).toHaveBeenCalledTimes(2); + expect(spyOnIndexHas).toHaveBeenCalledTimes(1); + }); + }); + + describe("onPoolEnter", () => { + let transaction: EntityTransaction; + let entityHandler: EntityTransactionHandler; + + beforeEach(() => { + const builder = new EntityBuilder(); + transaction = builder.asset(validRegisters[0]).sign("passphrase").build() as EntityTransaction; + + entityHandler = container.resolve(EntityTransactionHandler); + }); + + it("should set name on EntityName index, when action is Register", () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "set"); + + expect(entityHandler.onPoolEnter(transaction)).toResolve(); + + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(transaction.data.asset.data.name.toLowerCase(), transaction); + }); + + it("should not set name on EntityName index, when action is not Register", () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "set"); + + transaction.data.asset.action = Enums.EntityAction.Update; + expect(entityHandler.onPoolEnter(transaction)).toResolve(); + expect(spyOnIndexSet).not.toBeCalled(); + + transaction.data.asset.action = Enums.EntityAction.Resign; + expect(entityHandler.onPoolEnter(transaction)).toResolve(); + expect(spyOnIndexSet).not.toBeCalled(); + }); + }); + + describe("onPoolLeave", () => { + let transaction: EntityTransaction; + let entityHandler: EntityTransactionHandler; + + beforeEach(() => { + const builder = new EntityBuilder(); + transaction = builder.asset(validRegisters[0]).sign("passphrase").build() as EntityTransaction; + + entityHandler = container.resolve(EntityTransactionHandler); + }); + + it("should forget name on EntityName index, when action is Register", () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "forget"); + + expect(entityHandler.onPoolLeave(transaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(transaction.data.asset.data.name.toLowerCase()); + }); + + it("should not forget name on EntityName index, when action is not Register", () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "forget"); + + transaction.data.asset.action = Enums.EntityAction.Update; + expect(entityHandler.onPoolLeave(transaction)).toResolve(); + expect(spyOnIndexSet).not.toBeCalled(); + + transaction.data.asset.action = Enums.EntityAction.Resign; + expect(entityHandler.onPoolLeave(transaction)).toResolve(); + expect(spyOnIndexSet).not.toBeCalled(); + }); + }); + + describe("getInvalidPoolTransactions", () => { + let transaction: EntityTransaction; + let invalidTransaction: EntityTransaction; + let entityHandler: EntityTransactionHandler; + + beforeEach(() => { + const builder = new EntityBuilder(); + transaction = builder.asset(validRegisters[0]).sign("passphrase").build() as EntityTransaction; + invalidTransaction = builder + .asset(validRegisters[0]) + .sign("another_passphrase") + .build() as EntityTransaction; + + entityHandler = container.resolve(EntityTransactionHandler); + }); + + it("should return empty array if there are no invalid transactions", async () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "has") + .mockReturnValueOnce(false); + + await expect(entityHandler.getInvalidPoolTransactions(transaction)).resolves.toEqual([]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(transaction.data.asset.data.name.toLowerCase()); + }); + + it("should return invalid transaction if transaction with same username is indexed", async () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "has") + .mockReturnValueOnce(true); + + transaction.data.asset.action = Enums.EntityAction.Update; + await expect(entityHandler.getInvalidPoolTransactions(transaction)).resolves.toEqual([]); + expect(spyOnIndexHas).not.toBeCalled(); + + transaction.data.asset.action = Enums.EntityAction.Resign; + await expect(entityHandler.getInvalidPoolTransactions(transaction)).resolves.toEqual([]); + expect(spyOnIndexHas).not.toBeCalled(); + }); + + it("should return empty array if transaction is not Register", async () => { + const mempoolIndexRegistry = container.get( + Container.Identifiers.TransactionPoolMempoolIndexRegistry, + ); - const transactionClone = cloneDeep(transaction); - const wherePredicateCallback1 = poolQuery.wherePredicate.mock.calls[0][0]; - const wherePredicateCallback2 = poolQuery.wherePredicate.mock.calls[1][0]; + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "has") + .mockReturnValueOnce(true); - expect(wherePredicateCallback1(transactionClone)).toBeTrue(); - expect(wherePredicateCallback2(transactionClone)).toBeTrue(); + const spyOnIndexGet = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.EntityName), "get") + .mockReturnValueOnce(invalidTransaction); - delete transactionClone.data.asset; - expect(wherePredicateCallback1(transactionClone)).toBeFalse(); - expect(wherePredicateCallback2(transactionClone)).toBeFalse(); + await expect(entityHandler.getInvalidPoolTransactions(transaction)).resolves.toEqual([invalidTransaction]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(transaction.data.asset.data.name.toLowerCase()); + expect(spyOnIndexGet).toBeCalledTimes(1); + expect(spyOnIndexGet).toBeCalledWith(transaction.data.asset.data.name.toLowerCase()); }); }); diff --git a/__tests__/unit/core-p2p/actions/validate-and-accept-peer.test.ts b/__tests__/unit/core-p2p/actions/validate-and-accept-peer.test.ts index 31921de9a6..424a314cba 100644 --- a/__tests__/unit/core-p2p/actions/validate-and-accept-peer.test.ts +++ b/__tests__/unit/core-p2p/actions/validate-and-accept-peer.test.ts @@ -14,10 +14,11 @@ describe("ValidateAndAcceptPeerAction", () => { it("should call peerProcessor.validateAndAcceptPeer with arguments provided", async () => { const peer = { ip: "187.165.33.2", port: 4000 }; const options = { someParam: 1 }; - await validateAndAcceptPeerAction.execute({ peer, options }); + const headers = { version: "3.0.0" }; + await validateAndAcceptPeerAction.execute({ peer, options, headers }); expect(peerProcessor.validateAndAcceptPeer).toBeCalledTimes(1); - expect(peerProcessor.validateAndAcceptPeer).toBeCalledWith(peer, options); + expect(peerProcessor.validateAndAcceptPeer).toBeCalledWith(peer, headers, options); }); }); }); diff --git a/__tests__/unit/core-p2p/hapi-nes/client.test.ts b/__tests__/unit/core-p2p/hapi-nes/client.test.ts index 21a1181e83..8ced280278 100644 --- a/__tests__/unit/core-p2p/hapi-nes/client.test.ts +++ b/__tests__/unit/core-p2p/hapi-nes/client.test.ts @@ -969,7 +969,7 @@ describe("Client", () => { await expect(client.request("/")).rejects.toThrowError("Request timed out"); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 300); diff --git a/__tests__/unit/core-p2p/hapi-nes/socket.test.ts b/__tests__/unit/core-p2p/hapi-nes/socket.test.ts index 78a64f0e1f..f6f54395ab 100644 --- a/__tests__/unit/core-p2p/hapi-nes/socket.test.ts +++ b/__tests__/unit/core-p2p/hapi-nes/socket.test.ts @@ -223,7 +223,7 @@ describe("Socket", () => { const client = new Ws("http://localhost:" + server.info.port); client.onerror = Hoek.ignore; - const sendInvalid = async () => new Promise((resolve, reject) => { + const sendInvalid = async () => new Promise((resolve, reject) => { client.on("open", () => { client.send("{", {} as any, () => resolve()); }); @@ -301,7 +301,7 @@ describe("Socket", () => { client.onerror = Hoek.ignore; client.on("open", () => client.send(stringifyNesMessage({ id: 1, type: "??", version: "2" }), Hoek.ignore)); - + await delay(1000); expect(client.readyState).toEqual(client.CLOSED); @@ -337,7 +337,7 @@ describe("Socket", () => { client.onerror = Hoek.ignore; client.on("open", () => client.send(stringifyNesMessage({ id: 1, type: "hello" }), Hoek.ignore)); - + await delay(1000); expect(client.readyState).toEqual(client.CLOSED); @@ -359,7 +359,7 @@ describe("Socket", () => { const client = new Ws("http://localhost:" + server.info.port); client.onerror = Hoek.ignore; - const sendPingOrPong = async () => new Promise((resolve, reject) => { + const sendPingOrPong = async () => new Promise((resolve, reject) => { client.on("open", () => { client[method]("", true, () => resolve()); }); diff --git a/__tests__/unit/core-p2p/network-monitor.test.ts b/__tests__/unit/core-p2p/network-monitor.test.ts index 88396ea25a..f81a71e64d 100644 --- a/__tests__/unit/core-p2p/network-monitor.test.ts +++ b/__tests__/unit/core-p2p/network-monitor.test.ts @@ -353,7 +353,7 @@ describe("NetworkMonitor", () => { }); }); - it("should schedule the next updateNetworkStatus only once", async () => { + it.skip("should schedule the next updateNetworkStatus only once", async () => { repository.getPeers.mockReturnValue([]); let sleeping = true; @@ -400,7 +400,7 @@ describe("NetworkMonitor", () => { expect(communicator.ping).toBeCalledTimes(peers.length); for (const peer of peers) { - expect(communicator.ping).toBeCalledWith(peer, config.verifyTimeout, expect.anything()); + expect(communicator.ping).toBeCalledWith(peer, config.verifyTimeout, expect.anything(), false); } }); @@ -412,7 +412,7 @@ describe("NetworkMonitor", () => { expect(communicator.ping).toBeCalledTimes(peers.length); for (const peer of peers) { - expect(communicator.ping).toBeCalledWith(peer, config.verifyTimeout, expect.anything()); + expect(communicator.ping).toBeCalledWith(peer, config.verifyTimeout, expect.anything(), false); } }); @@ -1120,7 +1120,7 @@ describe("NetworkMonitor", () => { ); describe("when blockPing.last - blockPing.first < 500ms", () => { - it("should not wait if block is from forger", async () => { + it.skip("should not wait if block is from forger", async () => { blockchain.getBlockPing = jest .fn() .mockReturnValue({ block: block.data, last: 10500, first: 10200, count: 2, fromForger: true }); @@ -1132,7 +1132,7 @@ describe("NetworkMonitor", () => { expect(spySleep).toBeCalledTimes(0); }); - it("should wait until 500ms have elapsed between blockPing.last and blockPing.first before broadcasting", async () => { + it.skip("should wait until 500ms have elapsed between blockPing.last and blockPing.first before broadcasting", async () => { blockchain.getBlockPing = jest .fn() .mockReturnValue({ block: block.data, last: 10500, first: 10200, count: 2 }); @@ -1145,7 +1145,7 @@ describe("NetworkMonitor", () => { expect(spySleep).toBeCalledWith(200); // 500 - (last - first) }); - it("should not broadcast if during waiting we have received a new block", async () => { + it.skip("should not broadcast if during waiting we have received a new block", async () => { blockchain.getBlockPing = jest .fn() .mockReturnValueOnce({ block: block.data, last: 10500, first: 10200, count: 2 }) diff --git a/__tests__/unit/core-p2p/network-state.test.ts b/__tests__/unit/core-p2p/network-state.test.ts index 76ef3bc935..979f5c38ab 100644 --- a/__tests__/unit/core-p2p/network-state.test.ts +++ b/__tests__/unit/core-p2p/network-state.test.ts @@ -2,7 +2,7 @@ import { Container, Utils as KernelUtils } from "@packages/core-kernel"; import { NetworkStateStatus } from "@packages/core-p2p/src/enums"; import { NetworkState } from "@packages/core-p2p/src/network-state"; import { Peer } from "@packages/core-p2p/src/peer"; -import { PeerVerificationResult } from "@packages/core-p2p/src/peer-verifier"; +import { FastPeerVerificationResult } from "@packages/core-p2p/src/peer-verifier"; import { Blocks, Crypto, Utils } from "@packages/crypto"; describe("NetworkState", () => { @@ -99,7 +99,7 @@ describe("NetworkState", () => { peer3.state = { header: {}, height: 8, forgingAllowed: true, currentSlot: currentSlot }; // same height const peer4 = new Peer("184.168.65.65", 4000); peer4.state = { header: {}, height: 6, forgingAllowed: false, currentSlot: currentSlot - 2 }; // below height - peer4.verificationResult = new PeerVerificationResult(8, 6, 4); // forked + peer4.fastVerificationResult = new FastPeerVerificationResult(8, 6); // forked const peer5 = new Peer("185.168.65.65", 4000); peer5.state = { header: {}, height: 6, forgingAllowed: false, currentSlot: currentSlot - 2 }; // below height, not forked peers = [peer1, peer2, peer3, peer4, peer5]; diff --git a/__tests__/unit/core-p2p/peer-communicator.test.ts b/__tests__/unit/core-p2p/peer-communicator.test.ts index a1e004c2f3..5484ed52db 100644 --- a/__tests__/unit/core-p2p/peer-communicator.test.ts +++ b/__tests__/unit/core-p2p/peer-communicator.test.ts @@ -33,7 +33,7 @@ describe("PeerCommunicator", () => { const logger = { warning: jest.fn(), debug: jest.fn(), error: jest.fn(), info: jest.fn() }; const configuration = { getOptional: jest.fn(), getRequired: jest.fn() }; - const peerVerifier = { initialize: () => {}, checkState: jest.fn() }; + const peerVerifier = { initialize: () => {}, checkState: jest.fn(), checkStateFast: jest.fn() }; peerVerifier.initialize = () => peerVerifier; const version = "3.0.0"; const headers = { version }; @@ -249,6 +249,23 @@ describe("PeerCommunicator", () => { const pingResult = await peerCommunicator.ping(peer, 6000); + expect(peerVerifier.checkState).toBeCalledTimes(1); + expect(connector.emit).toBeCalledTimes(1); + expect(connector.emit).toBeCalledWith(peer, event, { headers }, 5000); + expect(pingResult).toEqual(baseGetStatusResponse.state); + }); + + it("should not throw otherwise using fast option", async () => { + const event = "p2p.peer.getStatus"; + const peer = new Peer("187.168.65.65", 4000); + const pingResponse = baseGetStatusResponse; + connector.emit = jest.fn().mockReturnValueOnce({ payload: pingResponse }); + configuration.getOptional = jest.fn().mockReturnValueOnce([baseGetStatusResponse.config.version]); // minimumVersions + peerVerifier.checkStateFast = jest.fn().mockReturnValueOnce(new PeerVerificationResult(1, 1, 1)); + + const pingResult = await peerCommunicator.ping(peer, 6000, false, true); + + expect(peerVerifier.checkStateFast).toBeCalledTimes(1); expect(connector.emit).toBeCalledTimes(1); expect(connector.emit).toBeCalledWith(peer, event, { headers }, 5000); expect(pingResult).toEqual(baseGetStatusResponse.state); diff --git a/__tests__/unit/core-p2p/peer-processor.test.ts b/__tests__/unit/core-p2p/peer-processor.test.ts index 163d4d06c7..0d7d8a6a79 100644 --- a/__tests__/unit/core-p2p/peer-processor.test.ts +++ b/__tests__/unit/core-p2p/peer-processor.test.ts @@ -68,7 +68,7 @@ describe("PeerProcessor", () => { const peer = new Peer("178.165.55.55", 4000); peerRepository.getSameSubnetPeers = jest.fn().mockReturnValueOnce([]); - await peerProcessor.validateAndAcceptPeer(peer); + await peerProcessor.validateAndAcceptPeer(peer, {}); expect(peerRepository.setPendingPeer).toBeCalledTimes(1); expect(peerCommunicator.ping).toBeCalledTimes(1); @@ -82,7 +82,7 @@ describe("PeerProcessor", () => { const peer = new Peer("178.165.55.55", 4000); peerRepository.getSameSubnetPeers = jest.fn().mockReturnValueOnce([]); - await peerProcessor.validateAndAcceptPeer(peer); + await peerProcessor.validateAndAcceptPeer(peer, {}); expect(peerRepository.setPendingPeer).toBeCalledTimes(1); expect(peerCommunicator.ping).toBeCalledTimes(1); @@ -96,7 +96,7 @@ describe("PeerProcessor", () => { const peer = new Peer("178.165.55.55", 4000); peerRepository.getSameSubnetPeers = jest.fn().mockReturnValueOnce([]); - await peerProcessor.validateAndAcceptPeer(peer); + await peerProcessor.validateAndAcceptPeer(peer, {}); expect(peerRepository.setPendingPeer).toBeCalledTimes(1); expect(peerCommunicator.ping).toBeCalledTimes(1); @@ -108,7 +108,7 @@ describe("PeerProcessor", () => { peerRepository.getSameSubnetPeers = jest.fn().mockReturnValueOnce([]); peerCommunicator.ping = jest.fn().mockRejectedValueOnce(new Error("ping threw")); - await peerProcessor.validateAndAcceptPeer(peer); + await peerProcessor.validateAndAcceptPeer(peer, {}); expect(peerRepository.setPendingPeer).toBeCalledTimes(1); expect(peerCommunicator.ping).toBeCalledTimes(1); @@ -121,7 +121,7 @@ describe("PeerProcessor", () => { peerRepository.getSameSubnetPeers = jest.fn().mockReturnValueOnce([]); peerRepository.hasPeer = jest.fn().mockReturnValueOnce(true); - await peerProcessor.validateAndAcceptPeer(peer); + await peerProcessor.validateAndAcceptPeer(peer, {}); expect(peerRepository.setPendingPeer).toBeCalledTimes(0); expect(peerCommunicator.ping).toBeCalledTimes(0); diff --git a/__tests__/unit/core-p2p/peer-verifier.test.ts b/__tests__/unit/core-p2p/peer-verifier.test.ts index f8f1d1efe8..582e4b5185 100644 --- a/__tests__/unit/core-p2p/peer-verifier.test.ts +++ b/__tests__/unit/core-p2p/peer-verifier.test.ts @@ -1,6 +1,6 @@ import { Application, Container, Contracts } from "@packages/core-kernel"; import { Peer } from "@packages/core-p2p/src/peer"; -import { PeerVerificationResult, PeerVerifier } from "@packages/core-p2p/src/peer-verifier"; +import { PeerVerificationResult, FastPeerVerificationResult, PeerVerifier } from "@packages/core-p2p/src/peer-verifier"; import { Blocks } from "@packages/crypto"; describe("PeerVerifier", () => { @@ -395,7 +395,7 @@ describe("PeerVerifier", () => { stateStore.getLastHeight = jest .fn() .mockReturnValueOnce(claimedState.height) - .mockRejectedValueOnce(undefined); + .mockReturnValueOnce(undefined); stateStore.getLastBlocks = jest .fn() .mockReturnValueOnce([{ data: { height: claimedState.height }, getHeader: () => ourHeader }]); @@ -807,4 +807,349 @@ describe("PeerVerifier", () => { }); }); }); + + describe("checkStateFast", () => { + describe("when claimed state block header does not match claimed state height", () => { + it("should return undefined", async () => { + const claimedState: Contracts.P2P.PeerState = { + height: 18, + forgingAllowed: false, + currentSlot: 18, + header: { + height: 19, + id: "13965046748333390338", + }, + }; + + expect(await peerVerifier.checkState(claimedState, Date.now() + 2000)).toBeUndefined(); + }); + }); + + describe("when Case1. Peer height > our height and our highest block is part of the peer's chain", () => { + it("should return PeerVerificationResult forked", async () => { + const generatorPublicKey = "03c5282b639d0e8f94cfac6c0ed242d1634d8a2c93cbd76c6ed2856a9f19cf6a13"; + const claimedState: Contracts.P2P.PeerState = { + height: 18, + forgingAllowed: false, + currentSlot: 18, + header: { + height: 18, + id: "13965046748333390338", + generatorPublicKey, + }, + }; + const ourHeader = { + height: 15, + id: "11165046748333390338", + }; + + stateStore.getLastHeight = jest.fn().mockReturnValue(ourHeader.height); + stateStore.getLastBlocks = jest + .fn() + .mockReturnValue([{ data: { height: ourHeader.height }, getHeader: () => ourHeader }]); + databaseInterceptor.getBlocksByHeight = jest.fn().mockImplementation((blockHeights) => + blockHeights.map((height: number) => ({ + height, + id: height.toString().padStart(2, "0").repeat(20), // just using height to mock the id + })), + ); + peerCommunicator.hasCommonBlocks = jest.fn().mockImplementation((_, ids) => ({ + id: ids[ids.length - 1], + height: parseInt(ids[ids.length - 1].slice(0, 2)), + })); + trigger.call = jest.fn().mockReturnValue([ + { + getPublicKey: () => { + return generatorPublicKey; + }, + }, + ]); + const spyFromData = jest + .spyOn(Blocks.BlockFactory, "fromData") + .mockImplementation(blockWithIdFromDataMock); + + const result = await peerVerifier.checkStateFast(claimedState, Date.now() + 2000); + + expect(result).toBeInstanceOf(FastPeerVerificationResult); + expect(result.forked).toBeTrue(); + expect(result.myHeight).toEqual(15); + expect(result.hisHeight).toEqual(18); + expect(result.highestCommonHeight).toBeUndefined(); + + spyFromData.mockRestore(); + peerCommunicator.getPeerBlocks = jest.fn(); + databaseInterceptor.getBlocksByHeight = jest.fn(); + peerCommunicator.hasCommonBlocks = jest.fn(); + stateStore.getLastHeight = jest.fn(); + trigger.call = jest.fn(); + stateStore.getLastBlocks = jest.fn(); + }); + }); + + describe("when Case2. Peer height > our height and our highest block is not part of the peer's chain", () => { + const claimedState: Contracts.P2P.PeerState = { + height: 18, + forgingAllowed: false, + currentSlot: 18, + header: { + height: 18, + id: "13965046748333390338", + }, + }; + const ourHeader = { + height: 15, + id: "11165046748333390338", + }; + + it("should return PeerVerificationResult forked", async () => { + const generatorPublicKey = "03c5282b639d0e8f94cfac6c0ed242d1634d8a2c93cbd76c6ed2856a9f19cf6a13"; + stateStore.getLastHeight = jest + .fn() + .mockReturnValueOnce(ourHeader.height) + .mockReturnValueOnce(ourHeader.height); + stateStore.getLastBlocks = jest + .fn() + .mockReturnValueOnce([{ data: { height: ourHeader.height }, getHeader: () => ourHeader }]); + databaseInterceptor.getBlocksByHeight = jest.fn().mockImplementation((blockHeights) => + blockHeights.map((height: number) => ({ + height, + id: height.toString().padStart(2, "0").repeat(20), // just using height to mock the id + })), + ); + trigger.call = jest.fn().mockReturnValue([ + { + getPublicKey: () => { + return generatorPublicKey; + }, + }, + ]); // getActiveDelegates mock + const spyFromData = jest.spyOn(Blocks.BlockFactory, "fromData").mockImplementation(blockFromDataMock); + + const result = await peerVerifier.checkStateFast(claimedState, Date.now() + 2000); + + expect(result).toBeInstanceOf(FastPeerVerificationResult); + expect(result.forked).toBeTrue(); + expect(result.myHeight).toEqual(15); + expect(result.hisHeight).toEqual(18); + expect(result.highestCommonHeight).toBeUndefined(); + + spyFromData.mockRestore(); + peerCommunicator.getPeerBlocks = jest.fn(); + databaseInterceptor.getBlocksByHeight = jest.fn(); + peerCommunicator.hasCommonBlocks = jest.fn(); + }); + }); + + describe("when Case3. Peer height == our height and our latest blocks are the same", () => { + const claimedState: Contracts.P2P.PeerState = { + height: 15, + forgingAllowed: false, + currentSlot: 15, + header: { + height: 15, + id: "13965046748333390338", + }, + }; + + it("should return PeerVerificationResult not forked", async () => { + stateStore.getLastHeight = jest.fn().mockReturnValueOnce(claimedState.height); + stateStore.getLastBlocks = jest + .fn() + .mockReturnValueOnce([ + { data: { height: claimedState.height }, getHeader: () => claimedState.header }, + ]); + databaseInterceptor.getBlocksByHeight = jest.fn().mockReturnValueOnce([{ id: claimedState.header.id }]); + + const result = await peerVerifier.checkStateFast(claimedState, Date.now() + 2000); + + expect(result).toBeInstanceOf(FastPeerVerificationResult); + expect(result.forked).toBeFalse(); + expect(result.myHeight).toEqual(15); + expect(result.hisHeight).toEqual(15); + expect(result.highestCommonHeight).toEqual(15); + }); + }); + + describe("when Case4. Peer height == our height and our latest blocks differ", () => { + const claimedState: Contracts.P2P.PeerState = { + height: 15, + forgingAllowed: false, + currentSlot: 15, + header: { + height: 15, + id: "13965046748333390338", + }, + }; + const ourHeader = { + height: 15, + id: "11165046748333390338", + }; + + it.each([[true], [false]])( + "should return PeerVerificationResult forked when claimed state block header is valid", + async (delegatesEmpty) => { + const generatorPublicKey = "03c5282b639d0e8f94cfac6c0ed242d1634d8a2c93cbd76c6ed2856a9f19cf6a13"; + stateStore.getLastHeight = jest + .fn() + .mockReturnValueOnce(claimedState.height) + .mockReturnValueOnce(claimedState.height); + stateStore.getLastBlocks = jest + .fn() + .mockReturnValueOnce([{ data: { height: claimedState.height }, getHeader: () => ourHeader }]); + databaseInterceptor.getBlocksByHeight = jest + .fn() + .mockReturnValueOnce([{ id: ourHeader.id }]) + .mockImplementation((blockHeights) => + blockHeights.map((height: number) => ({ + height, + id: height.toString().padStart(2, "0").repeat(20), // just using height to mock the id + })), + ); + + if (delegatesEmpty) { + // getActiveDelegates return empty array, should still work using dpos state + trigger.call = jest.fn().mockReturnValue([]); // getActiveDelegates mock + dposState.getRoundInfo = jest + .fn() + .mockReturnValueOnce({ round: 1, maxDelegates: 51 }) + .mockReturnValueOnce({ round: 1, maxDelegates: 51 }); + dposState.getRoundDelegates = jest + .fn() + .mockReturnValueOnce([ + { + getPublicKey: () => { + return generatorPublicKey; + }, + }, + ]) + .mockReturnValueOnce([ + { + getPublicKey: () => { + return generatorPublicKey; + }, + }, + ]); + } else { + trigger.call = jest.fn().mockReturnValue([ + { + getPublicKey: () => { + return generatorPublicKey; + }, + }, + ]); // getActiveDelegates mock + } + + const spyFromData = jest + .spyOn(Blocks.BlockFactory, "fromData") + .mockImplementation(blockFromDataMock); + + const result = await peerVerifier.checkStateFast(claimedState, Date.now() + 2000); + + expect(result).toBeInstanceOf(FastPeerVerificationResult); + expect(result.forked).toBeTrue(); + expect(result.myHeight).toEqual(15); + expect(result.hisHeight).toEqual(15); + expect(result.highestCommonHeight).toBeUndefined(); + + spyFromData.mockRestore(); + peerCommunicator.getPeerBlocks = jest.fn(); + databaseInterceptor.getBlocksByHeight = jest.fn(); + peerCommunicator.hasCommonBlocks = jest.fn(); + }, + ); + }); + + describe("when Case5. Peer height < our height and peer's latest block is part of our chain", () => { + const claimedState: Contracts.P2P.PeerState = { + height: 15, + forgingAllowed: false, + currentSlot: 15, + header: { + height: 15, + id: "13965046748333390338", + }, + }; + const ourHeight = claimedState.height + 2; + const ourHeader = { + height: ourHeight, + id: "6857401089891373446", + }; + + it("should return PeerVerificationResult not forked", async () => { + stateStore.getLastHeight = jest.fn().mockReturnValueOnce(ourHeight); + stateStore.getLastBlocks = jest.fn().mockReturnValueOnce([ + { data: { height: ourHeight }, getHeader: () => ourHeader }, + { data: { height: claimedState.height }, getHeader: () => claimedState.header }, + ]); + databaseInterceptor.getBlocksByHeight = jest.fn().mockReturnValueOnce([{ id: claimedState.header.id }]); + + const result = await peerVerifier.checkStateFast(claimedState, Date.now() + 2000); + + expect(result).toBeInstanceOf(FastPeerVerificationResult); + expect(result.forked).toBeFalse(); + expect(result.myHeight).toEqual(17); + expect(result.hisHeight).toEqual(15); + expect(result.highestCommonHeight).toEqual(15); + }); + }); + + describe("when Case6. Peer height < our height and peer's latest block is not part of our chain", () => { + const generatorPublicKey = "03c5282b639d0e8f94cfac6c0ed242d1634d8a2c93cbd76c6ed2856a9f19cf6a13"; + const claimedState: Contracts.P2P.PeerState = { + height: 12, + forgingAllowed: false, + currentSlot: 12, + header: { + height: 12, + id: "13965046748333390338", + generatorPublicKey, + }, + }; + const ourHeader = { + height: 15, + id: "11165046748333390338", + }; + + it("should return PeerVerificationResult forked", async () => { + stateStore.getLastHeight = jest + .fn() + .mockReturnValueOnce(ourHeader.height) + .mockReturnValueOnce(ourHeader.height); + stateStore.getLastBlocks = jest + .fn() + .mockReturnValueOnce([{ data: { height: ourHeader.height }, getHeader: () => ourHeader }]); + databaseInterceptor.getBlocksByHeight = jest + .fn() + .mockReturnValueOnce([{ id: ourHeader.id }]) + .mockImplementation((blockHeights) => + blockHeights.map((height: number) => ({ + height, + id: height.toString().padStart(2, "0").repeat(20), // just using height to mock the id + })), + ); + trigger.call = jest.fn().mockReturnValue([ + { + getPublicKey: () => { + return generatorPublicKey; + }, + }, + ]); + + const spyFromData = jest.spyOn(Blocks.BlockFactory, "fromData").mockImplementation(blockFromDataMock); + + const result = await peerVerifier.checkStateFast(claimedState, Date.now() + 2000); + + expect(result).toBeInstanceOf(FastPeerVerificationResult); + expect(result.forked).toBeTrue(); + expect(result.myHeight).toEqual(15); + expect(result.hisHeight).toEqual(12); + expect(result.highestCommonHeight).toBeUndefined(); + + spyFromData.mockRestore(); + peerCommunicator.getPeerBlocks = jest.fn(); + databaseInterceptor.getBlocksByHeight = jest.fn(); + peerCommunicator.hasCommonBlocks = jest.fn(); + }); + }); + }); }); diff --git a/__tests__/unit/core-p2p/socket-server/controllers/blocks.test.ts b/__tests__/unit/core-p2p/socket-server/controllers/blocks.test.ts index 596675664a..291fde99b4 100644 --- a/__tests__/unit/core-p2p/socket-server/controllers/blocks.test.ts +++ b/__tests__/unit/core-p2p/socket-server/controllers/blocks.test.ts @@ -4,6 +4,7 @@ import { BlocksController } from "@packages/core-p2p/src/socket-server/controlle import { TooManyTransactionsError } from "@packages/core-p2p/src/socket-server/errors"; import { Sandbox } from "@packages/core-test-framework"; import { Blocks, Identities, Managers, Networks, Transactions, Utils } from "@packages/crypto"; +import { cloneDeep } from "lodash"; Managers.configManager.getMilestone().aip11 = true; // for creating aip11 v2 transactions @@ -65,11 +66,10 @@ describe("BlocksController", () => { .build(), ], } as Blocks.Block; - const deepClone = (obj) => JSON.parse(JSON.stringify(obj)); describe("when block contains too many transactions", () => { it("should throw TooManyTransactionsError when numberOfTransactions is too much", async () => { - const blockTooManyTxs = deepClone(block); + const blockTooManyTxs = cloneDeep(block); blockTooManyTxs.data.numberOfTransactions = 350; const blockSerialized = Blocks.Serializer.serializeWithTransactions({ ...blockTooManyTxs.data, @@ -87,7 +87,7 @@ describe("BlocksController", () => { blockchain.getLastHeight.mockReturnValueOnce(100); blockchain.getLastDownloadedBlock.mockReturnValueOnce(Networks.testnet.genesisBlock); - const blockUnchained = deepClone(block); + const blockUnchained = cloneDeep(block); blockUnchained.data.height = 9; const blockSerialized = Blocks.Serializer.serializeWithTransactions({ ...blockUnchained.data, diff --git a/__tests__/unit/core-p2p/socket-server/controllers/internal.test.ts b/__tests__/unit/core-p2p/socket-server/controllers/internal.test.ts index 4e88119715..2df66acc2c 100644 --- a/__tests__/unit/core-p2p/socket-server/controllers/internal.test.ts +++ b/__tests__/unit/core-p2p/socket-server/controllers/internal.test.ts @@ -42,7 +42,7 @@ describe("InternalController", () => { await internalController.acceptNewPeer({ payload: { ip } }, {}); expect(peerProcessor.validateAndAcceptPeer).toBeCalledTimes(1); - expect(peerProcessor.validateAndAcceptPeer).toBeCalledWith({ ip }); + expect(peerProcessor.validateAndAcceptPeer).toBeCalledWith({ ip }, {}); }); }); diff --git a/__tests__/unit/core-p2p/socket-server/plugins/accept-peer.test.ts b/__tests__/unit/core-p2p/socket-server/plugins/accept-peer.test.ts index 3347ba030a..239398f31b 100644 --- a/__tests__/unit/core-p2p/socket-server/plugins/accept-peer.test.ts +++ b/__tests__/unit/core-p2p/socket-server/plugins/accept-peer.test.ts @@ -66,7 +66,7 @@ describe("AcceptPeerPlugin", () => { expect(JSON.parse(responseValid.payload)).toEqual(responsePayload); expect(responseValid.statusCode).toBe(200); expect(peerProcessor.validateAndAcceptPeer).toBeCalledTimes(1); - expect(peerProcessor.validateAndAcceptPeer).toBeCalledWith({ ip: remoteAddress }); + expect(peerProcessor.validateAndAcceptPeer).toBeCalledWith({ ip: remoteAddress }, {}); }); it("should not be called on another route", async () => { diff --git a/__tests__/unit/core-p2p/utils/is-valid-version.test.ts b/__tests__/unit/core-p2p/utils/is-valid-version.test.ts index 6b33153050..3930a2e70b 100644 --- a/__tests__/unit/core-p2p/utils/is-valid-version.test.ts +++ b/__tests__/unit/core-p2p/utils/is-valid-version.test.ts @@ -5,53 +5,104 @@ import { Peer } from "@arkecosystem/core-p2p/src/peer"; import { Managers } from "@arkecosystem/crypto"; let peerMock: Peer; +const getOptional = jest.fn().mockReturnValue([]); const app = { getTagged: jest.fn().mockReturnValue({ - getOptional: jest.fn().mockReturnValue(["^2.6.0"]), + getOptional, }), + get: jest.fn().mockReturnValue("mainnet"), } as any; beforeEach(async () => { peerMock = new Peer("1.0.0.99", 4002); }); -describe.each([[true], [false]])("isValidVersion", (withMilestones) => { - let spyGetMilestone = jest.spyOn(Managers.configManager, "getMilestone"); - beforeEach(() => { - if (withMilestones) { - spyGetMilestone = jest.spyOn(Managers.configManager, "getMilestone").mockReturnValue({ - p2p: { - minimumVersions: ["^2.6.0"] - } - }); - } - }) - afterEach(() => { - spyGetMilestone.mockRestore(); - }) - - it.each([["2.6.0"], ["2.6.666"], ["2.7.0"], ["2.8.0"], ["2.9.0"], ["2.9.934"]])( - "should be a valid version", - (version) => { - peerMock.version = version; - expect(isValidVersion(app, peerMock)).toBeTrue(); - }, - ); +describe("isValidVersion", () => { + it("should return false if version is not defined", () => { + expect(isValidVersion(app, peerMock)).toBeFalse(); + }); - it.each([ - [undefined] - ["2.4.0"], - ["2.5.0"], - ["1.0.0"], - ["---aaa"], - ["2490"], - [2], - [-10.2], - [{}], - [true], - [() => 1], - ["2.0.0.0"], - ])("should be an invalid version", (version: any) => { + it.each(["a", "3", "3.6", "-3.4.0", "3.0.0.next.1"])("should return false if version is not valid", (version) => { peerMock.version = version; expect(isValidVersion(app, peerMock)).toBeFalse(); }); + + it.each(["3.0.0", "3.0.0-next.1"])("should return true if minVersion is not set", (version) => { + peerMock.version = version; + expect(isValidVersion(app, peerMock)).toBeTrue(); + }); + + const tests = [ + { network: "mainnet", version: "3.0.0", minVersion: ["3.0.0"], result: true }, + { network: "mainnet", version: "3.0.0", minVersion: ["3.0.0", "2.0.0"], result: true }, + { network: "mainnet", version: "4.0.0", minVersion: [">=3.0.0 || <=5.0.0"], result: true }, + { network: "mainnet", version: "3.0.1", minVersion: ["3.0.0"], result: false }, + { network: "mainnet", version: "3.0.13", minVersion: [">=3.0.0"], result: true }, + { network: "mainnet", version: "4.0.0", minVersion: [">=3.0.0"], result: true }, + { network: "mainnet", version: "3.3.3", minVersion: ["^3.0.0"], result: true }, + { network: "mainnet", version: "4.0.0", minVersion: ["^3.0.0"], result: false }, + { network: "mainnet", version: "4.0.0-next.1", minVersion: [">=3.0.0"], result: false }, + { network: "devnet", version: "4.0.0-next.1", minVersion: [">=3.0.0"], result: true }, + { network: "mainnet", version: "3.0.0", minVersion: [], result: true }, + ]; + it.each(tests)("minVersion in milestones", (test) => { + const spyGet = jest.spyOn(Managers.configManager, "get").mockReturnValue(test.network); + const spyGetMilestone = jest.spyOn(Managers.configManager, "getMilestone").mockReturnValue({ + p2p: { + minimumVersions: test.minVersion, + }, + }); + + peerMock.version = test.version; + expect(isValidVersion(app, peerMock)).toEqual(test.result); + expect(spyGet).toBeCalled(); + expect(spyGetMilestone).toBeCalled(); + }); + + it.each(tests)("minVersion in config", (test) => { + const spyGet = jest.spyOn(Managers.configManager, "get").mockReturnValue(test.network); + getOptional.mockReturnValue(test.minVersion); + + peerMock.version = test.version; + expect(isValidVersion(app, peerMock)).toEqual(test.result); + expect(spyGet).toBeCalled(); + expect(getOptional).toBeCalled(); + }); + + it.each([ + { + network: "mainnet", + version: "3.0.0", + minConfigVersion: ["3.0.0"], + minMilestonesVersion: ["3.0.0"], + result: true, + }, + { + network: "mainnet", + version: "3.0.0", + minConfigVersion: ["4.0.0"], + minMilestonesVersion: ["3.0.0"], + result: false, + }, + { + network: "mainnet", + version: "3.0.0", + minConfigVersion: ["3.0.0"], + minMilestonesVersion: ["4.0.0"], + result: false, + }, + ])("should pass configuration and milestone minVersion", (test) => { + const spyGet = jest.spyOn(Managers.configManager, "get").mockReturnValue(test.network); + const spyGetMilestone = jest.spyOn(Managers.configManager, "getMilestone").mockReturnValue({ + p2p: { + minimumVersions: test.minMilestonesVersion, + }, + }); + getOptional.mockReturnValue(test.minConfigVersion); + + peerMock.version = test.version; + expect(isValidVersion(app, peerMock)).toEqual(test.result); + expect(spyGet).toBeCalled(); + expect(spyGetMilestone).toBeCalled(); + expect(getOptional).toBeCalled(); + }); }); diff --git a/__tests__/unit/core-snapshots/workers/actions/test-worker-action.test.ts b/__tests__/unit/core-snapshots/workers/actions/test-worker-action.test.ts index 60d19d739e..a9b51a6159 100644 --- a/__tests__/unit/core-snapshots/workers/actions/test-worker-action.test.ts +++ b/__tests__/unit/core-snapshots/workers/actions/test-worker-action.test.ts @@ -45,7 +45,7 @@ describe("TestWorkerAction", () => { const promise = testWorkerAction.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 10); @@ -53,7 +53,7 @@ describe("TestWorkerAction", () => { testWorkerAction.sync({}); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 10); diff --git a/__tests__/unit/core-snapshots/workers/actions/worker-action.test.ts b/__tests__/unit/core-snapshots/workers/actions/worker-action.test.ts index 4ea85ff70d..fe99cbb6f1 100644 --- a/__tests__/unit/core-snapshots/workers/actions/worker-action.test.ts +++ b/__tests__/unit/core-snapshots/workers/actions/worker-action.test.ts @@ -212,7 +212,7 @@ describe("WorkerAction", () => { await expect(waitForMessage(verifyWorkerAction, "start", undefined)).toResolve(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 10); @@ -242,7 +242,7 @@ describe("WorkerAction", () => { await expect(waitForMessage(restoreWorkerAction, "start", undefined)).toResolve(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 10); @@ -272,7 +272,7 @@ describe("WorkerAction", () => { await expect(waitForMessage(restoreWorkerAction, "start", undefined)).toResolve(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 10); diff --git a/__tests__/unit/core-snapshots/workers/read-processor.test.ts b/__tests__/unit/core-snapshots/workers/read-processor.test.ts index 62fb30a153..f84d08c95d 100644 --- a/__tests__/unit/core-snapshots/workers/read-processor.test.ts +++ b/__tests__/unit/core-snapshots/workers/read-processor.test.ts @@ -69,7 +69,7 @@ describe("ReadProcessor", () => { await wait; - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 1000); @@ -83,7 +83,7 @@ describe("ReadProcessor", () => { await waitUntilSynchronized(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 1000); diff --git a/__tests__/unit/core-snapshots/workers/worker-thread.test.ts b/__tests__/unit/core-snapshots/workers/worker-thread.test.ts index 713e49739d..30c0edac56 100644 --- a/__tests__/unit/core-snapshots/workers/worker-thread.test.ts +++ b/__tests__/unit/core-snapshots/workers/worker-thread.test.ts @@ -149,7 +149,7 @@ describe("Worker", () => { data: {}, }; - await new Promise((resolve) => { + await new Promise((resolve) => { worker.postMessage(message); worker.once("message", (data) => { diff --git a/__tests__/unit/core-snapshots/workers/worker-wrapper.test.ts b/__tests__/unit/core-snapshots/workers/worker-wrapper.test.ts index 567333f952..bc29ead9fd 100644 --- a/__tests__/unit/core-snapshots/workers/worker-wrapper.test.ts +++ b/__tests__/unit/core-snapshots/workers/worker-wrapper.test.ts @@ -41,7 +41,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("message", { action: "started", @@ -59,7 +59,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("exit", 0); resolve(); @@ -74,7 +74,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("message", { action: "exception", @@ -92,7 +92,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("message", { action: "any", @@ -110,7 +110,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.start(); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("error", {}); resolve(); @@ -131,7 +131,7 @@ describe("WorkerWrapper", () => { dummy: "dummy_data", }; - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("message", { action: "synchronized", @@ -149,7 +149,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.sync({}); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("exit", 0); resolve(); @@ -175,7 +175,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.sync({}); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("message", { action: "exception", @@ -193,7 +193,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.sync({}); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("message", { action: "any", @@ -211,7 +211,7 @@ describe("WorkerWrapper", () => { const promise = workerWrapper.sync({}); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { mockWorker.emit("error", {}); resolve(); diff --git a/__tests__/unit/core-state/__utils__/build-delegate-and-vote-balances.ts b/__tests__/unit/core-state/__utils__/build-delegate-and-vote-balances.ts index 26f0e282fc..0bd0142429 100644 --- a/__tests__/unit/core-state/__utils__/build-delegate-and-vote-balances.ts +++ b/__tests__/unit/core-state/__utils__/build-delegate-and-vote-balances.ts @@ -1,5 +1,5 @@ import { Wallet, WalletRepository } from "@packages/core-state/src/wallets"; -import { Identities, Utils as CryptoUtils } from "@packages/crypto/src"; +import { Identities, Utils as CryptoUtils } from "@packages/crypto"; import { SATOSHI } from "@packages/crypto/src/constants"; export const buildDelegateAndVoteWallets = (numberDelegates: number, walletRepo: WalletRepository): Wallet[] => { diff --git a/__tests__/unit/core-state/__utils__/make-chained-block.ts b/__tests__/unit/core-state/__utils__/make-chained-block.ts index fc72193585..3d1ed551f9 100644 --- a/__tests__/unit/core-state/__utils__/make-chained-block.ts +++ b/__tests__/unit/core-state/__utils__/make-chained-block.ts @@ -1,7 +1,7 @@ -import { IBlock } from "@packages/crypto/src/interfaces"; +import { Interfaces } from "@packages/crypto"; -export const makeChainedBlocks = (length: number, blockFactory): IBlock[] => { - const entitites: IBlock[] = []; +export const makeChainedBlocks = (length: number, blockFactory): Interfaces.IBlock[] => { + const entitites: Interfaces.IBlock[] = []; let previousBlock; // first case uses genesis IBlockData const getPreviousBlock = () => previousBlock; @@ -9,7 +9,7 @@ export const makeChainedBlocks = (length: number, blockFactory): IBlock[] => { if (previousBlock) { blockFactory.withOptions({ getPreviousBlock }); } - const entity: IBlock = blockFactory.make(); + const entity: Interfaces.IBlock = blockFactory.make(); entitites.push(entity); previousBlock = entity.data; } diff --git a/__tests__/unit/core-state/__utils__/make-vote-transactions.ts b/__tests__/unit/core-state/__utils__/make-vote-transactions.ts index d3a7839135..f8694eae43 100644 --- a/__tests__/unit/core-state/__utils__/make-vote-transactions.ts +++ b/__tests__/unit/core-state/__utils__/make-vote-transactions.ts @@ -1,5 +1,5 @@ -import { Transactions } from "@packages/crypto/src"; -import { ITransaction } from "@packages/crypto/src/interfaces"; +import { Transactions } from "@packages/crypto"; +import { ITransaction } from "@packages/crypto/dist/interfaces"; export const makeVoteTransactions = (length: number, voteAssets: string[]): ITransaction[] => { const txs: ITransaction[] = []; diff --git a/__tests__/unit/core-state/__utils__/transactions.ts b/__tests__/unit/core-state/__utils__/transactions.ts index 6df3a7a4d9..a6b144e624 100644 --- a/__tests__/unit/core-state/__utils__/transactions.ts +++ b/__tests__/unit/core-state/__utils__/transactions.ts @@ -1,4 +1,4 @@ -import { IBlock, ITransaction } from "@packages/crypto/src/interfaces"; +import { IBlock, ITransaction } from "@packages/crypto/dist/interfaces"; export const addTransactionsToBlock = (txs: ITransaction[], block: IBlock) => { const { data } = block; diff --git a/__tests__/unit/core-state/block-state.test.ts b/__tests__/unit/core-state/block-state.test.ts index d0c0c06b56..6060871f61 100644 --- a/__tests__/unit/core-state/block-state.test.ts +++ b/__tests__/unit/core-state/block-state.test.ts @@ -6,9 +6,7 @@ import { StateStore } from "@packages/core-state/src/stores/state"; import { Wallet } from "@packages/core-state/src/wallets"; import { WalletRepository } from "@packages/core-state/src/wallets"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; -import { Enums, Utils } from "@packages/crypto/src"; -import { ITransaction } from "@packages/crypto/src/interfaces"; -import { IBlock } from "@packages/crypto/src/interfaces"; +import { Enums, Interfaces, Utils } from "@packages/crypto"; import { makeChainedBlocks } from "./__utils__/make-chained-block"; import { makeVoteTransactions } from "./__utils__/make-vote-transactions"; @@ -18,7 +16,7 @@ import { setUp, setUpDefaults } from "./setup"; let blockState: BlockState; let stateStore: StateStore; let factory: FactoryBuilder; -let blocks: IBlock[]; +let blocks: Interfaces.IBlock[]; let walletRepo: WalletRepository; let forgingWallet: Contracts.State.Wallet; let votingWallet: Contracts.State.Wallet; @@ -261,6 +259,7 @@ describe("BlockState", () => { it("should create forger wallet if it doesn't exist genesis block", async () => { //@ts-ignore const spyApplyBlockToForger = jest.spyOn(blockState, "applyBlockToForger"); + //@ts-ignore spyApplyBlockToForger.mockImplementationOnce(() => {}); const spyCreateWallet = jest.spyOn(walletRepo, "createWallet"); blocks[0].data.height = 1; @@ -404,7 +403,7 @@ describe("BlockState", () => { }); describe("Multipayment", () => { - let multiPaymentTransaction: ITransaction; + let multiPaymentTransaction: Interfaces.ITransaction; let sendersDelegate: Contracts.State.Wallet; let amount: Utils.BigNumber; @@ -636,13 +635,13 @@ describe("BlockState", () => { // @ts-ignore delete voteTransaction.data.asset; - await expect(blockState.applyTransaction(voteTransaction as ITransaction)).toReject(); + await expect(blockState.applyTransaction(voteTransaction as Interfaces.ITransaction)).toReject(); }); }); describe("htlc transaction", () => { - let htlcClaimTransaction: ITransaction; - let htlcLock: ITransaction; + let htlcClaimTransaction: Interfaces.ITransaction; + let htlcLock: Interfaces.ITransaction; let lockData; let lockID; diff --git a/__tests__/unit/core-state/dpos/dpos-previous-round.test.ts b/__tests__/unit/core-state/dpos/dpos-previous-round.test.ts index b09810db41..dcb843e41e 100644 --- a/__tests__/unit/core-state/dpos/dpos-previous-round.test.ts +++ b/__tests__/unit/core-state/dpos/dpos-previous-round.test.ts @@ -5,7 +5,7 @@ import { RoundInfo } from "@packages/core-kernel/src/contracts/shared"; import { DposPreviousRoundStateProvider } from "@packages/core-kernel/src/contracts/state"; import { DposState } from "@packages/core-state/src/dpos/dpos"; import { WalletRepository } from "@packages/core-state/src/wallets"; -import { IBlock } from "@packages/crypto/src/interfaces"; +import { Interfaces } from "@packages/crypto"; import { buildDelegateAndVoteWallets } from "../__utils__/build-delegate-and-vote-balances"; import { makeChainedBlocks } from "../__utils__/make-chained-block"; @@ -36,7 +36,7 @@ afterEach(() => jest.clearAllMocks()); describe("dposPreviousRound", () => { let round: RoundInfo; - let blocks: IBlock[]; + let blocks: Interfaces.IBlock[]; beforeEach(async () => { walletRepo.reset(); diff --git a/__tests__/unit/core-state/round-state.test.ts b/__tests__/unit/core-state/round-state.test.ts index 142dab6d96..be63c57cdf 100644 --- a/__tests__/unit/core-state/round-state.test.ts +++ b/__tests__/unit/core-state/round-state.test.ts @@ -630,6 +630,7 @@ describe("RoundState", () => { const spyOnCalcPreviousActiveDelegates = jest // @ts-ignore .spyOn(roundState, "calcPreviousActiveDelegates") + // @ts-ignore .mockReturnValue(delegates); // @ts-ignore @@ -667,6 +668,7 @@ describe("RoundState", () => { const spyOnCalcPreviousActiveDelegates = jest // @ts-ignore .spyOn(roundState, "calcPreviousActiveDelegates") + // @ts-ignore .mockReturnValue(delegates); databaseService.deleteRound.mockImplementation(async () => { diff --git a/__tests__/unit/core-state/stores/blocks.test.ts b/__tests__/unit/core-state/stores/blocks.test.ts index 7a355d2501..fdf4389d50 100644 --- a/__tests__/unit/core-state/stores/blocks.test.ts +++ b/__tests__/unit/core-state/stores/blocks.test.ts @@ -1,5 +1,5 @@ -import { Interfaces } from "@packages/crypto/src"; import { BlockStore } from "@packages/core-state/src/stores/blocks"; +import { Interfaces } from "@packages/crypto"; describe("BlockStore", () => { it("should push and get a block", () => { diff --git a/__tests__/unit/core-state/stores/state.test.ts b/__tests__/unit/core-state/stores/state.test.ts index a2194da958..0174033848 100644 --- a/__tests__/unit/core-state/stores/state.test.ts +++ b/__tests__/unit/core-state/stores/state.test.ts @@ -3,7 +3,7 @@ import "jest-extended"; import { Container } from "@packages/core-kernel/src"; import { StateStore } from "@packages/core-state/src/stores/state"; import { FactoryBuilder } from "@packages/core-test-framework/src/factories"; -import { IBlock, IBlockData, ITransactionData } from "@packages/crypto/src/interfaces"; +import { IBlock, IBlockData, ITransactionData } from "@packages/crypto/dist/interfaces"; import delay from "delay"; import { makeChainedBlocks } from "../__utils__/make-chained-block"; diff --git a/__tests__/unit/core-state/wallets/wallet-repository-copy-on-write.test.ts b/__tests__/unit/core-state/wallets/wallet-repository-copy-on-write.test.ts index 4c175b10c8..2951b5b31c 100644 --- a/__tests__/unit/core-state/wallets/wallet-repository-copy-on-write.test.ts +++ b/__tests__/unit/core-state/wallets/wallet-repository-copy-on-write.test.ts @@ -49,7 +49,7 @@ describe("Wallet Repository Copy On Write", () => { it("should find wallets by address", () => { const spyFindByAddress = jest.spyOn(walletRepo, "findByAddress"); const clonedWallet = walletRepoCopyOnWrite.findByAddress("notexisting"); - expect(spyFindByAddress).toHaveBeenCalledWith("notexisting"); + expect(spyFindByAddress).not.toBeCalled(); const originalWallet = walletRepo.findByAddress(clonedWallet.getAddress()); expect(originalWallet).not.toBe(clonedWallet); }); diff --git a/__tests__/unit/core-transaction-pool/mempool-index-registry.test.ts b/__tests__/unit/core-transaction-pool/mempool-index-registry.test.ts new file mode 100644 index 0000000000..9795075f5b --- /dev/null +++ b/__tests__/unit/core-transaction-pool/mempool-index-registry.test.ts @@ -0,0 +1,48 @@ +import "jest-extended"; + +import { Application, Container } from "@packages/core-kernel"; + +import { MempoolIndex } from "../../../packages/core-transaction-pool/src/mempool-index"; +import { MempoolIndexRegistry } from "../../../packages/core-transaction-pool/src/mempool-index-registry"; + +describe("MempoolIndex", () => { + let app: Application; + + beforeEach(() => { + app = new Application(new Container.Container()); + }); + + it("should initialize indexes", () => { + const index1 = "index1"; + const index2 = "index2"; + + app.bind(Container.Identifiers.TransactionPoolMempoolIndex).toConstantValue(index1); + app.bind(Container.Identifiers.TransactionPoolMempoolIndex).toConstantValue(index2); + + const mempoolIndexRegistry = app.resolve(MempoolIndexRegistry); + + expect(mempoolIndexRegistry.get(index1)).toBeInstanceOf(MempoolIndex); + expect(mempoolIndexRegistry.get(index2)).toBeInstanceOf(MempoolIndex); + }); + + it("get should throw if index is not registered", () => { + const index1 = "index1"; + + const mempoolIndexRegistry = app.resolve(MempoolIndexRegistry); + + expect(() => mempoolIndexRegistry.get(index1)).toThrowError(`Index ${index1} does not exists`); + }); + + it("clear should clear indexes", () => { + const spyOnClear = jest.spyOn(MempoolIndex.prototype, "clear"); + + const index1 = "index1"; + app.bind(Container.Identifiers.TransactionPoolMempoolIndex).toConstantValue(index1); + + const mempoolIndexRegistry = app.resolve(MempoolIndexRegistry); + + mempoolIndexRegistry.clear(); + + expect(spyOnClear).toBeCalledTimes(1); + }); +}); diff --git a/__tests__/unit/core-transaction-pool/mempool-index.test.ts b/__tests__/unit/core-transaction-pool/mempool-index.test.ts new file mode 100644 index 0000000000..639b16f770 --- /dev/null +++ b/__tests__/unit/core-transaction-pool/mempool-index.test.ts @@ -0,0 +1,63 @@ +import "jest-extended"; + +import { Interfaces } from "@arkecosystem/crypto"; + +import { MempoolIndex } from "../../../packages/core-transaction-pool/src/mempool-index"; + +describe("MempoolIndex", () => { + let index: MempoolIndex; + let transaction: Interfaces.ITransaction; + + beforeEach(() => { + index = new MempoolIndex(); + transaction = {} as Interfaces.ITransaction; + }); + + it("should set key", () => { + const key = "key"; + + expect(index.has(key)).toBeFalse(); + + index.set(key, transaction); + + expect(index.has(key)).toBeTrue(); + }); + + it("should get key", () => { + const key = "key"; + + index.set(key, transaction); + + expect(index.get(key)).toEqual(transaction); + + index.forget(key); + + expect(() => { + index.get(key); + }).toThrow(); + }); + + it("should forget key", () => { + const key = "key"; + + index.set(key, transaction); + + expect(index.has(key)).toBeTrue(); + + index.forget(key); + + expect(index.has(key)).toBeFalse(); + }); + + it("should clear all keys", () => { + const key = "key"; + + index.set(key, transaction); + + expect(index.has(key)).toBeTrue(); + + index.clear(); + + expect(index.has(key)).toBeFalse(); + }); +}); diff --git a/__tests__/unit/core-transaction-pool/mempool.test.ts b/__tests__/unit/core-transaction-pool/mempool.test.ts index 946cafebbf..dce63b36b9 100644 --- a/__tests__/unit/core-transaction-pool/mempool.test.ts +++ b/__tests__/unit/core-transaction-pool/mempool.test.ts @@ -1,14 +1,19 @@ -import { Container } from "@arkecosystem/core-kernel"; -import { Identities, Interfaces } from "@arkecosystem/crypto"; - -import { Mempool } from "../../../packages/core-transaction-pool/src/mempool"; +import { Application, Container } from "@packages/core-kernel"; +import { Mempool } from "@packages/core-transaction-pool/src/mempool"; +import { Identities, Interfaces } from "@packages/crypto"; const createSenderMempool = jest.fn(); const logger = { debug: jest.fn() }; +const mempoolIndexRegistry = { clear: jest.fn() }; +const handlerRegistry = { + getActivatedHandlerForData: jest.fn(), +}; -const container = new Container.Container(); -container.bind(Container.Identifiers.TransactionPoolSenderMempoolFactory).toConstantValue(createSenderMempool); -container.bind(Container.Identifiers.LogService).toConstantValue(logger); +const app = new Application(new Container.Container()); +app.bind(Container.Identifiers.TransactionPoolSenderMempoolFactory).toConstantValue(createSenderMempool); +app.bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry).toConstantValue(mempoolIndexRegistry); +app.bind(Container.Identifiers.LogService).toConstantValue(logger); +app.bind(Container.Identifiers.TransactionHandlerRegistry).toConstantValue(handlerRegistry); beforeEach(() => { createSenderMempool.mockReset(); @@ -45,7 +50,7 @@ describe("Mempool.getSize", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender2") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction1); await memory.addTransaction(transaction2); const size = memory.getSize(); @@ -68,7 +73,7 @@ describe("Mempool.hasSenderMempool", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); const has = memory.hasSenderMempool(transaction.data.senderPublicKey); @@ -88,7 +93,7 @@ describe("Mempool.hasSenderMempool", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); const has = memory.hasSenderMempool(Identities.PublicKey.fromPassphrase("not sender")); @@ -110,7 +115,7 @@ describe("Mempool.getSenderMempool", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); expect(memory.getSenderMempool(transaction.data.senderPublicKey)).toBe(senderMempool); @@ -129,7 +134,7 @@ describe("Mempool.getSenderMempool", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); const cb = () => memory.getSenderMempool(Identities.PublicKey.fromPassphrase("not sender")); @@ -163,7 +168,7 @@ describe("Mempool.getSenderMempools", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender2") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction1); await memory.addTransaction(transaction2); const senderMempools = memory.getSenderMempools(); @@ -186,7 +191,7 @@ describe("Mempool.addTransaction", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); expect(senderMempool.addTransaction).toBeCalledWith(transaction); @@ -209,7 +214,7 @@ describe("Mempool.addTransaction", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); const promise = memory.addTransaction(transaction); await expect(promise).rejects.toThrow(error); const has = memory.hasSenderMempool(transaction.data.senderPublicKey); @@ -226,7 +231,7 @@ describe("Mempool.removeTransaction", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); const removedTransactions = await memory.removeTransaction(transaction.data.senderPublicKey, transaction.id); expect(removedTransactions).toStrictEqual([]); @@ -247,7 +252,7 @@ describe("Mempool.removeTransaction", () => { senderMempool.isDisposable.mockReturnValue(false); createSenderMempool.mockReturnValueOnce(senderMempool); - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); const removedTransactions = await memory.removeTransaction(transaction.data.senderPublicKey, transaction.id); @@ -272,7 +277,7 @@ describe("Mempool.removeTransaction", () => { senderMempool.isDisposable.mockReturnValueOnce(false).mockReturnValueOnce(true); createSenderMempool.mockReturnValueOnce(senderMempool); - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); const promise = memory.removeTransaction(transaction.data.senderPublicKey, transaction.id); await expect(promise).rejects.toThrow(error); @@ -283,68 +288,263 @@ describe("Mempool.removeTransaction", () => { }); }); -describe("Mempool.removeForgedTransaction", () => { - it("should return empty array when accepting transaction of sender that wasn't previously added", async () => { - const memory = container.resolve(Mempool); - const removedTransactions = await memory.removeForgedTransaction( - Identities.PublicKey.fromPassphrase("sender1"), - "none", - ); +describe("applyBlock", () => { + it("should return empty list when block doesn't contains transactions", async () => { + const block = { + transactions: [], + } as Interfaces.IBlock; - expect(removedTransactions).toStrictEqual([]); + const mempool = app.resolve(Mempool); + + await expect(mempool.applyBlock(block)).resolves.toEqual([]); }); - it("should remove previously added transaction and return list of removed transactions", async () => { + it("should return empty list when block contains transactions that are not in pool", async () => { + const handler = { + onPoolLeave: jest.fn(), + getInvalidPoolTransactions: jest.fn().mockResolvedValue([]), + }; + + handlerRegistry.getActivatedHandlerForData.mockReturnValue(handler); + const transaction = { id: "transaction-id", data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, } as Interfaces.ITransaction; + const block = { + transactions: [transaction], + } as Interfaces.IBlock; + + const mempool = app.resolve(Mempool); + + await expect(mempool.applyBlock(block)).resolves.toEqual([]); + + expect(handler.onPoolLeave).not.toBeCalled(); + expect(handler.getInvalidPoolTransactions).toBeCalledTimes(1); + }); + + it("should return empty list when block contains transactions that are in pool", async () => { + const handler = { + onPoolLeave: jest.fn().mockImplementation(async () => {}), + getInvalidPoolTransactions: jest.fn().mockResolvedValue([]), + }; + + handlerRegistry.getActivatedHandlerForData.mockReturnValue(handler); + const senderMempool = { addTransaction: jest.fn(), - removeForgedTransaction: jest.fn(), - isDisposable: jest.fn(), + isDisposable: jest.fn().mockReturnValueOnce(false).mockReturnValueOnce(true), + removeForgedTransaction: jest.fn().mockReturnValue(true), }; - senderMempool.removeForgedTransaction.mockReturnValue([transaction]); - senderMempool.isDisposable.mockReturnValue(false); createSenderMempool.mockReturnValueOnce(senderMempool); - const memory = container.resolve(Mempool); - await memory.addTransaction(transaction); - const removedTransactions = await memory.removeForgedTransaction( - transaction.data.senderPublicKey, - transaction.id, - ); + const transaction = { + id: "transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, + } as Interfaces.ITransaction; - expect(senderMempool.removeForgedTransaction).toBeCalledWith(transaction.id); - expect(removedTransactions).toEqual([transaction]); - expect(logger.debug).toHaveBeenCalledTimes(1); + const mempool = app.resolve(Mempool); + await mempool.addTransaction(transaction); + + const block = { + transactions: [transaction], + } as Interfaces.IBlock; + + await expect(mempool.applyBlock(block)).resolves.toEqual([]); + + expect(handler.onPoolLeave).toBeCalledTimes(1); + expect(handler.getInvalidPoolTransactions).toBeCalledTimes(1); + expect(logger.debug).toHaveBeenCalledWith(expect.stringContaining("Removed forged")); }); - it("should forget sender state if it's empty even if error was thrown", async () => { - const error = new Error("Something went horribly wrong"); + it("should return list of invalid transactions when forged transaction is not first in the list", async () => { const transaction = { id: "transaction-id", data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, } as Interfaces.ITransaction; + const invalidTransaction = { + id: "invalid-transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, + } as Interfaces.ITransaction; + + const block = { + transactions: [transaction], + } as Interfaces.IBlock; + + const handler = { + onPoolLeave: jest.fn(), + getInvalidPoolTransactions: jest.fn().mockResolvedValue([]), + }; + + handlerRegistry.getActivatedHandlerForData.mockReturnValue(handler); + const senderMempool = { addTransaction: jest.fn(), - removeForgedTransaction: jest.fn(), - isDisposable: jest.fn(), + isDisposable: jest.fn().mockReturnValue(false), + removeForgedTransaction: jest.fn().mockReturnValue(false), + getFromLatest: jest.fn().mockReturnValue([invalidTransaction]), + getFromEarliest: jest.fn().mockReturnValue([invalidTransaction]), }; - senderMempool.removeForgedTransaction.mockRejectedValueOnce(error); - senderMempool.isDisposable.mockReturnValueOnce(false).mockReturnValueOnce(true); - createSenderMempool.mockReturnValueOnce(senderMempool); - const memory = container.resolve(Mempool); - await memory.addTransaction(transaction); - const promise = memory.removeForgedTransaction(transaction.data.senderPublicKey, transaction.id); - await expect(promise).rejects.toThrow(error); - const has = memory.hasSenderMempool(transaction.data.senderPublicKey); + const newSenderMempool = { + addTransaction: jest.fn().mockImplementation(() => { + throw new Error("Transaction error"); + }), + getSize: jest.fn().mockReturnValue(0), + }; + createSenderMempool.mockReturnValueOnce(senderMempool).mockReturnValueOnce(newSenderMempool); - expect(logger.debug).toHaveBeenCalledTimes(2); - expect(has).toBe(false); + const mempool = app.resolve(Mempool); + + await mempool.addTransaction(invalidTransaction); + + await expect(mempool.applyBlock(block)).resolves.toEqual([invalidTransaction]); + + expect(handler.onPoolLeave).toBeCalledTimes(1); + expect(handler.onPoolLeave).toBeCalledWith(invalidTransaction); + expect(handler.getInvalidPoolTransactions).toBeCalledTimes(1); + expect(handler.getInvalidPoolTransactions).toBeCalledWith(transaction); + expect(newSenderMempool.addTransaction).toBeCalledTimes(1); + expect(newSenderMempool.addTransaction).toBeCalledWith(invalidTransaction); + expect(logger.debug).toHaveBeenCalledWith(expect.stringContaining("Removed invalid")); + }); + + it("should return list of invalid transactions when getInvalidTransactions returns transaction", async () => { + const transaction = { + id: "transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, + } as Interfaces.ITransaction; + + const invalidTransaction = { + id: "invalid-transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender2") }, + } as Interfaces.ITransaction; + + const block = { + transactions: [transaction], + } as Interfaces.IBlock; + + const handler = { + onPoolLeave: jest.fn(), + getInvalidPoolTransactions: jest.fn().mockResolvedValue([invalidTransaction]), + }; + + handlerRegistry.getActivatedHandlerForData.mockReturnValue(handler); + + const senderMempool = { + addTransaction: jest.fn(), + isDisposable: jest.fn().mockReturnValueOnce(false).mockReturnValueOnce(true), + removeForgedTransaction: jest.fn().mockReturnValue(true), + }; + + const secondSenderMempool = { + addTransaction: jest.fn(), + isDisposable: jest.fn().mockReturnValue(false), + getFromLatest: jest.fn().mockReturnValue([invalidTransaction]), + getFromEarliest: jest.fn().mockReturnValue([invalidTransaction]), + }; + + const newSenderMempool = { + addTransaction: jest.fn().mockImplementation(() => { + throw new Error("Transaction error"); + }), + getSize: jest.fn().mockReturnValue(0), + }; + createSenderMempool + .mockReturnValueOnce(senderMempool) + .mockReturnValueOnce(secondSenderMempool) + .mockReturnValueOnce(newSenderMempool); + + const mempool = app.resolve(Mempool); + + await mempool.addTransaction(transaction); + await mempool.addTransaction(invalidTransaction); + + await expect(mempool.applyBlock(block)).resolves.toEqual([invalidTransaction]); + + expect(handler.onPoolLeave).toBeCalledTimes(2); + expect(handler.onPoolLeave).toBeCalledWith(transaction); + expect(handler.onPoolLeave).toBeCalledWith(invalidTransaction); + expect(handler.getInvalidPoolTransactions).toBeCalledTimes(1); + expect(handler.getInvalidPoolTransactions).toBeCalledWith(transaction); + expect(newSenderMempool.addTransaction).toBeCalledTimes(1); + expect(newSenderMempool.addTransaction).toBeCalledWith(invalidTransaction); + expect(logger.debug).toHaveBeenCalledWith(expect.stringContaining("Removed invalid")); + }); + + it("should return list of invalid transactions when getInvalidTransactions returns transaction and try to readd sender transactions", async () => { + const transaction = { + id: "transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, + } as Interfaces.ITransaction; + + const secondTransaction = { + id: "second-transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender2") }, + } as Interfaces.ITransaction; + + const invalidTransaction = { + id: "invalid-transaction-id", + data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender2") }, + } as Interfaces.ITransaction; + + const block = { + transactions: [transaction], + } as Interfaces.IBlock; + + const handler = { + onPoolLeave: jest.fn(), + getInvalidPoolTransactions: jest.fn().mockResolvedValue([invalidTransaction]), + }; + + handlerRegistry.getActivatedHandlerForData.mockReturnValue(handler); + + const senderMempool = { + addTransaction: jest.fn(), + isDisposable: jest.fn().mockReturnValueOnce(false).mockReturnValueOnce(true), + removeForgedTransaction: jest.fn().mockReturnValue(true), + }; + + const secondSenderMempool = { + addTransaction: jest.fn(), + isDisposable: jest.fn().mockReturnValue(false), + getFromLatest: jest.fn().mockReturnValue([invalidTransaction, secondTransaction]), + getFromEarliest: jest.fn().mockReturnValue([secondTransaction, invalidTransaction]), + }; + + const newSenderMempool = { + addTransaction: jest + .fn() + .mockImplementationOnce(() => {}) + .mockImplementation(() => { + throw new Error("Transaction error"); + }), + getSize: jest.fn().mockReturnValue(1), + }; + createSenderMempool + .mockReturnValueOnce(senderMempool) + .mockReturnValueOnce(secondSenderMempool) + .mockReturnValueOnce(newSenderMempool); + + const mempool = app.resolve(Mempool); + + await mempool.addTransaction(transaction); + await mempool.addTransaction(secondTransaction); + + await expect(mempool.applyBlock(block)).resolves.toEqual([invalidTransaction]); + + expect(handler.onPoolLeave).toBeCalledTimes(3); + expect(handler.onPoolLeave).toBeCalledWith(transaction); + expect(handler.onPoolLeave).toBeCalledWith(secondTransaction); + expect(handler.onPoolLeave).toBeCalledWith(invalidTransaction); + expect(handler.getInvalidPoolTransactions).toBeCalledTimes(1); + expect(handler.getInvalidPoolTransactions).toBeCalledWith(transaction); + expect(newSenderMempool.addTransaction).toBeCalledTimes(2); + expect(newSenderMempool.addTransaction).toBeCalledWith(secondTransaction); + expect(newSenderMempool.addTransaction).toBeCalledWith(invalidTransaction); + expect(logger.debug).toHaveBeenCalledWith(expect.stringContaining("Removed invalid")); }); }); @@ -362,11 +562,12 @@ describe("Mempool.flush", () => { data: { senderPublicKey: Identities.PublicKey.fromPassphrase("sender1") }, } as Interfaces.ITransaction; - const memory = container.resolve(Mempool); + const memory = app.resolve(Mempool); await memory.addTransaction(transaction); memory.flush(); const has = memory.hasSenderMempool(transaction.data.senderPublicKey); expect(has).toBe(false); + expect(mempoolIndexRegistry.clear).toBeCalled(); }); }); diff --git a/__tests__/unit/core-transaction-pool/sender-mempool.test.ts b/__tests__/unit/core-transaction-pool/sender-mempool.test.ts index b163e8e988..ec58622bf8 100644 --- a/__tests__/unit/core-transaction-pool/sender-mempool.test.ts +++ b/__tests__/unit/core-transaction-pool/sender-mempool.test.ts @@ -1,7 +1,8 @@ -import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { Identities, Managers, Transactions } from "@arkecosystem/crypto"; +import "jest-extended"; -import { SenderMempool } from "../../../packages/core-transaction-pool/src/sender-mempool"; +import { Container, Contracts } from "@packages/core-kernel"; +import { SenderMempool } from "@packages/core-transaction-pool/src/sender-mempool"; +import { Identities, Managers, Transactions } from "@packages/crypto"; const configuration = { getRequired: jest.fn(), getOptional: jest.fn() }; const senderState = { apply: jest.fn(), revert: jest.fn() }; @@ -192,32 +193,29 @@ describe("SenderMempool.removeTransaction", () => { }); describe("SenderMempool.removeForgedTransaction", () => { - it("should return all transactions that were added before transaction being accepted", async () => { - configuration.getRequired.mockReturnValueOnce(10); // maxTransactionsPerSender + it("should throw an error if there is no transactions in sender mempool", async () => { + const senderMempool = container.resolve(SenderMempool); + + await expect(senderMempool.removeForgedTransaction(transaction1.id)).rejects.toThrowError( + "No transactions in sender mempool", + ); + }); + it("should return true when forged transaction is earliest", async () => { const senderMempool = container.resolve(SenderMempool); + await senderMempool.addTransaction(transaction1); await senderMempool.addTransaction(transaction2); - await senderMempool.addTransaction(transaction3); - - const removedTransactions = await senderMempool.removeForgedTransaction(transaction2.id); - const remainingTransactions = senderMempool.getFromEarliest(); - expect(removedTransactions).toStrictEqual([transaction1, transaction2]); - expect(remainingTransactions).toStrictEqual([transaction3]); + await expect(senderMempool.removeForgedTransaction(transaction1.id)).resolves.toBeTrue(); }); - it("should return no transactions when accepting unknown transaction", async () => { - configuration.getRequired.mockReturnValueOnce(10); // maxTransactionsPerSender - + it("should return false when forged transaction is not earliest", async () => { const senderMempool = container.resolve(SenderMempool); + await senderMempool.addTransaction(transaction1); await senderMempool.addTransaction(transaction2); - const removedTransactions = await senderMempool.removeForgedTransaction(transaction3.id); - const remainingTransactions = senderMempool.getFromEarliest(); - - expect(removedTransactions).toStrictEqual([]); - expect(remainingTransactions).toStrictEqual([transaction1, transaction2]); + await expect(senderMempool.removeForgedTransaction(transaction2.id)).resolves.toBeFalse(); }); }); diff --git a/__tests__/unit/core-transaction-pool/sender-state.test.ts b/__tests__/unit/core-transaction-pool/sender-state.test.ts index e079ebd0d6..2d7fe2e8fc 100644 --- a/__tests__/unit/core-transaction-pool/sender-state.test.ts +++ b/__tests__/unit/core-transaction-pool/sender-state.test.ts @@ -177,6 +177,8 @@ describe("SenderState.apply", () => { expect(triggers.call).toBeCalledWith("verifyTransaction", { handler, transaction }); expect(triggers.call).toBeCalledWith("throwIfCannotEnterPool", { handler, transaction }); expect(triggers.call).toBeCalledWith("applyTransaction", { handler, transaction }); + + expect(triggers.call).not.toBeCalledWith("onPoolEnter", { handler, transaction }); }); it("should call handler to apply transaction", async () => { @@ -198,6 +200,7 @@ describe("SenderState.apply", () => { expect(triggers.call).toBeCalledWith("verifyTransaction", { handler, transaction }); expect(triggers.call).toBeCalledWith("throwIfCannotEnterPool", { handler, transaction }); expect(triggers.call).toBeCalledWith("applyTransaction", { handler, transaction }); + expect(triggers.call).toBeCalledWith("onPoolEnter", { handler, transaction }); }); }); @@ -213,5 +216,6 @@ describe("SenderState.revert", () => { expect(handlerRegistry.getActivatedHandlerForData).toBeCalledWith(transaction.data); expect(triggers.call).toBeCalledWith("revertTransaction", { handler, transaction }); + expect(triggers.call).toBeCalledWith("onPoolLeave", { handler, transaction }); }); }); diff --git a/__tests__/unit/core-transaction-pool/service.test.ts b/__tests__/unit/core-transaction-pool/service.test.ts index 3e3fc1e0fb..981d93eaf0 100644 --- a/__tests__/unit/core-transaction-pool/service.test.ts +++ b/__tests__/unit/core-transaction-pool/service.test.ts @@ -1,7 +1,8 @@ -import { Container, Contracts, Enums } from "@arkecosystem/core-kernel"; -import { Identities, Managers, Transactions } from "@arkecosystem/crypto"; +import "jest-extended"; -import { Service } from "../../../packages/core-transaction-pool/src/service"; +import { Container, Contracts, Enums } from "@packages/core-kernel"; +import { Service } from "@packages/core-transaction-pool/src/service"; +import { Identities, Interfaces, Managers, Transactions } from "@packages/crypto"; const configuration = { getRequired: jest.fn(), @@ -25,8 +26,15 @@ const mempool = { addTransaction: jest.fn(), removeTransaction: jest.fn(), removeForgedTransaction: jest.fn(), + applyBlock: jest.fn(), flush: jest.fn(), }; +const secondSignatureVerification = { + clear: jest.fn(), +}; +const multiSignatureVerification = { + clear: jest.fn(), +}; const poolQuery = { getAll: jest.fn(), getFromLowestPriority: jest.fn(), @@ -54,6 +62,10 @@ container.bind(Container.Identifiers.TransactionPoolStorage).toConstantValue(sto container.bind(Container.Identifiers.TransactionPoolMempool).toConstantValue(mempool); container.bind(Container.Identifiers.TransactionPoolQuery).toConstantValue(poolQuery); container.bind(Container.Identifiers.TransactionPoolExpirationService).toConstantValue(expirationService); +container + .bind(Container.Identifiers.TransactionSecondSignatureVerification) + .toConstantValue(secondSignatureVerification); +container.bind(Container.Identifiers.TransactionMultiSignatureVerification).toConstantValue(multiSignatureVerification); container.bind(Container.Identifiers.EventDispatcherService).toConstantValue(events); container.bind(Container.Identifiers.LogService).toConstantValue(logger); @@ -106,9 +118,7 @@ describe("Service.boot", () => { const service = container.resolve(Service); await service.boot(); - expect(events.listen).toBeCalledWith(Enums.StateEvent.BuilderFinished, service); expect(events.listen).toBeCalledWith(Enums.CryptoEvent.MilestoneChanged, service); - expect(events.listen).toBeCalledWith(Enums.BlockEvent.Applied, service); }); }); @@ -117,22 +127,11 @@ describe("Service.dispose", () => { const service = container.resolve(Service); service.dispose(); - expect(events.forget).toBeCalledWith(Enums.StateEvent.BuilderFinished, service); expect(events.forget).toBeCalledWith(Enums.CryptoEvent.MilestoneChanged, service); - expect(events.forget).toBeCalledWith(Enums.BlockEvent.Applied, service); }); }); describe("Service.handle", () => { - it("should re-add transactions after state builder had finished", async () => { - const service = container.resolve(Service); - jest.spyOn(service, "readdTransactions").mockImplementation(() => Promise.resolve()); - - await service.handle({ name: Enums.StateEvent.BuilderFinished }); - - expect(service.readdTransactions).toBeCalled(); - }); - it("should re-add transactions after milestone had changed", async () => { const service = container.resolve(Service); jest.spyOn(service, "readdTransactions").mockImplementation(() => Promise.resolve()); @@ -141,15 +140,6 @@ describe("Service.handle", () => { expect(service.readdTransactions).toBeCalled(); }); - - it("should cleanup transactions after block is applied", async () => { - const service = container.resolve(Service); - jest.spyOn(service, "cleanUp").mockImplementation(() => Promise.resolve()); - - await service.handle({ name: Enums.BlockEvent.Applied }); - - expect(service.cleanUp).toBeCalled(); - }); }); describe("Service.getPoolSize", () => { @@ -215,6 +205,8 @@ describe("Service.addTransaction", () => { serialized: transaction1.serialized, }); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.RejectedByPool, expect.anything()); }); @@ -238,6 +230,8 @@ describe("Service.addTransaction", () => { serialized: transaction1.serialized, }); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.RejectedByPool, expect.anything()); }); @@ -261,6 +255,8 @@ describe("Service.addTransaction", () => { expect(storage.getOldTransactions).toBeCalledWith(900); expect(mempool.removeTransaction).toBeCalledWith(transaction2.data.senderPublicKey, transaction2.id); expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.Expired, expect.anything()); }); @@ -282,6 +278,8 @@ describe("Service.addTransaction", () => { expect(expirationService.isExpired).toBeCalledWith(transaction2); expect(mempool.removeTransaction).toBeCalledWith(transaction2.data.senderPublicKey, transaction2.id); expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.Expired, expect.anything()); }); @@ -331,6 +329,8 @@ describe("Service.addTransaction", () => { expect(mempool.removeTransaction).toBeCalledWith(transaction1.data.senderPublicKey, transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.RemovedFromPool, expect.anything()); }); @@ -356,6 +356,10 @@ describe("Service.removeTransaction", () => { expect(mempool.removeTransaction).toBeCalledWith(transaction1.data.senderPublicKey, transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.RemovedFromPool, expect.anything()); }); @@ -370,42 +374,10 @@ describe("Service.removeTransaction", () => { expect(mempool.removeTransaction).toBeCalledWith(transaction1.data.senderPublicKey, transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction2.id); - expect(logger.error).toBeCalled(); - }); -}); - -describe("Service.removeForgedTransaction", () => { - it("should do nothing if transaction wasn't added previously", async () => { - storage.hasTransaction.mockReturnValueOnce(false); - - const service = container.resolve(Service); - await service.removeForgedTransaction(transaction1); - - expect(mempool.removeForgedTransaction).not.toBeCalled(); - }); - - it("should remove from storage every transaction removed by mempool", async () => { - storage.hasTransaction.mockReturnValueOnce(true); - mempool.removeForgedTransaction.mockReturnValueOnce([transaction1, transaction2]); - - const service = container.resolve(Service); - await service.removeForgedTransaction(transaction1); - - expect(mempool.removeForgedTransaction).toBeCalledWith(transaction1.data.senderPublicKey, transaction1.id); - expect(storage.removeTransaction).toBeCalledWith(transaction1.id); - expect(storage.removeTransaction).toBeCalledWith(transaction2.id); - }); - - it("should log error if transaction wasn't found in mempool", async () => { - storage.hasTransaction.mockReturnValueOnce(true); - mempool.removeForgedTransaction.mockReturnValueOnce([transaction2]); - - const service = container.resolve(Service); - await service.removeForgedTransaction(transaction1); - - expect(mempool.removeForgedTransaction).toBeCalledWith(transaction1.data.senderPublicKey, transaction1.id); - expect(storage.removeTransaction).toBeCalledWith(transaction1.id); - expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); expect(logger.error).toBeCalled(); }); }); @@ -445,6 +417,8 @@ describe("Service.readdTransactions", () => { expect(mempool.addTransaction).toBeCalledWith(transaction3); expect(storage.removeTransaction).toBeCalledTimes(0); + expect(secondSignatureVerification.clear).toBeCalledTimes(0); + expect(multiSignatureVerification.clear).toBeCalledTimes(0); }); it("should remove transaction from storage that cannot be added to mempool", async () => { @@ -470,6 +444,9 @@ describe("Service.readdTransactions", () => { expect(storage.removeTransaction).toBeCalledTimes(1); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); + + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); }); it("should remove all transactions from storage that cannot be added to mempool", async () => { @@ -500,6 +477,10 @@ describe("Service.readdTransactions", () => { expect(storage.removeTransaction).toBeCalledTimes(2); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); }); it("should add previously forged transactions first", async () => { @@ -539,6 +520,8 @@ describe("Service.readdTransactions", () => { }); expect(storage.removeTransaction).toBeCalledTimes(0); + expect(secondSignatureVerification.clear).toBeCalledTimes(0); + expect(multiSignatureVerification.clear).toBeCalledTimes(0); }); it("should ignore error when adding previously forged transactions", async () => { @@ -573,6 +556,8 @@ describe("Service.readdTransactions", () => { }); expect(storage.removeTransaction).toBeCalledTimes(0); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); }); it("should ignore all errors when adding previously forged", async () => { @@ -602,6 +587,10 @@ describe("Service.readdTransactions", () => { expect(storage.addTransaction).toBeCalledTimes(0); expect(storage.removeTransaction).toBeCalledTimes(0); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); }); }); @@ -627,6 +616,8 @@ describe("Service.cleanUp", () => { expect(mempool.removeTransaction).toBeCalledWith(transaction3.data.senderPublicKey, transaction3.id); expect(storage.removeTransaction).toBeCalledWith(transaction3.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction3.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction3.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.Expired, expect.anything()); }); @@ -651,6 +642,8 @@ describe("Service.cleanUp", () => { expect(mempool.removeTransaction).toBeCalledWith(transaction2.data.senderPublicKey, transaction2.id); expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); expect(events.dispatch).toHaveBeenCalledWith(Enums.TransactionEvent.Expired, expect.anything()); }); @@ -679,5 +672,35 @@ describe("Service.cleanUp", () => { expect(mempool.removeTransaction).toBeCalledWith(transaction1.data.senderPublicKey, transaction1.id); expect(storage.removeTransaction).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); + }); +}); + +describe("Service.applyBlock", () => { + it("should remove invalid and block transactions from store and dispatch event for removed transactions", async () => { + const block = { + transactions: [transaction1], + } as Interfaces.IBlock; + + mempool.applyBlock.mockResolvedValueOnce([transaction2]); + + const service = container.resolve(Service); + + await expect(service.applyBlock(block)).toResolve(); + + expect(storage.removeTransaction).toBeCalledTimes(2); + expect(storage.removeTransaction).toBeCalledWith(transaction1.id); + expect(storage.removeTransaction).toBeCalledWith(transaction2.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction1.id); + expect(secondSignatureVerification.clear).toBeCalledWith(transaction2.id); + expect(multiSignatureVerification.clear).toBeCalledWith(transaction2.id); + + expect(events.dispatch).toBeCalledTimes(1); + expect(events.dispatch).toBeCalledWith(Enums.TransactionEvent.RemovedFromPool, transaction2.data); + + expect(logger.warning).toBeCalledTimes(1); + expect(logger.warning).toBeCalledWith("1 previously stored transactions failed re-adding"); }); }); diff --git a/__tests__/unit/core-transactions/handlers/__support__/app.ts b/__tests__/unit/core-transactions/handlers/__support__/app.ts index bea4eebf4c..19982de7b7 100644 --- a/__tests__/unit/core-transactions/handlers/__support__/app.ts +++ b/__tests__/unit/core-transactions/handlers/__support__/app.ts @@ -20,11 +20,14 @@ import { RevertTransactionAction, ThrowIfCannotEnterPoolAction, VerifyTransactionAction, + OnPoolEnterAction, + OnPoolLeaveAction, } from "@packages/core-transaction-pool/src/actions"; import { DynamicFeeMatcher } from "@packages/core-transaction-pool/src/dynamic-fee-matcher"; import { ExpirationService } from "@packages/core-transaction-pool/src/expiration-service"; import { Mempool } from "@packages/core-transaction-pool/src/mempool"; import { Query } from "@packages/core-transaction-pool/src/query"; +import { MempoolIndexRegistry } from "@packages/core-transaction-pool/src/mempool-index-registry"; import { SenderMempool } from "@packages/core-transaction-pool/src/sender-mempool"; import { SenderState } from "@packages/core-transaction-pool/src/sender-state"; import { One, Two } from "@packages/core-transactions/src/handlers"; @@ -33,6 +36,10 @@ import { TransactionHandlerRegistry } from "@packages/core-transactions/src/hand import { Identities, Utils } from "@packages/crypto"; import { IMultiSignatureAsset } from "@packages/crypto/src/interfaces"; import { ServiceProvider } from "@packages/core-transactions/src/service-provider"; +import { + SecondSignatureVerificationMemoized, + MultiSignatureVerificationMemoized, +} from "@packages/core-transactions/src/verification"; const logger = { notice: jest.fn(), @@ -101,6 +108,7 @@ export const initApp = (): Application => { "maxTransactionsPerSender", 300, ); + app.get(Container.Identifiers.PluginConfiguration).set("memoizerCacheSize", 20000); app.bind(Container.Identifiers.StateStore).to(StateStore).inTransientScope(); @@ -112,6 +120,7 @@ export const initApp = (): Application => { app.bind(Container.Identifiers.TransactionPoolDynamicFeeMatcher).to(DynamicFeeMatcher); app.bind(Container.Identifiers.TransactionPoolExpirationService).to(ExpirationService); + app.bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry).to(MempoolIndexRegistry).inSingletonScope(); app.bind(Container.Identifiers.TransactionPoolSenderMempool).to(SenderMempool); app.bind(Container.Identifiers.TransactionPoolSenderMempoolFactory).toAutoFactory( Container.Identifiers.TransactionPoolSenderMempool, @@ -126,6 +135,14 @@ export const initApp = (): Application => { app.bind(Identifiers.DatabaseTransactionRepository).toConstantValue(Mocks.TransactionRepository.instance); + app.bind(Identifiers.TransactionSecondSignatureVerification) + .to(SecondSignatureVerificationMemoized) + .inSingletonScope(); + + app.bind(Identifiers.TransactionMultiSignatureVerification) + .to(MultiSignatureVerificationMemoized) + .inSingletonScope(); + app.bind(Identifiers.TransactionHandler).to(One.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(Two.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(One.SecondSignatureRegistrationTransactionHandler); @@ -171,6 +188,16 @@ export const initApp = (): Application => { new RevertTransactionAction(), ); + app.get(Container.Identifiers.TriggerService).bind( + "onPoolEnter", + new OnPoolEnterAction(), + ); + + app.get(Container.Identifiers.TriggerService).bind( + "onPoolLeave", + new OnPoolLeaveAction(), + ); + return app; }; @@ -235,3 +262,23 @@ export const buildMultiSignatureWallet = (): Wallets.Wallet => { return wallet; }; + +export const buildMultiSignatureRecipientWallet = (): Wallets.Wallet => { + const multiSignatureAsset: IMultiSignatureAsset = { + publicKeys: [ + Identities.PublicKey.fromPassphrase(passphrases[1]), + Identities.PublicKey.fromPassphrase(passphrases[2]), + Identities.PublicKey.fromPassphrase(passphrases[3]), + ], + min: 2, + }; + + const wallet = new Wallets.Wallet( + Identities.Address.fromMultiSignatureAsset(multiSignatureAsset), + new Services.Attributes.AttributeMap(getWalletAttributeSet()), + ); + wallet.setPublicKey(Identities.PublicKey.fromMultiSignatureAsset(multiSignatureAsset)); + wallet.setAttribute("multiSignature", multiSignatureAsset); + + return wallet; +}; diff --git a/__tests__/unit/core-transactions/handlers/handler-registry.test.ts b/__tests__/unit/core-transactions/handlers/handler-registry.test.ts index 0ebeedfef9..8b66e9fc2e 100644 --- a/__tests__/unit/core-transactions/handlers/handler-registry.test.ts +++ b/__tests__/unit/core-transactions/handlers/handler-registry.test.ts @@ -1,8 +1,8 @@ import "jest-extended"; -import { Services } from "@packages/core-kernel"; +import { Container, Providers, Services } from "@packages/core-kernel"; import { Application } from "@packages/core-kernel/src/application"; -import { Container, Identifiers } from "@packages/core-kernel/src/ioc"; +import { Identifiers } from "@packages/core-kernel/src/ioc"; import { DeactivatedTransactionHandlerError, InvalidTransactionTypeError, @@ -10,6 +10,10 @@ import { import { One, TransactionHandler, TransactionHandlerConstructor, Two } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerProvider } from "@packages/core-transactions/src/handlers/handler-provider"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; +import { + MultiSignatureVerificationMemoized, + SecondSignatureVerificationMemoized, +} from "@packages/core-transactions/src/verification"; import { ServiceProvider } from "@packages/core-transactions/src/service-provider"; import { Crypto, Enums, Identities, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; import { TransactionSchema } from "@packages/crypto/src/transactions/types/schemas"; @@ -114,7 +118,7 @@ class TestWithDependencyTransactionHandler extends TransactionHandler { } beforeEach(() => { - app = new Application(new Container()); + app = new Application(new Container.Container()); app.bind(Identifiers.TransactionHistoryService).toConstantValue(null); app.bind(Identifiers.ApplicationNamespace).toConstantValue("ark-unitnet"); app.bind(Identifiers.LogService).toConstantValue({}); @@ -126,6 +130,13 @@ beforeEach(() => { app.bind(Identifiers.DatabaseTransactionRepository).toConstantValue({}); app.bind(Identifiers.WalletRepository).toConstantValue({}); app.bind(Identifiers.TransactionPoolQuery).toConstantValue({}); + app.bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry).toConstantValue({}); + app.bind(Identifiers.TransactionSecondSignatureVerification) + .to(SecondSignatureVerificationMemoized) + .inSingletonScope(); + app.bind(Identifiers.TransactionMultiSignatureVerification) + .to(MultiSignatureVerificationMemoized) + .inSingletonScope(); app.bind(Identifiers.TransactionHandler).to(One.TransferTransactionHandler); app.bind(Identifiers.TransactionHandler).to(Two.TransferTransactionHandler); @@ -150,7 +161,16 @@ beforeEach(() => { ServiceProvider.getTransactionHandlerConstructorsBinding(), ); + const pluginConfiguration = app.resolve(Providers.PluginConfiguration); + const pluginConfigurationInstance: Providers.PluginConfiguration = pluginConfiguration.from("core-transactions", { + memoizerCacheSize: 20000, + }); + app.bind(Identifiers.PluginConfiguration) + .toConstantValue(pluginConfigurationInstance) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("plugin", "@arkecosystem/core-transactions")); + Managers.configManager.getMilestone().aip11 = false; + Managers.configManager.getMilestone().multiSignatureRegistrationEnabled = true; }); afterEach(() => { diff --git a/__tests__/unit/core-transactions/handlers/one/multi-signature-registration.test.ts b/__tests__/unit/core-transactions/handlers/one/multi-signature-registration.test.ts index c8ca5c3d77..872e5a56f3 100644 --- a/__tests__/unit/core-transactions/handlers/one/multi-signature-registration.test.ts +++ b/__tests__/unit/core-transactions/handlers/one/multi-signature-registration.test.ts @@ -16,9 +16,9 @@ import { import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Identities, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { IMultiSignatureAsset } from "@packages/crypto/src/interfaces"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, @@ -243,7 +243,7 @@ describe("MultiSignatureRegistrationTransaction", () => { }); }); - describe("applyToSender", () => { + describe.skip("applyToSender", () => { it("should be ok", async () => { await expect(handler.applyToSender(multiSignatureTransaction)).rejects.toThrow(LegacyMultiSignatureError); }); diff --git a/__tests__/unit/core-transactions/handlers/two/delegate-registration.test.ts b/__tests__/unit/core-transactions/handlers/two/delegate-registration.test.ts index e022c546c4..6e2ba97ca4 100644 --- a/__tests__/unit/core-transactions/handlers/two/delegate-registration.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/delegate-registration.test.ts @@ -10,6 +10,7 @@ import { Generators } from "@packages/core-test-framework/src"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { Mempool } from "@packages/core-transaction-pool/src/mempool"; +import { MempoolIndexes } from "@packages/core-transactions/src/enums"; import { InsufficientBalanceError, NotSupportedForMultiSignatureWalletError, @@ -20,9 +21,9 @@ import { import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Identities, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { IMultiSignatureAsset } from "@packages/crypto/src/interfaces"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, @@ -57,6 +58,7 @@ beforeEach(() => { Managers.configManager.setConfig(config); app = initApp(); + app.bind(Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.DelegateUsername); app.bind(Identifiers.TransactionHistoryService).toConstantValue(transactionHistoryService); walletRepository = app.get(Identifiers.WalletRepository); @@ -477,6 +479,81 @@ describe("DelegateRegistrationTransaction", () => { }); }); + describe("onPoolEnter", () => { + it("should set username on DelegateUsername index", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername), "set"); + + await expect(handler.onPoolEnter(delegateRegistrationTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith( + delegateRegistrationTransaction.data.asset.delegate.username, + delegateRegistrationTransaction, + ); + }); + }); + + describe("onPoolLeave", () => { + it("should forget username on DelegateUsername index", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername), "forget"); + + await expect(handler.onPoolLeave(delegateRegistrationTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(delegateRegistrationTransaction.data.asset.delegate.username); + }); + }); + + describe("getInvalidPoolTransactions", () => { + it("should return empty array if there are no invalid transactions", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername), "has") + .mockReturnValueOnce(false); + + await expect(handler.getInvalidPoolTransactions(delegateRegistrationTransaction)).resolves.toEqual([]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(delegateRegistrationTransaction.data.asset.delegate.username); + }); + + it("should return invalid transaction if transaction with same username is indexed", async () => { + const invalidDelegateRegistrationTransaction = BuilderFactory.delegateRegistration() + .usernameAsset("dummy") + .nonce("1") + .sign(passphrases[1]) + .build(); + + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername), "has") + .mockReturnValueOnce(true); + + const spyOnIndexGet = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername), "get") + .mockReturnValueOnce(invalidDelegateRegistrationTransaction); + + await expect(handler.getInvalidPoolTransactions(delegateRegistrationTransaction)).resolves.toEqual([ + invalidDelegateRegistrationTransaction, + ]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(delegateRegistrationTransaction.data.asset.delegate.username); + expect(spyOnIndexGet).toBeCalledTimes(1); + expect(spyOnIndexGet).toBeCalledWith(delegateRegistrationTransaction.data.asset.delegate.username); + }); + }); + describe("apply and revert", () => { it("should resolve", async () => { const walletBalance = senderWallet.getBalance(); diff --git a/__tests__/unit/core-transactions/handlers/two/delegate-resignation.test.ts b/__tests__/unit/core-transactions/handlers/two/delegate-resignation.test.ts index 3798536dc4..f0f9dae35b 100644 --- a/__tests__/unit/core-transactions/handlers/two/delegate-resignation.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/delegate-resignation.test.ts @@ -19,8 +19,8 @@ import { import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, diff --git a/__tests__/unit/core-transactions/handlers/two/htlc-claim.test.ts b/__tests__/unit/core-transactions/handlers/two/htlc-claim.test.ts index 0655ef9566..a2f3fe9bc0 100644 --- a/__tests__/unit/core-transactions/handlers/two/htlc-claim.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/htlc-claim.test.ts @@ -9,6 +9,7 @@ import { Generators } from "@packages/core-test-framework/src"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { Mempool } from "@packages/core-transaction-pool/src/mempool"; +import { MempoolIndexes } from "@packages/core-transactions/src/enums"; import { HtlcLockExpiredError, HtlcLockTransactionNotFoundError, @@ -17,8 +18,8 @@ import { import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { htlcSecretHashHex, htlcSecretHex } from "../__fixtures__/htlc-secrets"; import { @@ -58,6 +59,7 @@ beforeEach(() => { Managers.configManager.setConfig(config); app = initApp(); + app.bind(Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.HtlcClaimTransactionId); app.bind(Identifiers.TransactionHistoryService).toConstantValue(null); walletRepository = app.get(Identifiers.WalletRepository); @@ -414,6 +416,90 @@ describe("Htlc claim", () => { }); }); + describe("onPoolEnter", () => { + it("should set lockTransactionId on HtlcClaimTransactionId index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn( + mempoolIndexRegistry.get(MempoolIndexes.HtlcClaimTransactionId), + "set", + ); + + expect(handler.onPoolEnter(htlcClaimTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith( + htlcClaimTransaction.data.asset.claim.lockTransactionId, + htlcClaimTransaction, + ); + }); + }); + + describe("onPoolLeave", () => { + it("should forget lockTransactionId on HtlcClaimTransactionId index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn( + mempoolIndexRegistry.get(MempoolIndexes.HtlcClaimTransactionId), + "forget", + ); + + expect(handler.onPoolLeave(htlcClaimTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(htlcClaimTransaction.data.asset.claim.lockTransactionId); + }); + }); + + describe("getInvalidPoolTransactions", () => { + it("should return empty array if there are no invalid transactions", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.HtlcClaimTransactionId), "has") + .mockReturnValueOnce(false); + + await expect(handler.getInvalidPoolTransactions(htlcClaimTransaction)).resolves.toEqual([]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(htlcClaimTransaction.data.asset.claim.lockTransactionId); + }); + + it("should return invalid transaction if transaction with same transaction id is indexed", async () => { + const invalidHtlcClaimTransaction = BuilderFactory.htlcClaim() + .htlcClaimAsset({ + unlockSecret: htlcSecretHex, + lockTransactionId: htlcLockTransaction.id!, + }) + .nonce("2") + .sign(claimPassphrase) + .build(); + + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.HtlcClaimTransactionId), "has") + .mockReturnValueOnce(true); + + const spyOnIndexGet = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.HtlcClaimTransactionId), "get") + .mockReturnValueOnce(invalidHtlcClaimTransaction); + + await expect(handler.getInvalidPoolTransactions(htlcClaimTransaction)).resolves.toEqual([ + invalidHtlcClaimTransaction, + ]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(htlcClaimTransaction.data.asset.claim.lockTransactionId); + expect(spyOnIndexGet).toBeCalledTimes(1); + expect(spyOnIndexGet).toBeCalledWith(htlcClaimTransaction.data.asset.claim.lockTransactionId); + }); + }); + describe("apply", () => { let pubKeyHash: number; diff --git a/__tests__/unit/core-transactions/handlers/two/htlc-lock.test.ts b/__tests__/unit/core-transactions/handlers/two/htlc-lock.test.ts index 48503e9bd2..038600ee23 100644 --- a/__tests__/unit/core-transactions/handlers/two/htlc-lock.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/htlc-lock.test.ts @@ -8,12 +8,16 @@ import { Mapper, Mocks } from "@packages/core-test-framework"; import { Generators } from "@packages/core-test-framework/src"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; -import { HtlcLockExpiredError, InsufficientBalanceError } from "@packages/core-transactions/src/errors"; +import { + HtlcLockExpiredError, + InsufficientBalanceError, + DisabledMultiSignatureSending, +} from "@packages/core-transactions/src/errors"; import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { htlcSecretHashHex } from "../__fixtures__/htlc-secrets"; import { @@ -229,12 +233,20 @@ describe("Htlc lock", () => { ).toResolve(); }); - it("should not throw - multi sign", async () => { + it("should not throw - multi sign if and multiSignatureSendingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = true; await expect( handler.throwIfCannotBeApplied(multiSignatureHtlcLockTransaction, multiSignatureWallet), ).toResolve(); }); + it("should throw - multi sign if and multiSignatureSendingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = false; + await expect( + handler.throwIfCannotBeApplied(multiSignatureHtlcLockTransaction, multiSignatureWallet), + ).rejects.toThrow(DisabledMultiSignatureSending); + }); + it("should throw if asset is undefined", async () => { htlcLockTransaction.data.asset = undefined; diff --git a/__tests__/unit/core-transactions/handlers/two/htlc-refund.test.ts b/__tests__/unit/core-transactions/handlers/two/htlc-refund.test.ts index 1704cfc0ed..2d5dbe2a46 100644 --- a/__tests__/unit/core-transactions/handlers/two/htlc-refund.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/htlc-refund.test.ts @@ -9,12 +9,13 @@ import { Generators } from "@packages/core-test-framework/src"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { Mempool } from "@packages/core-transaction-pool/src/mempool"; +import { MempoolIndexes } from "@packages/core-transactions/src/enums"; import { HtlcLockNotExpiredError, HtlcLockTransactionNotFoundError } from "@packages/core-transactions/src/errors"; import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { htlcSecretHashHex } from "../__fixtures__/htlc-secrets"; import { @@ -54,6 +55,7 @@ beforeEach(() => { Managers.configManager.setConfig(config); app = initApp(); + app.bind(Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.HtlcRefundTransactionId); app.bind(Identifiers.TransactionHistoryService).toConstantValue(null); walletRepository = app.get(Identifiers.WalletRepository); @@ -360,6 +362,89 @@ describe("Htlc refund", () => { }); }); + describe("onPoolEnter", () => { + it("should set lockTransactionId on HtlcRefundTransactionId index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn( + mempoolIndexRegistry.get(MempoolIndexes.HtlcRefundTransactionId), + "set", + ); + + expect(handler.onPoolEnter(htlcRefundTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith( + htlcRefundTransaction.data.asset.refund.lockTransactionId, + htlcRefundTransaction, + ); + }); + }); + + describe("onPoolLeave", () => { + it("should forget lockTransactionId on HtlcRefundTransactionId index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn( + mempoolIndexRegistry.get(MempoolIndexes.HtlcRefundTransactionId), + "forget", + ); + + expect(handler.onPoolLeave(htlcRefundTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(htlcRefundTransaction.data.asset.refund.lockTransactionId); + }); + }); + + describe("getInvalidPoolTransactions", () => { + it("should return empty array if there are no invalid transactions", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.HtlcRefundTransactionId), "has") + .mockReturnValueOnce(false); + + await expect(handler.getInvalidPoolTransactions(htlcRefundTransaction)).resolves.toEqual([]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(htlcRefundTransaction.data.asset.refund.lockTransactionId); + }); + + it("should return invalid transaction if transaction with same transactionId is indexed", async () => { + const invalidRefundTransaction = BuilderFactory.htlcRefund() + .htlcRefundAsset({ + lockTransactionId: htlcLockTransaction.id!, + }) + .nonce("2") + .sign(lockPassphrase) + .build(); + + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.HtlcRefundTransactionId), "has") + .mockReturnValueOnce(true); + + const spyOnIndexGet = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.HtlcRefundTransactionId), "get") + .mockReturnValueOnce(invalidRefundTransaction); + + await expect(handler.getInvalidPoolTransactions(htlcRefundTransaction)).resolves.toEqual([ + invalidRefundTransaction, + ]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(htlcRefundTransaction.data.asset.refund.lockTransactionId); + expect(spyOnIndexGet).toBeCalledTimes(1); + expect(spyOnIndexGet).toBeCalledWith(htlcRefundTransaction.data.asset.refund.lockTransactionId); + }); + }); + describe("apply", () => { let pubKeyHash: number; diff --git a/__tests__/unit/core-transactions/handlers/two/ipfs.test.ts b/__tests__/unit/core-transactions/handlers/two/ipfs.test.ts index 2daaf34c29..4a22eb07fe 100644 --- a/__tests__/unit/core-transactions/handlers/two/ipfs.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/ipfs.test.ts @@ -8,12 +8,13 @@ import { Generators } from "@packages/core-test-framework/src"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { Mempool } from "@packages/core-transaction-pool"; -import { InsufficientBalanceError, IpfsHashAlreadyExists } from "@packages/core-transactions/src/errors"; +import { MempoolIndexes } from "@packages/core-transactions/src/enums"; +import { InsufficientBalanceError, IpfsHashAlreadyExists, DisabledMultiSignatureSending } from "@packages/core-transactions/src/errors"; import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; -import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; +import { configManager } from "@packages/crypto/dist/managers"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { buildMultiSignatureWallet, @@ -49,6 +50,7 @@ beforeEach(() => { Managers.configManager.setConfig(config); app = initApp(); + app.bind(Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.Ipfs); app.bind(Identifiers.TransactionHistoryService).toConstantValue(transactionHistoryService); walletRepository = app.get(Identifiers.WalletRepository); @@ -185,7 +187,7 @@ describe("Ipfs", () => { it("should return true when aip11 === true", async () => { await expect(handler.isActivated()).resolves.toBeTrue(); - jest.spyOn(Managers.configManager, "getMilestone").mockReturnValue({}); + Managers.configManager.getMilestone().aip11 = false; await expect(handler.isActivated()).resolves.toBeFalse(); }); @@ -213,6 +215,78 @@ describe("Ipfs", () => { }); }); + describe("onPoolEnter", () => { + it("should set lockTransactionId on HtlcClaimTransactionId index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.Ipfs), "set"); + + expect(handler.onPoolEnter(ipfsTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(ipfsTransaction.data.asset.ipfs, ipfsTransaction); + }); + }); + + describe("onPoolLeave", () => { + it("should forget lockTransactionId on HtlcClaimTransactionId index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.Ipfs), "forget"); + + expect(handler.onPoolLeave(ipfsTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith(ipfsTransaction.data.asset.ipfs); + }); + }); + + describe("getInvalidPoolTransactions", () => { + it("should return empty array if there are no invalid transactions", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.Ipfs), "has") + .mockReturnValueOnce(false); + + await expect(handler.getInvalidPoolTransactions(ipfsTransaction)).resolves.toEqual([]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(ipfsTransaction.data.asset.ipfs); + }); + + it("should return invalid transaction if transaction with same ipfs address is indexed", async () => { + const invalidIpfsTransaction = BuilderFactory.ipfs() + .ipfsAsset("QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w") + .nonce("1") + .sign(passphrases[0]) + .build(); + + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.Ipfs), "has") + .mockReturnValueOnce(true); + + const spyOnIndexGet = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.Ipfs), "get") + .mockReturnValueOnce(invalidIpfsTransaction); + + await expect(handler.getInvalidPoolTransactions(ipfsTransaction)).resolves.toEqual([ + invalidIpfsTransaction, + ]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith(ipfsTransaction.data.asset.ipfs); + expect(spyOnIndexGet).toBeCalledTimes(1); + expect(spyOnIndexGet).toBeCalledWith(ipfsTransaction.data.asset.ipfs); + }); + }); + describe("throwIfCannotBeApplied", () => { let pubKeyHash: number; @@ -229,25 +303,26 @@ describe("Ipfs", () => { await expect(handler.throwIfCannotBeApplied(ipfsTransaction, senderWallet)).toResolve(); }); - it("should not throw defined as exception", async () => { - configManager.set("network.pubKeyHash", 99); - configManager.set("exceptions.transactions", [ipfsTransaction.id]); - - await expect(handler.throwIfCannotBeApplied(ipfsTransaction, senderWallet)).toResolve(); - }); - it("should not throw - second sign", async () => { await expect( handler.throwIfCannotBeApplied(secondSignatureIpfsTransaction, secondSignatureWallet), ).toResolve(); }); - it("should not throw - multi sign", async () => { + it("should not throw - multi sign if and multiSignatureSendingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = true; await expect( handler.throwIfCannotBeApplied(multiSignatureIpfsTransaction, multiSignatureWallet), ).toResolve(); }); + it("should throw - multi sign if and multiSignatureSendingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = false; + await expect( + handler.throwIfCannotBeApplied(multiSignatureIpfsTransaction, multiSignatureWallet), + ).rejects.toThrow(DisabledMultiSignatureSending); + }); + it("should throw if wallet has insufficient funds", async () => { senderWallet.setBalance(Utils.BigNumber.ZERO); @@ -271,6 +346,13 @@ describe("Ipfs", () => { IpfsHashAlreadyExists, ); }); + + it("should not throw defined as exception", async () => { + configManager.set("network.pubKeyHash", 99); + configManager.set("exceptions.transactions", [ipfsTransaction.id]); + + await expect(handler.throwIfCannotBeApplied(ipfsTransaction, senderWallet)).toResolve(); + }); }); describe("apply", () => { diff --git a/__tests__/unit/core-transactions/handlers/two/multi-payment.test.ts b/__tests__/unit/core-transactions/handlers/two/multi-payment.test.ts index 9d06ab3712..12bfff936f 100644 --- a/__tests__/unit/core-transactions/handlers/two/multi-payment.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/multi-payment.test.ts @@ -7,17 +7,18 @@ import { StateStore } from "@packages/core-state/src/stores/state"; import { Generators } from "@packages/core-test-framework/src"; import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/factories"; import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; -import { InsufficientBalanceError } from "@packages/core-transactions/src/errors"; +import { InsufficientBalanceError, DisabledMultiSignatureSending, DisabledMultiSignatureReceiving } from "@packages/core-transactions/src/errors"; import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, buildRecipientWallet, buildSecondSignatureWallet, + buildMultiSignatureRecipientWallet, buildSenderWallet, initApp, } from "../__support__/app"; @@ -26,6 +27,7 @@ let app: Application; let senderWallet: Wallets.Wallet; let secondSignatureWallet: Wallets.Wallet; let multiSignatureWallet: Wallets.Wallet; +let multiSignatureRecipientWallet: Wallets.Wallet; let recipientWallet: Wallets.Wallet; let walletRepository: Contracts.State.WalletRepository; let factoryBuilder: FactoryBuilder; @@ -59,11 +61,13 @@ beforeEach(() => { senderWallet = buildSenderWallet(factoryBuilder); secondSignatureWallet = buildSecondSignatureWallet(factoryBuilder); multiSignatureWallet = buildMultiSignatureWallet(); + multiSignatureRecipientWallet = buildMultiSignatureRecipientWallet(); recipientWallet = buildRecipientWallet(factoryBuilder); walletRepository.index(senderWallet); walletRepository.index(secondSignatureWallet); walletRepository.index(multiSignatureWallet); + walletRepository.index(multiSignatureRecipientWallet); walletRepository.index(recipientWallet); }); @@ -156,12 +160,22 @@ describe("MultiPaymentTransaction", () => { ).toResolve(); }); - it("should not throw - multi sign", async () => { + it("should not throw - multi sign if and multiSignatureSendingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = true; await expect( handler.throwIfCannotBeApplied(multiSignatureMultiPaymentTransaction, multiSignatureWallet), ).toResolve(); }); + it("should throw - multi sign if and multiSignatureSendingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = false; + await expect( + handler.throwIfCannotBeApplied(multiSignatureMultiPaymentTransaction, multiSignatureWallet), + ).rejects.toThrow( + DisabledMultiSignatureSending, + ); + }); + it("should throw if asset is undefined", async () => { multiPaymentTransaction.data.asset = undefined; @@ -183,6 +197,35 @@ describe("MultiPaymentTransaction", () => { InsufficientBalanceError, ); }); + + it("should not throw if recipient is multisignature wallet and multiSignatureReceivingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureReceivingEnabled = true; + const multiPaymentTransaction = BuilderFactory.multiPayment() + .addPayment("ARYJmeYHSUTgbxaiqsgoPwf6M3CYukqdKN", "10") + .addPayment("AFyjB5jULQiYNsp37wwipCm9c7V1xEzTJD", "20") + .addPayment(multiSignatureRecipientWallet.getAddress(), "20") + .nonce("1") + .sign(passphrases[0]) + .build(); + + await expect(handler.throwIfCannotBeApplied(multiPaymentTransaction, senderWallet)).toResolve(); + }); + + it("should throw if recipient is multisignature wallet and multiSignatureReceivingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureReceivingEnabled = false; + const multiPaymentTransaction = BuilderFactory.multiPayment() + .addPayment("ARYJmeYHSUTgbxaiqsgoPwf6M3CYukqdKN", "10") + .addPayment("AFyjB5jULQiYNsp37wwipCm9c7V1xEzTJD", "20") + .addPayment(multiSignatureRecipientWallet.getAddress(), "20") + .nonce("1") + .sign(passphrases[0]) + .build(); + + await expect(handler.throwIfCannotBeApplied(multiPaymentTransaction, senderWallet)).rejects.toThrow( + DisabledMultiSignatureReceiving, + ); + }); + }); describe("apply", () => { diff --git a/__tests__/unit/core-transactions/handlers/two/multi-signature-registration.test.ts b/__tests__/unit/core-transactions/handlers/two/multi-signature-registration.test.ts index ec054a1ee6..7815fdbfcd 100644 --- a/__tests__/unit/core-transactions/handlers/two/multi-signature-registration.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/multi-signature-registration.test.ts @@ -9,6 +9,7 @@ import { Factories, FactoryBuilder } from "@packages/core-test-framework/src/fac import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; import { getWalletAttributeSet } from "@packages/core-test-framework/src/internal/wallet-attributes"; import { Mempool } from "@packages/core-transaction-pool/src/mempool"; +import { MempoolIndexes } from "@packages/core-transactions/src/enums"; import { InsufficientBalanceError, InvalidMultiSignatureError, @@ -20,9 +21,9 @@ import { import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Errors, Identities, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { IMultiSignatureAsset, IMultiSignatureLegacyAsset } from "@packages/crypto/src/interfaces"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildRecipientWallet, buildSecondSignatureWallet, buildSenderWallet, initApp } from "../__support__/app"; @@ -51,6 +52,7 @@ beforeEach(() => { Managers.configManager.setConfig(config); app = initApp(); + app.bind(Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.MultiSignatureAddress); app.bind(Identifiers.TransactionHistoryService).toConstantValue(transactionHistoryService); walletRepository = app.get(Identifiers.WalletRepository); @@ -399,6 +401,94 @@ describe("MultiSignatureRegistrationTransaction", () => { }); }); + describe("onPoolEnter", () => { + it("should set multiSignatureAddress on MultiSignatureAddress index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress), "set"); + + expect(handler.onPoolEnter(multiSignatureTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith( + Identities.Address.fromMultiSignatureAsset(multiSignatureTransaction.data.asset.multiSignature), + multiSignatureTransaction, + ); + }); + }); + + describe("onPoolLeave", () => { + it("should forget multiSignatureAddress on MultiSignatureAddress index", () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexSet = jest.spyOn(mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress), "forget"); + + expect(handler.onPoolLeave(multiSignatureTransaction)).toResolve(); + expect(spyOnIndexSet).toBeCalledTimes(1); + expect(spyOnIndexSet).toBeCalledWith( + Identities.Address.fromMultiSignatureAsset(multiSignatureTransaction.data.asset.multiSignature), + ); + }); + }); + + describe("getInvalidPoolTransactions", () => { + it("should return empty array if there are no invalid transactions", async () => { + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress), "has") + .mockReturnValueOnce(false); + + await expect(handler.getInvalidPoolTransactions(multiSignatureTransaction)).resolves.toEqual([]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith( + Identities.Address.fromMultiSignatureAsset(multiSignatureTransaction.data.asset.multiSignature), + ); + }); + + it("should return invalid transaction if transaction with same multi signature address is indexed", async () => { + const invalidMultiSignatureTransaction = BuilderFactory.multiSignature() + .multiSignatureAsset(multiSignatureAsset) + .senderPublicKey(senderWallet.getPublicKey()!) + .nonce("1") + .recipientId(recipientWallet.getPublicKey()!) + .multiSign(passphrases[0], 0) + .multiSign(passphrases[1], 1) + .multiSign(passphrases[2], 2) + .sign(passphrases[0]) + .build(); + + const mempoolIndexRegistry = app.get( + Identifiers.TransactionPoolMempoolIndexRegistry, + ); + + const spyOnIndexHas = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress), "has") + .mockReturnValueOnce(true); + + const spyOnIndexGet = jest + .spyOn(mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress), "get") + .mockReturnValueOnce(invalidMultiSignatureTransaction); + + await expect(handler.getInvalidPoolTransactions(multiSignatureTransaction)).resolves.toEqual([ + invalidMultiSignatureTransaction, + ]); + expect(spyOnIndexHas).toBeCalledTimes(1); + expect(spyOnIndexHas).toBeCalledWith( + Identities.Address.fromMultiSignatureAsset(multiSignatureTransaction.data.asset.multiSignature), + ); + expect(spyOnIndexGet).toBeCalledTimes(1); + expect(spyOnIndexGet).toBeCalledWith( + Identities.Address.fromMultiSignatureAsset(multiSignatureTransaction.data.asset.multiSignature), + ); + }); + }); + describe("apply", () => { it("should be ok", async () => { recipientWallet.forgetAttribute("multiSignature"); diff --git a/__tests__/unit/core-transactions/handlers/two/second-signature-registration.test.ts b/__tests__/unit/core-transactions/handlers/two/second-signature-registration.test.ts index 935be8083c..fd0095e42a 100644 --- a/__tests__/unit/core-transactions/handlers/two/second-signature-registration.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/second-signature-registration.test.ts @@ -16,9 +16,9 @@ import { import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Identities, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { IMultiSignatureAsset } from "@packages/crypto/src/interfaces"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, diff --git a/__tests__/unit/core-transactions/handlers/two/transaction.test.ts b/__tests__/unit/core-transactions/handlers/two/transaction.test.ts index 3b8c1bde06..b172d27205 100644 --- a/__tests__/unit/core-transactions/handlers/two/transaction.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/transaction.test.ts @@ -23,10 +23,9 @@ import { import { TransactionHandler, TransactionHandlerConstructor } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Identities, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { IMultiSignatureAsset } from "@packages/crypto/src/interfaces"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; -import ByteBuffer from "bytebuffer"; import { buildMultiSignatureWallet, @@ -62,8 +61,8 @@ class TestTransaction extends Transactions.Transaction { }; } - public serialize(options?: any): ByteBuffer | undefined { - return new ByteBuffer(0); + public serialize(options?: any): Utils.ByteBuffer | undefined { + return new Utils.ByteBuffer(Buffer.alloc(0)); } public deserialize(buf) { @@ -416,12 +415,6 @@ describe("General Tests", () => { ); }); - it("should resolve defined as exception", async () => { - configManager.set("exceptions.transactions", [transferTransaction.id]); - configManager.set("network.pubKeyHash", 99); - await expect(handler.apply(transferTransaction)).toResolve(); - }); - it("should resolve with V1", async () => { configManager.getMilestone().aip11 = false; @@ -445,6 +438,12 @@ describe("General Tests", () => { senderWallet.setBalance(Utils.BigNumber.ZERO); await expect(handler.apply(transferTransaction)).rejects.toThrow(InsufficientBalanceError); }); + + it("should resolve defined as exception", async () => { + configManager.set("exceptions.transactions", [transferTransaction.id]); + configManager.set("network.pubKeyHash", 99); + await expect(handler.apply(transferTransaction)).toResolve(); + }); }); describe("revert", () => { diff --git a/__tests__/unit/core-transactions/handlers/two/transfer.test.ts b/__tests__/unit/core-transactions/handlers/two/transfer.test.ts index ef13b92ddf..98b4baf920 100644 --- a/__tests__/unit/core-transactions/handlers/two/transfer.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/transfer.test.ts @@ -12,18 +12,21 @@ import { ColdWalletError, InsufficientBalanceError, SenderWalletMismatchError, + DisabledMultiSignatureReceiving, + DisabledMultiSignatureSending, } from "@packages/core-transactions/src/errors"; import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { TransferTransactionHandler } from "@packages/core-transactions/src/handlers/one"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, buildRecipientWallet, buildSecondSignatureWallet, + buildMultiSignatureRecipientWallet, buildSenderWallet, initApp, } from "../__support__/app"; @@ -32,6 +35,7 @@ let app: Application; let senderWallet: Wallets.Wallet; let secondSignatureWallet: Wallets.Wallet; let multiSignatureWallet: Wallets.Wallet; +let multiSignatureRecipientWallet: Wallets.Wallet; let recipientWallet: Wallets.Wallet; let walletRepository: Contracts.State.WalletRepository; let factoryBuilder: FactoryBuilder; @@ -59,11 +63,13 @@ beforeEach(() => { senderWallet = buildSenderWallet(factoryBuilder); secondSignatureWallet = buildSecondSignatureWallet(factoryBuilder); multiSignatureWallet = buildMultiSignatureWallet(); + multiSignatureRecipientWallet = buildMultiSignatureRecipientWallet(); recipientWallet = buildRecipientWallet(factoryBuilder); walletRepository.index(senderWallet); walletRepository.index(secondSignatureWallet); walletRepository.index(multiSignatureWallet); + walletRepository.index(multiSignatureRecipientWallet); walletRepository.index(recipientWallet); }); @@ -116,6 +122,7 @@ describe("TransferTransaction", () => { afterEach(async () => { Managers.configManager.set("network.pubKeyHash", pubKeyHash); + }); describe("bootstrap", () => { @@ -142,12 +149,23 @@ describe("TransferTransaction", () => { ).toResolve(); }); - it("should not throw - multi sign", async () => { + it("should not throw - multi sign if and multiSignatureSendingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = true; await expect( handler.throwIfCannotBeApplied(multiSignatureTransferTransaction, multiSignatureWallet), ).toResolve(); }); + + it("should throw - multi sign if and multiSignatureSendingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = false; + await expect( + handler.throwIfCannotBeApplied(multiSignatureTransferTransaction, multiSignatureWallet), + ).rejects.toThrow( + DisabledMultiSignatureSending, + ); + }); + it("should throw", async () => { transferTransaction.data.senderPublicKey = "a".repeat(66); await expect(handler.throwIfCannotBeApplied(transferTransaction, senderWallet)).rejects.toThrow( @@ -185,6 +203,34 @@ describe("TransferTransaction", () => { ); }); + it("should pass if recipient is multi signature wallet and multiSignatureReceivingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureReceivingEnabled = true; + + transferTransaction = BuilderFactory.transfer() + .recipientId(multiSignatureRecipientWallet.getAddress()) + .amount("10000000") + .sign(passphrases[0]) + .nonce("1") + .build(); + + await expect(handler.throwIfCannotBeApplied(transferTransaction, senderWallet)).toResolve(); + }); + + it("should throw if recipient is multi signature wallet and multiSignatureReceivingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureReceivingEnabled = false; + + transferTransaction = BuilderFactory.transfer() + .recipientId(multiSignatureRecipientWallet.getAddress()) + .amount("10000000") + .sign(passphrases[0]) + .nonce("1") + .build(); + + await expect(handler.throwIfCannotBeApplied(transferTransaction, senderWallet)).rejects.toThrow( + DisabledMultiSignatureReceiving, + ); + }); + it("should not throw if recipient is cold wallet", async () => { const coldWallet: Wallets.Wallet = factoryBuilder .get("Wallet") diff --git a/__tests__/unit/core-transactions/handlers/two/vote.test.ts b/__tests__/unit/core-transactions/handlers/two/vote.test.ts index de6c52f239..2072b5c85c 100644 --- a/__tests__/unit/core-transactions/handlers/two/vote.test.ts +++ b/__tests__/unit/core-transactions/handlers/two/vote.test.ts @@ -13,13 +13,14 @@ import { InsufficientBalanceError, NoVoteError, UnvoteMismatchError, + DisabledMultiSignatureSending, VotedForNonDelegateError, } from "@packages/core-transactions/src/errors"; import { TransactionHandler } from "@packages/core-transactions/src/handlers"; import { TransactionHandlerRegistry } from "@packages/core-transactions/src/handlers/handler-registry"; import { Crypto, Enums, Interfaces, Managers, Transactions, Utils } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; import { configManager } from "@packages/crypto/src/managers"; -import { BuilderFactory } from "@packages/crypto/src/transactions"; import { buildMultiSignatureWallet, @@ -297,12 +298,20 @@ describe("VoteTransaction", () => { ).toResolve(); }); - it("should not throw - multi sign vote", async () => { + it("should not throw - multi sign if and multiSignatureSendingEnabled=true", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = true; await expect( handler.throwIfCannotBeApplied(multiSignatureVoteTransaction, multiSignatureWallet), ).toResolve(); }); + it("should throw - multi sign if and multiSignatureSendingEnabled=false", async () => { + Managers.configManager.getMilestone().multiSignatureSendingEnabled = false; + await expect( + handler.throwIfCannotBeApplied(multiSignatureVoteTransaction, multiSignatureWallet), + ).rejects.toThrow(DisabledMultiSignatureSending); + }); + it("should not throw if the unvote is valid and the wallet has voted", async () => { senderWallet.setAttribute("vote", delegateWallet1.getPublicKey()); await expect(handler.throwIfCannotBeApplied(unvoteTransaction, senderWallet)).toResolve(); diff --git a/__tests__/unit/core-transactions/service-provider.test.ts b/__tests__/unit/core-transactions/service-provider.test.ts index e1656b3ad7..b3444c9e2b 100644 --- a/__tests__/unit/core-transactions/service-provider.test.ts +++ b/__tests__/unit/core-transactions/service-provider.test.ts @@ -2,6 +2,7 @@ import "jest-extended"; import { Application, Container } from "@packages/core-kernel/src"; import { ServiceProvider } from "@packages/core-transactions/src/service-provider"; +import { AnySchema } from "joi"; let app: Application; @@ -23,4 +24,66 @@ describe("ServiceProvider", () => { it("should be required", async () => { await expect(serviceProvider.required()).resolves.toBeTrue(); }); + + describe("configSchema", () => { + beforeEach(() => { + serviceProvider = app.resolve(ServiceProvider); + + for (const key of Object.keys(process.env)) { + if (key.includes("CORE_TRANSACTION")) { + delete process.env[key]; + } + } + }); + + it("should validate schema using defaults", async () => { + jest.resetModules(); + const result = (serviceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-transactions/src/defaults")).defaults, + ); + + expect(result.error).toBeUndefined(); + + expect(result.value.memoizerCacheSize).toBeNumber(); + }); + + it("should allow configuration extension", async () => { + jest.resetModules(); + const defaults = (await import("@packages/core-transactions/src/defaults")).defaults; + + // @ts-ignore + defaults.customField = "dummy"; + + const result = (serviceProvider.configSchema() as AnySchema).validate(defaults); + + expect(result.error).toBeUndefined(); + expect(result.value.customField).toEqual("dummy"); + }); + + describe("process.env.CORE_TRANSACTIONS_MEMOIZER_CACHE_SIZE", () => { + it("should parse process.env.CORE_TRANSACTIONS_MEMOIZER_CACHE_SIZE", async () => { + process.env.CORE_TRANSACTIONS_MEMOIZER_CACHE_SIZE = "4000"; + + jest.resetModules(); + const result = (serviceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-transactions/src/defaults")).defaults, + ); + + expect(result.error).toBeUndefined(); + expect(result.value.memoizerCacheSize).toEqual(4000); + }); + + it("should throw if process.env.CORE_TRANSACTIONS_MEMOIZER_CACHE_SIZE is not number", async () => { + process.env.CORE_TRANSACTIONS_MEMOIZER_CACHE_SIZE = "false"; + + jest.resetModules(); + const result = (serviceProvider.configSchema() as AnySchema).validate( + (await import("@packages/core-transactions/src/defaults")).defaults, + ); + + expect(result.error).toBeDefined(); + expect(result.error!.message).toEqual('"memoizerCacheSize" must be a number'); + }); + }); + }); }); diff --git a/__tests__/unit/core-transactions/verification/multi-signature-verification-memoized.test.ts b/__tests__/unit/core-transactions/verification/multi-signature-verification-memoized.test.ts new file mode 100644 index 0000000000..3c6a9947e0 --- /dev/null +++ b/__tests__/unit/core-transactions/verification/multi-signature-verification-memoized.test.ts @@ -0,0 +1,112 @@ +import "jest-extended"; + +import { Application, Container } from "@packages/core-kernel"; +import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; +import { MultiSignatureVerificationMemoized } from "@packages/core-transactions/src/verification/multi-signature-verification-memoized"; +import { Identities, Interfaces, Transactions } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; + +describe("MultiSignatureVerificationMemoized", () => { + let transaction: Interfaces.ITransaction; + let multiSignatureAsset: Interfaces.IMultiSignatureAsset; + + let app: Application; + let verification: MultiSignatureVerificationMemoized; + + const createTransaction = (amount: string) => { + return BuilderFactory.transfer() + .recipientId(Identities.Address.fromPassphrase(passphrases[1])) + .amount(amount) + .sign(passphrases[0]) + .build(); + }; + + beforeEach(() => { + transaction = createTransaction("1"); + multiSignatureAsset = { + min: 2, + publicKeys: ["publicKeys1", "publicKeys2"], + }; + + app = new Application(new Container.Container()); + + verification = app.resolve(MultiSignatureVerificationMemoized); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("verifySignatures", () => { + it("should call verifier if no cached value is found", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySignatures"); + + verification.verifySignatures(transaction.data, multiSignatureAsset); + + expect(spyOnVerifier).toBeCalled(); + }); + + it("should take cached value if called with same parameters", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySignatures"); + + const result1 = verification.verifySignatures(transaction.data, multiSignatureAsset); + const result2 = verification.verifySignatures(transaction.data, multiSignatureAsset); + + expect(spyOnVerifier).toBeCalledTimes(1); + expect(result1).toEqual(result2); + }); + + it("should not take cached value if called with different parameters", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySignatures"); + + verification.verifySignatures(transaction.data, multiSignatureAsset); + verification.verifySignatures(transaction.data, { ...multiSignatureAsset, min: 3 }); + + expect(spyOnVerifier).toBeCalledTimes(2); + }); + + it("should return correct values", () => { + const spyOnVerifier = jest + .spyOn(Transactions.Verifier, "verifySignatures") + .mockReturnValueOnce(false) + .mockReturnValueOnce(true); + + const transaction2 = createTransaction("2"); + + expect(verification.verifySignatures(transaction.data, multiSignatureAsset)).toEqual(false); + expect(verification.verifySignatures(transaction2.data, multiSignatureAsset)).toEqual(true); + + expect(spyOnVerifier).toBeCalledTimes(2); + + // Values from cache + expect(verification.verifySignatures(transaction.data, multiSignatureAsset)).toEqual(false); + expect(verification.verifySignatures(transaction2.data, multiSignatureAsset)).toEqual(true); + + expect(spyOnVerifier).toBeCalledTimes(2); + }); + + it("should throw error if transaction.id is undefined", () => { + transaction.data.id = undefined; + expect(() => verification.verifySignatures(transaction.data, multiSignatureAsset)).toThrowError(); + }); + }); + + describe("clear", () => { + it("should remove cached value by transaction id", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySignatures"); + + const result1 = verification.verifySignatures(transaction.data, multiSignatureAsset); + const result2 = verification.verifySignatures(transaction.data, multiSignatureAsset); + + expect(spyOnVerifier).toBeCalledTimes(1); + expect(result1).toEqual(result2); + + verification.clear(transaction.data.id); + + const result3 = verification.verifySignatures(transaction.data, multiSignatureAsset); + + expect(spyOnVerifier).toBeCalledTimes(2); + expect(result1).toEqual(result3); + }); + }); +}); diff --git a/__tests__/unit/core-transactions/verification/multi-signature-verification.test.ts b/__tests__/unit/core-transactions/verification/multi-signature-verification.test.ts new file mode 100644 index 0000000000..fbb0d512d0 --- /dev/null +++ b/__tests__/unit/core-transactions/verification/multi-signature-verification.test.ts @@ -0,0 +1,55 @@ +import "jest-extended"; + +import { Application, Container, Exceptions } from "@packages/core-kernel"; +import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; +import { MultiSignatureVerification } from "@packages/core-transactions/src/verification"; +import { Identities, Interfaces, Transactions } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; + +describe("MultiSignatureVerificationMemoized", () => { + let transaction: Interfaces.ITransaction; + let multiSignatureAsset: Interfaces.IMultiSignatureAsset; + + let app: Application; + let verification: MultiSignatureVerification; + + const createTransaction = (amount: string) => { + return BuilderFactory.transfer() + .recipientId(Identities.Address.fromPassphrase(passphrases[1])) + .amount(amount) + .sign(passphrases[0]) + .build(); + }; + + beforeEach(() => { + transaction = createTransaction("1"); + multiSignatureAsset = { + min: 2, + publicKeys: ["publicKeys1", "publicKeys2"], + }; + + app = new Application(new Container.Container()); + + verification = app.resolve(MultiSignatureVerification); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("verifySignatures", () => { + it("should call verifySignatures", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySignatures"); + + verification.verifySignatures(transaction.data, multiSignatureAsset); + + expect(spyOnVerifier).toBeCalledWith(transaction.data, multiSignatureAsset); + }); + }); + + describe("clear", () => { + it("should throw error", () => { + expect(() => verification.clear(transaction.data.id)).toThrowError(Exceptions.Runtime.NotImplemented); + }); + }); +}); diff --git a/__tests__/unit/core-transactions/verification/second-signature-verification-memoized.test.ts b/__tests__/unit/core-transactions/verification/second-signature-verification-memoized.test.ts new file mode 100644 index 0000000000..f1210dfa3d --- /dev/null +++ b/__tests__/unit/core-transactions/verification/second-signature-verification-memoized.test.ts @@ -0,0 +1,107 @@ +import "jest-extended"; + +import { Application, Container } from "@packages/core-kernel"; +import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; +import { SecondSignatureVerificationMemoized } from "@packages/core-transactions/src/verification/second-signature-verification-memoized"; +import { Identities, Interfaces, Transactions } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; + +describe("SecondSignatureVerificationMemoized", () => { + let transaction: Interfaces.ITransaction; + + let app: Application; + let verification: SecondSignatureVerificationMemoized; + + const createTransaction = (amount: string) => { + return BuilderFactory.transfer() + .recipientId(Identities.Address.fromPassphrase(passphrases[1])) + .amount(amount) + .sign(passphrases[0]) + .build(); + }; + + beforeEach(() => { + transaction = createTransaction("1"); + + app = new Application(new Container.Container()); + + verification = app.resolve(SecondSignatureVerificationMemoized); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("verifySecondSignature", () => { + it("should call verifier if no cached value is found", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySecondSignature"); + + verification.verifySecondSignature(transaction.data, "publicKey"); + + expect(spyOnVerifier).toBeCalled(); + }); + + it("should take cached value if called with same parameters", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySecondSignature"); + + const result1 = verification.verifySecondSignature(transaction.data, "publicKey"); + const result2 = verification.verifySecondSignature(transaction.data, "publicKey"); + + expect(spyOnVerifier).toBeCalledTimes(1); + expect(result1).toEqual(result2); + }); + + it("should not take cached value if called with different parameters", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySecondSignature"); + + verification.verifySecondSignature(transaction.data, "publicKey"); + verification.verifySecondSignature(transaction.data, "differentPublicKey"); + + expect(spyOnVerifier).toBeCalledTimes(2); + }); + + it("should return correct values", () => { + const spyOnVerifier = jest + .spyOn(Transactions.Verifier, "verifySecondSignature") + .mockReturnValueOnce(false) + .mockReturnValueOnce(true); + + const transaction2 = createTransaction("2"); + + expect(verification.verifySecondSignature(transaction.data, "publicKey")).toEqual(false); + expect(verification.verifySecondSignature(transaction2.data, "publicKey")).toEqual(true); + + expect(spyOnVerifier).toBeCalledTimes(2); + + // Values from cache + expect(verification.verifySecondSignature(transaction.data, "publicKey")).toEqual(false); + expect(verification.verifySecondSignature(transaction2.data, "publicKey")).toEqual(true); + + expect(spyOnVerifier).toBeCalledTimes(2); + }); + + it("should throw error if transaction.id is undefined", () => { + transaction.data.id = undefined; + expect(() => verification.verifySecondSignature(transaction.data, "publicKey")).toThrowError(); + }); + }); + + describe("clear", () => { + it("should remove cached value by transaction id", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySecondSignature"); + + const result1 = verification.verifySecondSignature(transaction.data, "publicKey"); + const result2 = verification.verifySecondSignature(transaction.data, "publicKey"); + + expect(spyOnVerifier).toBeCalledTimes(1); + expect(result1).toEqual(result2); + + verification.clear(transaction.data.id); + + const result3 = verification.verifySecondSignature(transaction.data, "publicKey"); + + expect(spyOnVerifier).toBeCalledTimes(2); + expect(result1).toEqual(result3); + }); + }); +}); diff --git a/__tests__/unit/core-transactions/verification/second-signature-verification.test.ts b/__tests__/unit/core-transactions/verification/second-signature-verification.test.ts new file mode 100644 index 0000000000..7b0b3922da --- /dev/null +++ b/__tests__/unit/core-transactions/verification/second-signature-verification.test.ts @@ -0,0 +1,50 @@ +import "jest-extended"; + +import { Application, Container, Exceptions } from "@packages/core-kernel"; +import passphrases from "@packages/core-test-framework/src/internal/passphrases.json"; +import { SecondSignatureVerification } from "@packages/core-transactions/src/verification"; +import { Identities, Interfaces, Transactions } from "@packages/crypto"; +import { BuilderFactory } from "@packages/crypto/dist/transactions"; + +describe("SecondSignatureVerificationMemoized", () => { + let transaction: Interfaces.ITransaction; + + let app: Application; + let verification: SecondSignatureVerification; + + const createTransaction = (amount: string) => { + return BuilderFactory.transfer() + .recipientId(Identities.Address.fromPassphrase(passphrases[1])) + .amount(amount) + .sign(passphrases[0]) + .build(); + }; + + beforeEach(() => { + transaction = createTransaction("1"); + + app = new Application(new Container.Container()); + + verification = app.resolve(SecondSignatureVerification); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("verifySecondSignature", () => { + it("should call verifySecondSignature", () => { + const spyOnVerifier = jest.spyOn(Transactions.Verifier, "verifySecondSignature"); + + verification.verifySecondSignature(transaction.data, "publicKey"); + + expect(spyOnVerifier).toBeCalledWith(transaction.data, "publicKey"); + }); + }); + + describe("clear", () => { + it("should throw error", () => { + expect(() => verification.clear(transaction.data.id)).toThrowError(Exceptions.Runtime.NotImplemented); + }); + }); +}); diff --git a/__tests__/unit/core-webhooks/listener.test.ts b/__tests__/unit/core-webhooks/listener.test.ts index 70b79e7609..8f58e1f394 100644 --- a/__tests__/unit/core-webhooks/listener.test.ts +++ b/__tests__/unit/core-webhooks/listener.test.ts @@ -27,6 +27,10 @@ const mockEventDispatcher = { dispatch: jest.fn(), }; +const webhooksConfiguration = { + getRequired: jest.fn().mockReturnValue(2000), +}; + let spyOnPost: jest.SpyInstance; const expectFinishedEventData = () => { @@ -54,6 +58,7 @@ beforeEach(() => { sandbox.app.bind(Identifiers.Database).to(Database).inSingletonScope(); sandbox.app.bind(Container.Identifiers.LogService).toConstantValue(logger); + sandbox.app.bind(Container.Identifiers.PluginConfiguration).toConstantValue(webhooksConfiguration); database = sandbox.app.get(Identifiers.Database); database.boot(); diff --git a/__tests__/unit/core-webhooks/service-provider.test.ts b/__tests__/unit/core-webhooks/service-provider.test.ts index 9d40ca86e6..471f9767d0 100644 --- a/__tests__/unit/core-webhooks/service-provider.test.ts +++ b/__tests__/unit/core-webhooks/service-provider.test.ts @@ -2,7 +2,7 @@ import "jest-extended"; import { Identifiers, Server, ServiceProvider as CoreApiServiceProvider } from "@packages/core-api/src"; import { defaults } from "@packages/core-api/src/defaults"; -import { Application, Container, Providers } from "@packages/core-kernel"; +import { Application, Container, Contracts, Providers } from "@packages/core-kernel"; import { NullEventDispatcher } from "@packages/core-kernel/src/services/events/drivers/null"; import { ServiceProvider } from "@packages/core-webhooks/src"; import { defaults as webhooksDefaults } from "@packages/core-webhooks/src/defaults"; @@ -54,7 +54,7 @@ beforeEach(() => { app.bind(Container.Identifiers.PaginationService).toConstantValue({}); - app.bind(Container.Identifiers.EventDispatcherService).to(NullEventDispatcher); + app.bind(Container.Identifiers.EventDispatcherService).to(NullEventDispatcher).inSingletonScope(); app.bind(Container.Identifiers.LogService).toConstantValue(logger); @@ -79,6 +79,11 @@ describe("ServiceProvider", () => { }); it("should register", async () => { + const spyOnListen = jest.spyOn( + app.get(Container.Identifiers.EventDispatcherService), + "listen", + ); + await expect(coreApiServiceProvider.register()).toResolve(); expect(app.isBound(Identifiers.HTTP)).toBeTrue(); @@ -89,6 +94,29 @@ describe("ServiceProvider", () => { serviceProvider.setConfig(instance); await expect(serviceProvider.register()).toResolve(); + + expect(spyOnListen).not.toBeCalled(); + }); + + it("should register and start listening, when enabled", async () => { + const spyOnListen = jest.spyOn( + app.get(Container.Identifiers.EventDispatcherService), + "listen", + ); + + await expect(coreApiServiceProvider.register()).toResolve(); + + expect(app.isBound(Identifiers.HTTP)).toBeTrue(); + + const pluginConfiguration = app.get(Container.Identifiers.PluginConfiguration); + webhooksDefaults.enabled = true; + + const instance = pluginConfiguration.from("core-webhooks", webhooksDefaults); + serviceProvider.setConfig(instance); + + await expect(serviceProvider.register()).toResolve(); + + expect(spyOnListen).toBeCalled(); }); it("should boot", async () => { diff --git a/__tests__/unit/core/cli.test.ts b/__tests__/unit/core/cli.test.ts index d2166c5e71..69f9d0f7fe 100644 --- a/__tests__/unit/core/cli.test.ts +++ b/__tests__/unit/core/cli.test.ts @@ -3,7 +3,6 @@ import "jest-extended"; import { Commands, Services } from "@packages/core-cli"; import { CommandLineInterface } from "@packages/core/src/cli"; import envPaths from "env-paths"; -import { join } from "path"; import prompts from "prompts"; beforeEach(() => { @@ -61,7 +60,7 @@ describe("CLI", () => { describe("discover plugins", () => { it("should load CLI plugins from folder using provided token and network", async () => { - const spyOnDiscover = jest.spyOn(Commands.DiscoverPlugins.prototype, "discover").mockResolvedValueOnce([ + const spyOnList = jest.spyOn(Services.PluginManager.prototype, "list").mockResolvedValueOnce([ // @ts-ignore { path: "test/path", @@ -79,32 +78,26 @@ describe("CLI", () => { const cli = new CommandLineInterface(["help", `--token=${token}`, `--network=${network}`]); await expect(cli.execute("./packages/core/dist")).toResolve(); - expect(spyOnDiscover).toHaveBeenCalledWith( - join(envPaths(token, { suffix: "core" }).data, network, "plugins"), - ); + expect(spyOnList).toHaveBeenCalledWith(token, network); expect(spyOnFrom).toHaveBeenCalled(); }); it("should load CLI plugins from folder using CORE_PATH_CONFIG", async () => { - const spyOnDiscover = jest.spyOn(Commands.DiscoverPlugins.prototype, "discover").mockResolvedValueOnce([]); - + const spyOnList = jest.spyOn(Services.PluginManager.prototype, "list").mockResolvedValueOnce([]); process.env.CORE_PATH_CONFIG = __dirname; const cli = new CommandLineInterface(["help"]); await expect(cli.execute("./packages/core/dist")).toResolve(); - expect(spyOnDiscover).toHaveBeenCalledWith( - join(envPaths("dummyToken", { suffix: "core" }).data, "testnet", "plugins"), - ); + expect(spyOnList).toHaveBeenCalledWith("dummyToken", "testnet"); delete process.env.CORE_PATH_CONFIG; }); it("should load CLI plugins from folder using detected network folder", async () => { - const spyOnDiscoverPlugins = jest - .spyOn(Commands.DiscoverPlugins.prototype, "discover") - .mockResolvedValueOnce([]); + const spyOnList = jest.spyOn(Services.PluginManager.prototype, "list").mockResolvedValueOnce([]); + const spyOnDiscoverNetwork = jest .spyOn(Commands.DiscoverNetwork.prototype, "discover") .mockResolvedValueOnce("testnet"); @@ -112,10 +105,19 @@ describe("CLI", () => { const cli = new CommandLineInterface(["help"]); await expect(cli.execute("./packages/core/dist")).toResolve(); - expect(spyOnDiscoverPlugins).toHaveBeenCalledWith( - join(envPaths("ark", { suffix: "core" }).data, "testnet", "plugins"), - ); + expect(spyOnList).toHaveBeenCalledWith("ark", "testnet"); expect(spyOnDiscoverNetwork).toHaveBeenCalledWith(envPaths("ark", { suffix: "core" }).config); }); + + it("should not load CLI plugins if network is not provided", async () => { + const spyOnList = jest.spyOn(Services.PluginManager.prototype, "list").mockResolvedValueOnce([]); + + const token = "dummy"; + + const cli = new CommandLineInterface(["help", `--token=${token}`]); + await expect(cli.execute("./packages/core/dist")).toResolve(); + + expect(spyOnList).not.toHaveBeenCalled(); + }); }); }); diff --git a/__tests__/unit/core/commands/core-run.test.ts b/__tests__/unit/core/commands/core-run.test.ts index b23632debc..6219ae1053 100644 --- a/__tests__/unit/core/commands/core-run.test.ts +++ b/__tests__/unit/core/commands/core-run.test.ts @@ -34,7 +34,7 @@ describe("RunCommand", () => { executeCommand(Command); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 200); diff --git a/__tests__/unit/core/commands/core-start.test.ts b/__tests__/unit/core/commands/core-start.test.ts index 2262be844b..b6dc56cb42 100644 --- a/__tests__/unit/core/commands/core-start.test.ts +++ b/__tests__/unit/core/commands/core-start.test.ts @@ -30,7 +30,7 @@ describe("StartCommand", () => { expect(spyStart).toHaveBeenCalledWith( { - args: "core:run --token='ark' --network='testnet' --v=0 --env='production'", + args: "core:run --token='ark' --network='testnet' --v=0 --env='production' --skipPrompts=false", env: { CORE_ENV: "production", NODE_ENV: "production", diff --git a/__tests__/unit/core/commands/forger-run.test.ts b/__tests__/unit/core/commands/forger-run.test.ts index 6000d2a05d..dab41738ab 100644 --- a/__tests__/unit/core/commands/forger-run.test.ts +++ b/__tests__/unit/core/commands/forger-run.test.ts @@ -34,7 +34,7 @@ describe("RunCommand", () => { executeCommand(Command); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 200); diff --git a/__tests__/unit/core/commands/forger-start.test.ts b/__tests__/unit/core/commands/forger-start.test.ts index bae4f57c71..9db10cc2fb 100644 --- a/__tests__/unit/core/commands/forger-start.test.ts +++ b/__tests__/unit/core/commands/forger-start.test.ts @@ -30,7 +30,7 @@ describe("StartCommand", () => { expect(spyStart).toHaveBeenCalledWith( { - args: "forger:run --token='ark' --network='testnet' --v=0 --env='production'", + args: "forger:run --token='ark' --network='testnet' --v=0 --env='production' --skipPrompts=false", env: { CORE_ENV: "production", NODE_ENV: "production", diff --git a/__tests__/unit/core/commands/plugin-install.test.ts b/__tests__/unit/core/commands/plugin-install.test.ts index 5591118616..bb47e2434d 100644 --- a/__tests__/unit/core/commands/plugin-install.test.ts +++ b/__tests__/unit/core/commands/plugin-install.test.ts @@ -1,89 +1,38 @@ import "jest-extended"; -import { Console } from "@arkecosystem/core-test-framework"; +import { Console } from "@packages/core-test-framework"; import { Command } from "@packages/core/src/commands/plugin-install"; -import { setGracefulCleanup } from "tmp"; +import { Container } from "@packages/core-cli"; +let cli; +let spyOnInstall; const packageName = "dummyPackageName"; -const install = jest.fn(); -const exists = jest.fn().mockReturnValue(false); - -jest.mock("@packages/core/src/source-providers/npm", () => ({ - NPM: jest.fn().mockImplementation(() => ({ - exists, - install, - })), -})); - -jest.mock("@packages/core/src/source-providers/git", () => ({ - Git: jest.fn().mockImplementation(() => ({ - exists, - install, - })), -})); +const token = "ark"; +const network = "testnet"; -jest.mock("@packages/core/src/source-providers/file", () => ({ - File: jest.fn().mockImplementation(() => ({ - exists, - install, - })), -})); - -let cli; beforeEach(() => { process.argv = ["", "test"]; cli = new Console(); + const pluginManager = cli.app.get(Container.Identifiers.PluginManager); + spyOnInstall = jest.spyOn(pluginManager, "install").mockImplementation(async () => {}); }); afterEach(() => { jest.clearAllMocks(); - setGracefulCleanup(); }); describe("PluginInstallCommand", () => { it("should throw an error when package name is not provided", async () => { - const errorMessage = `"package" is required`; - await expect(cli.execute(Command)).rejects.toThrow(errorMessage); + await expect(cli.execute(Command)).rejects.toThrow(`"package" is required`); - expect(exists).not.toHaveBeenCalled(); - expect(install).not.toHaveBeenCalled(); + expect(spyOnInstall).not.toHaveBeenCalled(); }); - it("should throw an error when package doesn't exist", async () => { - const errorMessage = `The given package [${packageName}] is neither a git nor a npm package.`; - await expect(cli.withArgs([packageName]).execute(Command)).rejects.toThrow(errorMessage); - - expect(exists).toHaveBeenCalledWith(packageName, undefined); - expect(install).not.toHaveBeenCalled(); - }); - - it("should throw any errors while installing", async () => { - exists.mockReturnValue(true); - - jest.spyOn(cli.app, "getCorePath").mockImplementationOnce(() => { - throw Error("Fake Error"); - }); - - await expect(cli.withArgs([packageName]).execute(Command)).rejects.toThrow("Fake Error"); - }); - - it("should call install on existing packages", async () => { - exists.mockReturnValue(true); - - await expect(cli.withArgs([packageName]).execute(Command)).toResolve(); - - expect(exists).toHaveBeenCalledWith(packageName, undefined); - expect(install).toHaveBeenCalledWith(packageName, undefined); - }); - - it("should call install on existing packages with --version flag", async () => { - exists.mockReturnValue(true); - + it("should call install", async () => { const version = "3.0.0"; - await expect(cli.withArgs([packageName]).withFlags({ version }).execute(Command)).toResolve(); + await expect(cli.withArgs([packageName]).withFlags({ version, token, network }).execute(Command)).toResolve(); - expect(exists).toHaveBeenCalledWith(packageName, version); - expect(install).toHaveBeenCalledWith(packageName, version); + expect(spyOnInstall).toHaveBeenCalledWith(token, network, packageName, version); }); }); diff --git a/__tests__/unit/core/commands/plugin-remove.test.ts b/__tests__/unit/core/commands/plugin-remove.test.ts index 396cdbba71..080f43c1f0 100644 --- a/__tests__/unit/core/commands/plugin-remove.test.ts +++ b/__tests__/unit/core/commands/plugin-remove.test.ts @@ -2,37 +2,36 @@ import "jest-extended"; import { Console } from "@packages/core-test-framework"; import { Command } from "@packages/core/src/commands/plugin-remove"; -import fs from "fs-extra"; +import { Container } from "@arkecosystem/core-cli"; +let cli; +let spyOnRemove; const packageName = "dummyPackageName"; +const token = "ark"; +const network = "testnet"; -let cli; beforeEach(() => { cli = new Console(); + + const pluginManager = cli.app.get(Container.Identifiers.PluginManager); + spyOnRemove = jest.spyOn(pluginManager, "remove").mockImplementation(async () => {}); }); afterEach(() => { jest.clearAllMocks(); -}) +}); describe("PluginRemoveCommand", () => { it("should throw when package name is not provided", async () => { - jest.spyOn(cli.app, "getCorePath").mockReturnValueOnce(null); await expect(cli.execute(Command)).rejects.toThrow(`"package" is required`); - }); - it("should throw when the plugin doesn't exist", async () => { - jest.spyOn(cli.app, "getCorePath").mockReturnValueOnce(null); - await expect(cli.withArgs([packageName]).execute(Command)).rejects.toThrow( - `The package [${packageName}] does not exist.`, - ); + expect(spyOnRemove).not.toHaveBeenCalled(); }); - it("remove plugin if exist", async () => { - jest.spyOn(fs, "existsSync").mockReturnValue(true); - const removeSync = jest.spyOn(fs, "removeSync"); + it("should call remove", async () => { + jest.spyOn(cli.app, "getCorePath").mockReturnValueOnce(null); + await expect(cli.withArgs([packageName]).withFlags({ token, network }).execute(Command)).toResolve(); - await expect(cli.withArgs([packageName]).execute(Command)).toResolve(); - expect(removeSync).toHaveBeenCalled(); + expect(spyOnRemove).toHaveBeenCalledWith(token, network, packageName); }); }); diff --git a/__tests__/unit/core/commands/plugin-update.test.ts b/__tests__/unit/core/commands/plugin-update.test.ts index b7183467aa..dd8dd893eb 100644 --- a/__tests__/unit/core/commands/plugin-update.test.ts +++ b/__tests__/unit/core/commands/plugin-update.test.ts @@ -2,32 +2,19 @@ import "jest-extended"; import { Console } from "@packages/core-test-framework"; import { Command } from "@packages/core/src/commands/plugin-update"; -import fs from "fs-extra"; +import { Container } from "@arkecosystem/core-cli"; -let npmUpdateCalled = false; -let gitUpdateCalled = false; +let cli; +let spyOnUpdate; const packageName = "dummyPackageName"; -const updateNPM = () => (npmUpdateCalled = true); -const updateGIT = () => (gitUpdateCalled = true); - -jest.mock("@packages/core/src/source-providers/npm", () => ({ - NPM: jest.fn().mockImplementation(() => ({ - update: updateNPM, - })), -})); - -jest.mock("@packages/core/src/source-providers/git", () => ({ - Git: jest.fn().mockImplementation(() => ({ - update: updateGIT, - })), -})); +const token = "ark"; +const network = "testnet"; -let cli; beforeEach(() => { - gitUpdateCalled = false; - npmUpdateCalled = false; - cli = new Console(); + + const pluginManager = cli.app.get(Container.Identifiers.PluginManager); + spyOnUpdate = jest.spyOn(pluginManager, "update").mockImplementation(async () => {}); }); afterEach(() => { @@ -36,32 +23,14 @@ afterEach(() => { describe("PluginUpdateCommand", () => { it("should throw when package name is not provided", async () => { - jest.spyOn(cli.app, "getCorePath").mockReturnValueOnce(null); await expect(cli.execute(Command)).rejects.toThrow(`"package" is required`); - }); - - it("should throw when the plugin doesn't exist", async () => { - jest.spyOn(cli.app, "getCorePath").mockReturnValueOnce(__dirname); - await expect(cli.withArgs([packageName]).execute(Command)).rejects.toThrow( - `The package [${packageName}] does not exist.`, - ); - }); - it("if the plugin is a git directory, it should be updated", async () => { - expect(gitUpdateCalled).toEqual(false); - - jest.spyOn(fs, "existsSync").mockReturnValueOnce(true).mockReturnValueOnce(true); - - await expect(cli.withArgs([packageName]).execute(Command)).toResolve(); - expect(gitUpdateCalled).toEqual(true); + expect(spyOnUpdate).not.toHaveBeenCalled(); }); + it("should call update", async () => { + await expect(cli.withArgs([packageName]).withFlags({ token, network }).execute(Command)).toResolve(); - it("if the plugin is a NPM package, it should be updated on default path", async () => { - expect(npmUpdateCalled).toEqual(false); - jest.spyOn(fs, "existsSync").mockReturnValueOnce(true).mockReturnValueOnce(false); - - await expect(cli.withArgs([packageName]).execute(Command)).toResolve(); - expect(npmUpdateCalled).toEqual(true); + expect(spyOnUpdate).toHaveBeenCalledWith(token, network, packageName); }); }); diff --git a/__tests__/unit/core/commands/pool-clear.test.ts b/__tests__/unit/core/commands/pool-clear.test.ts index c75de86b1b..28aa8911d9 100644 --- a/__tests__/unit/core/commands/pool-clear.test.ts +++ b/__tests__/unit/core/commands/pool-clear.test.ts @@ -19,7 +19,7 @@ describe("PoolClearCommand", () => { prompts.inject([true]); jest.spyOn(cli.app, "getCorePath").mockResolvedValueOnce(null); await expect(cli.execute(Command)).toResolve(); - expect(removeSync).toHaveBeenCalled(); + expect(removeSync).toHaveBeenCalledTimes(3); }); it("should throw any errors", async () => { @@ -48,6 +48,6 @@ describe("PoolClearCommand", () => { prompts.inject([true]); jest.spyOn(cli.app, "getCorePath").mockResolvedValueOnce(null); await expect(cli.withFlags({ false: true }).execute(Command)).toResolve(); - expect(removeSync).toHaveBeenCalled(); + expect(removeSync).toHaveBeenCalledTimes(3); }); }); diff --git a/__tests__/unit/core/commands/reinstall.test.ts b/__tests__/unit/core/commands/reinstall.test.ts index b44100b776..1ac4ccb783 100644 --- a/__tests__/unit/core/commands/reinstall.test.ts +++ b/__tests__/unit/core/commands/reinstall.test.ts @@ -25,7 +25,7 @@ describe("ReinstallCommand", () => { await cli.withFlags({ force: true }).execute(Command); // yarn info peerDependencies > yarn global add > pm2 update > check core > check relay > check forger - expect(sync).toHaveBeenCalledTimes(6); + expect(sync).toHaveBeenCalledTimes(7); sync.mockReset(); }); @@ -42,7 +42,7 @@ describe("ReinstallCommand", () => { await cli.execute(Command); // yarn info peerDependencies > yarn global add > pm2 update > check core > check relay > check forger - expect(sync).toHaveBeenCalledTimes(6); + expect(sync).toHaveBeenCalledTimes(7); sync.mockReset(); }); diff --git a/__tests__/unit/core/commands/relay-run.test.ts b/__tests__/unit/core/commands/relay-run.test.ts index 56386674b2..2f0c1f6a40 100644 --- a/__tests__/unit/core/commands/relay-run.test.ts +++ b/__tests__/unit/core/commands/relay-run.test.ts @@ -25,7 +25,7 @@ describe("RunCommand", () => { executeCommand(Command); - await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(() => { resolve(); }, 50); diff --git a/__tests__/unit/core/commands/snapshot-dump.test.ts b/__tests__/unit/core/commands/snapshot-dump.test.ts index 7fba20ec0a..3ea681bca4 100644 --- a/__tests__/unit/core/commands/snapshot-dump.test.ts +++ b/__tests__/unit/core/commands/snapshot-dump.test.ts @@ -8,6 +8,15 @@ let mockSnapshotService; let mockEventListener; let spyOnTerminate; +jest.mock("@packages/core-cli", () => { + const original = jest.requireActual("@packages/core-cli"); + return { + __esModule: true, + ...original, + Utils: { ...original.Utils, buildApplication: jest.fn() }, + }; +}); + beforeEach(() => { cli = new Console(); diff --git a/__tests__/unit/core/commands/snapshot-restore.test.ts b/__tests__/unit/core/commands/snapshot-restore.test.ts index bc93a4c99a..e883fd1550 100644 --- a/__tests__/unit/core/commands/snapshot-restore.test.ts +++ b/__tests__/unit/core/commands/snapshot-restore.test.ts @@ -8,6 +8,15 @@ let mockSnapshotService; let mockEventListener; let spyOnTerminate; +jest.mock("@packages/core-cli", () => { + const original = jest.requireActual("@packages/core-cli"); + return { + __esModule: true, + ...original, + Utils: { ...original.Utils, buildApplication: jest.fn() }, + }; +}); + beforeEach(() => { cli = new Console(); diff --git a/__tests__/unit/core/commands/snapshot-rollback.test.ts b/__tests__/unit/core/commands/snapshot-rollback.test.ts index 62a9138ce1..bd40fa12cf 100644 --- a/__tests__/unit/core/commands/snapshot-rollback.test.ts +++ b/__tests__/unit/core/commands/snapshot-rollback.test.ts @@ -7,6 +7,15 @@ let cli; let mockSnapshotService; let spyOnTerminate; +jest.mock("@packages/core-cli", () => { + const original = jest.requireActual("@packages/core-cli"); + return { + __esModule: true, + ...original, + Utils: { ...original.Utils, buildApplication: jest.fn() }, + }; +}); + beforeEach(() => { cli = new Console(); diff --git a/__tests__/unit/core/commands/snapshot-truncate.test.ts b/__tests__/unit/core/commands/snapshot-truncate.test.ts index 84e384691d..a782077068 100644 --- a/__tests__/unit/core/commands/snapshot-truncate.test.ts +++ b/__tests__/unit/core/commands/snapshot-truncate.test.ts @@ -7,6 +7,15 @@ let cli; let mockSnapshotService; let spyOnTerminate; +jest.mock("@packages/core-cli", () => { + const original = jest.requireActual("@packages/core-cli"); + return { + __esModule: true, + ...original, + Utils: { ...original.Utils, buildApplication: jest.fn() }, + }; +}); + beforeEach(() => { cli = new Console(); diff --git a/__tests__/unit/core/commands/snapshot-verify.test.ts b/__tests__/unit/core/commands/snapshot-verify.test.ts index e8db1262cf..caa112d5df 100644 --- a/__tests__/unit/core/commands/snapshot-verify.test.ts +++ b/__tests__/unit/core/commands/snapshot-verify.test.ts @@ -8,6 +8,15 @@ let mockSnapshotService; let mockEventListener; let spyOnTerminate; +jest.mock("@packages/core-cli", () => { + const original = jest.requireActual("@packages/core-cli"); + return { + __esModule: true, + ...original, + Utils: { ...original.Utils, buildApplication: jest.fn() }, + }; +}); + beforeEach(() => { cli = new Console(); diff --git a/__tests__/unit/core/commands/update.test.ts b/__tests__/unit/core/commands/update.test.ts index 5081b89d11..354e3c7165 100644 --- a/__tests__/unit/core/commands/update.test.ts +++ b/__tests__/unit/core/commands/update.test.ts @@ -75,7 +75,7 @@ describe("UpdateCommand", () => { // yarn info peerDependencies // yarn global add // pm2 update - expect(sync).toHaveBeenCalledTimes(3); + expect(sync).toHaveBeenCalledTimes(4); }); it("should update and reset without a prompt if the [--force --reset] flag is present", async () => { @@ -100,7 +100,7 @@ describe("UpdateCommand", () => { // restart core // restart relay // restart forger - expect(sync).toHaveBeenCalledTimes(3); + expect(sync).toHaveBeenCalledTimes(4); }); it("should update with a prompt if the [--force] flag is not present", async () => { @@ -148,7 +148,7 @@ describe("UpdateCommand", () => { // restart core // restart relay // restart forger - expect(sync).toHaveBeenCalledTimes(6); + expect(sync).toHaveBeenCalledTimes(7); }); it("should update and restart the core process if the [--restartCore] flag is present", async () => { @@ -168,7 +168,7 @@ describe("UpdateCommand", () => { await cli.withFlags({ force: true, restartCore: true, updateProcessManager: true }).execute(Command); - expect(sync).toHaveBeenCalledTimes(3); + expect(sync).toHaveBeenCalledTimes(4); expect(isOnline).toHaveBeenCalled(); expect(restart).toHaveBeenCalledTimes(1); expect(restart).toHaveBeenCalledWith("ark-core"); @@ -191,7 +191,7 @@ describe("UpdateCommand", () => { await cli.withFlags({ force: true, restartRelay: true, updateProcessManager: true }).execute(Command); - expect(sync).toHaveBeenCalledTimes(3); + expect(sync).toHaveBeenCalledTimes(4); expect(isOnline).toHaveBeenCalled(); expect(restart).toHaveBeenCalledTimes(1); expect(restart).toHaveBeenCalledWith("ark-relay"); @@ -214,7 +214,7 @@ describe("UpdateCommand", () => { await cli.withFlags({ force: true, restartForger: true, updateProcessManager: true }).execute(Command); - expect(sync).toHaveBeenCalledTimes(3); + expect(sync).toHaveBeenCalledTimes(4); expect(isOnline).toHaveBeenCalled(); expect(restart).toHaveBeenCalledTimes(1); expect(restart).toHaveBeenCalledWith("ark-forger"); @@ -243,7 +243,7 @@ describe("UpdateCommand", () => { await cli.execute(Command); - expect(sync).toHaveBeenCalledTimes(2); + expect(sync).toHaveBeenCalledTimes(3); expect(isOnline).toHaveBeenCalled(); expect(restart).toHaveBeenCalledTimes(3); }); diff --git a/__tests__/unit/core/internal/crypto.test.ts b/__tests__/unit/core/internal/crypto.test.ts index e684f66d60..f90104cfdd 100644 --- a/__tests__/unit/core/internal/crypto.test.ts +++ b/__tests__/unit/core/internal/crypto.test.ts @@ -1,3 +1,4 @@ +import { Crypto } from "@packages/core/src/exceptions"; import { buildBIP38 } from "@packages/core/src/internal/crypto"; import { writeJSONSync } from "fs-extra"; import prompts from "prompts"; @@ -37,7 +38,7 @@ describe("buildBIP38", () => { it("should throw if the delegate configuration does not exist", async () => { await expect(buildBIP38({ token: "ark", network: "mainnet" })).rejects.toThrow( - `The ${process.env.CORE_PATH_CONFIG}/delegates.json file does not exist.`, + new Crypto.MissingConfigFile(process.env.CORE_PATH_CONFIG + "/delegates.json"), ); }); @@ -56,7 +57,7 @@ describe("buildBIP38", () => { writeJSONSync(`${process.env.CORE_PATH_CONFIG}/delegates.json`, { secrets: [] }); await expect(buildBIP38({ token: "ark", network: "mainnet" })).rejects.toThrow( - "We were unable to detect a BIP38 or BIP39 passphrase.", + new Crypto.PassphraseNotDetected(), ); }); @@ -64,7 +65,15 @@ describe("buildBIP38", () => { writeJSONSync(`${process.env.CORE_PATH_CONFIG}/delegates.json`, {}); await expect(buildBIP38({ token: "ark", network: "mainnet" })).rejects.toThrow( - "We were unable to detect a BIP38 or BIP39 passphrase.", + new Crypto.PassphraseNotDetected(), + ); + }); + + it("should throw if no bip38 password is provided and skipPrompts is true", async () => { + writeJSONSync(`${process.env.CORE_PATH_CONFIG}/delegates.json`, { bip38: "bip38" }); + + await expect(buildBIP38({ token: "ark", network: "mainnet", skipPrompts: true })).rejects.toThrow( + new Crypto.InvalidPassword(), ); }); @@ -73,9 +82,7 @@ describe("buildBIP38", () => { prompts.inject([null, true]); - await expect(buildBIP38({ token: "ark", network: "mainnet" })).rejects.toThrow( - "We've detected that you are using BIP38 but have not provided a valid password.", - ); + await expect(buildBIP38({ token: "ark", network: "mainnet" })).rejects.toThrow(new Crypto.InvalidPassword()); }); it("should throw if no confirmation is provided", async () => { diff --git a/__tests__/unit/crypto/blocks/block.test.ts b/__tests__/unit/crypto/blocks/block.test.ts index 933fe18a3c..01f65585f0 100644 --- a/__tests__/unit/crypto/blocks/block.test.ts +++ b/__tests__/unit/crypto/blocks/block.test.ts @@ -1,11 +1,10 @@ import "jest-extended"; -import { Interfaces, Managers, Utils } from "@arkecosystem/crypto"; import { BIP39 } from "@packages/core-forger/src/methods/bip39"; import { TransactionFactory } from "@packages/core-test-framework/src/utils/transaction-factory"; +import { Managers, Utils } from "@packages/crypto"; import { Block, BlockFactory, Deserializer, Serializer } from "@packages/crypto/src/blocks"; import { Slots } from "@packages/crypto/src/crypto"; -import { IBlock } from "@packages/crypto/src/interfaces"; import { configManager } from "@packages/crypto/src/managers"; import * as networks from "@packages/crypto/src/networks"; import { NetworkName } from "@packages/crypto/src/types"; @@ -17,7 +16,7 @@ const { outlookTable } = configManager.getPreset("mainnet").exceptions; beforeEach(() => configManager.setFromPreset("devnet")); -afterEach(() => jest.resetAllMocks()); +afterEach(() => jest.clearAllMocks()); describe("Block", () => { const data = { @@ -59,7 +58,7 @@ describe("Block", () => { expect(block.verification.verified).toBeTrue(); }); - it("should fail to verify the block ", () => { + it("should fail to verify the block", () => { const block = BlockFactory.fromData(data); expect(block.verification.verified).toBeFalse(); @@ -103,7 +102,7 @@ describe("Block", () => { .withPassphrase("super cool passphrase") .create(210); - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeFalse(); expect(block.verification.errors).toContain("Transactions length is too high"); @@ -126,7 +125,7 @@ describe("Block", () => { .withPassphrase("super cool passphrase") .create(); - const block: IBlock = delegate.forge([transactions[0], transactions[0]], optionsDefault); + const block = delegate.forge([transactions[0], transactions[0]], optionsDefault); expect(block.verification.verified).toBeFalse(); expect(block.verification.errors).toContain(`Encountered duplicate transaction: ${transactions[0].id}`); @@ -136,7 +135,7 @@ describe("Block", () => { jest.spyOn(configManager, "getMilestone").mockImplementation((height) => ({ block: { version: 0, - maxTransactions: 200, + maxTransactions: dummyBlock.numberOfTransactions, maxPayload: dummyBlockSize - 1, }, reward: 200000000, @@ -151,7 +150,7 @@ describe("Block", () => { jest.spyOn(configManager, "getMilestone").mockImplementation((height) => ({ block: { version: 0, - maxTransactions: 200, + maxTransactions: dummyBlock.numberOfTransactions, maxPayload: dummyBlockSize, }, reward: 200000000, @@ -186,7 +185,7 @@ describe("Block", () => { transactions[0].expiration = 102; - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeTrue(); }); @@ -209,7 +208,7 @@ describe("Block", () => { .withPassphrase("super cool passphrase") .create(); - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeFalse(); expect(block.verification.errors).toContain(`Encountered expired transaction: ${transactions[0].id}`); }); @@ -235,7 +234,7 @@ describe("Block", () => { .create(); Managers.configManager.getMilestone().aip11 = false; - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeFalse(); expect(block.verification.errors).toContain(`Encountered expired transaction: ${transactions[0].id}`); Managers.configManager.getMilestone().aip11 = true; @@ -266,7 +265,7 @@ describe("Block", () => { .create(); Managers.configManager.getMilestone().aip11 = false; - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeTrue(); Managers.configManager.getMilestone().aip11 = true; }); @@ -296,7 +295,7 @@ describe("Block", () => { .create(); Managers.configManager.getMilestone().aip11 = false; - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeFalse(); expect(block.verification.errors).toContain(`Encountered future transaction: ${transactions[0].id}`); Managers.configManager.getMilestone().aip11 = true; @@ -326,7 +325,7 @@ describe("Block", () => { .withPassphrase("super cool passphrase") .create(); - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeTrue(); expect(block.verification.errors).toBeEmpty(); }); @@ -354,7 +353,7 @@ describe("Block", () => { .withPassphrase("super cool passphrase") .create(); - const block: IBlock = delegate.forge(transactions, optionsDefault); + const block = delegate.forge(transactions, optionsDefault); expect(block.verification.verified).toBeFalse(); expect(block.verification.errors).toContain(`Encountered future transaction: ${transactions[0].id}`); }); @@ -715,7 +714,7 @@ describe("Block", () => { configManager.setFromPreset(network); configManager.getMilestone().aip11 = false; - const block: Interfaces.IBlock = BlockFactory.fromJson(networks[network].genesisBlock); + const block = BlockFactory.fromJson(networks[network].genesisBlock); expect(block.serialized).toHaveLength(length); expect(block.verifySignature()).toBeTrue(); diff --git a/__tests__/unit/crypto/transactions/builders/transactions/transfer.test.ts b/__tests__/unit/crypto/transactions/builders/transactions/transfer.test.ts index 46c6676586..ed486813f2 100644 --- a/__tests__/unit/crypto/transactions/builders/transactions/transfer.test.ts +++ b/__tests__/unit/crypto/transactions/builders/transactions/transfer.test.ts @@ -1,7 +1,7 @@ import "jest-extended"; -import { Utils } from "@arkecosystem/crypto"; -import { Factories, Generators } from "@packages/core-test-framework/src"; +import { Factories, Generators } from "@packages/core-test-framework"; +import { Utils } from "@packages/crypto"; import { TransactionType } from "@packages/crypto/src/enums"; import { Keys, WIF } from "@packages/crypto/src/identities"; import { configManager } from "@packages/crypto/src/managers"; diff --git a/__tests__/unit/crypto/transactions/deserializer.test.ts b/__tests__/unit/crypto/transactions/deserializer.test.ts index e0ba6d2243..95be666def 100644 --- a/__tests__/unit/crypto/transactions/deserializer.test.ts +++ b/__tests__/unit/crypto/transactions/deserializer.test.ts @@ -1,23 +1,23 @@ import "jest-extended"; import { Generators } from "@packages/core-test-framework/src"; -import ByteBuffer from "bytebuffer"; - -import { Enums, Errors, Utils } from "../../../../packages/crypto/src"; -import { Hash } from "../../../../packages/crypto/src/crypto"; +import { Enums, Errors, Utils } from "@packages/crypto/src"; +import { Hash } from "@packages/crypto/src/crypto"; import { InvalidTransactionBytesError, TransactionSchemaError, TransactionVersionError, UnkownTransactionError, -} from "../../../../packages/crypto/src/errors"; -import { Address, Keys, PublicKey } from "../../../../packages/crypto/src/identities"; -import { IKeyPair, ITransaction, ITransactionData } from "../../../../packages/crypto/src/interfaces"; -import { configManager } from "../../../../packages/crypto/src/managers"; -import { TransactionFactory, Utils as TransactionUtils, Verifier } from "../../../../packages/crypto/src/transactions"; -import { BuilderFactory } from "../../../../packages/crypto/src/transactions/builders"; -import { Deserializer } from "../../../../packages/crypto/src/transactions/deserializer"; -import { Serializer } from "../../../../packages/crypto/src/transactions/serializer"; +} from "@packages/crypto/src/errors"; +import { Address, Keys, PublicKey } from "@packages/crypto/src/identities"; +import { IKeyPair, ITransaction, ITransactionData } from "@packages/crypto/src/interfaces"; +import { configManager } from "@packages/crypto/src/managers"; +import { TransactionFactory, Utils as TransactionUtils, Verifier } from "@packages/crypto/src/transactions"; +import { BuilderFactory } from "@packages/crypto/src/transactions/builders"; +import { Deserializer } from "@packages/crypto/src/transactions/deserializer"; +import { Serializer } from "@packages/crypto/src/transactions/serializer"; +import ByteBuffer from "bytebuffer"; + import { htlcSecretHashHex, htlcSecretHex } from "./__fixtures__/htlc"; import { legacyMultiSignatureRegistration } from "./__fixtures__/transaction"; @@ -38,447 +38,488 @@ describe("Transaction serializer / deserializer", () => { expect(Verifier.verify(deserialized.data)).toBeTrue(); }; - describe("ser/deserialize - transfer", () => { - const transfer = BuilderFactory.transfer() - .recipientId("D5q7YfEFDky1JJVQQEy4MGyiUhr5cGg47F") - .amount("10000") - .fee("50000000") - .vendorField("cool vendor field") - .network(30) - .sign("dummy passphrase") - .getStruct(); - - it("should ser/deserialize giving back original fields", () => { - const serialized = TransactionFactory.fromData(transfer).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); - - checkCommonFields(deserialized, transfer); - - expect(deserialized.data.vendorField).toBe(transfer.vendorField); - expect(deserialized.data.recipientId).toBe(transfer.recipientId); + describe("Version 1", () => { + beforeEach(() => { + configManager.getMilestone().aip11 = false; }); - it("should ser/deserialize with long vendorfield when vendorFieldLength=255 milestone is active", () => { - configManager.getMilestone().vendorFieldLength = 255; - - const transferWithLongVendorfield = BuilderFactory.transfer() + describe("ser/deserialize - transfer", () => { + const transfer = BuilderFactory.transfer() .recipientId("D5q7YfEFDky1JJVQQEy4MGyiUhr5cGg47F") .amount("10000") .fee("50000000") - .vendorField("y".repeat(255)) + .timestamp(148354645) + .vendorField("cool vendor field") .network(30) .sign("dummy passphrase") .getStruct(); - const serialized = TransactionUtils.toBytes(transferWithLongVendorfield); - const deserialized = TransactionFactory.fromBytes(serialized); + it("should ser/deserialize giving back original fields", () => { + const serialized = TransactionFactory.fromData(transfer).serialized.toString("hex"); + expect(serialized).toEqual( + "ff011e0055b6d70802a47a2f594635737d2ce9898680812ff7fa6aaa64ddea1360474c110e9985a08780f0fa020000000011636f6f6c2076656e646f72206669656c641027000000000000000000001e07917aa042bf600339e13ed57c5364a71eebb8c33044022013287e3d1713e1a407068af0054412dc523476a8786823b8744d2ba8a3daa144022059f30896ad610aecb145275bd89de58ddaeb7c703d31fdab2a02efa3ea4ae1bd", + ); - expect(deserialized.verified).toBeTrue(); - expect(deserialized.data.vendorField).toHaveLength(255); - expect(deserialized.data.vendorField).toEqual("y".repeat(255)); + const deserialized = Deserializer.deserialize(serialized); - configManager.getMilestone().vendorFieldLength = 64; - }); + checkCommonFields(deserialized, transfer); - it("should not ser/deserialize long vendorfield when vendorFieldLength=255 milestone is not active", () => { - const transferWithLongVendorfield = BuilderFactory.transfer() - .recipientId("D5q7YfEFDky1JJVQQEy4MGyiUhr5cGg47F") - .amount("10000") - .fee("50000000") - .network(30) - .sign("dummy passphrase") - .getStruct(); + expect(deserialized.data.vendorField).toBe(transfer.vendorField); + expect(deserialized.data.recipientId).toBe(transfer.recipientId); + }); + + it("should ser/deserialize with long vendorfield when vendorFieldLength=255 milestone is active", () => { + configManager.getMilestone().vendorFieldLength = 255; + + const transferWithLongVendorfield = BuilderFactory.transfer() + .recipientId("D5q7YfEFDky1JJVQQEy4MGyiUhr5cGg47F") + .amount("10000") + .fee("50000000") + .timestamp(148354645) + .vendorField("y".repeat(255)) + .network(30) + .sign("dummy passphrase") + .getStruct(); - transferWithLongVendorfield.vendorField = "y".repeat(255); - expect(() => { const serialized = TransactionUtils.toBytes(transferWithLongVendorfield); - TransactionFactory.fromBytes(serialized); - }).toThrow(TransactionSchemaError); - }); - }); + expect(serialized.toString("hex")).toEqual( + "ff011e0055b6d70802a47a2f594635737d2ce9898680812ff7fa6aaa64ddea1360474c110e9985a08780f0fa0200000000ff7979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979791027000000000000000000001e07917aa042bf600339e13ed57c5364a71eebb8c330450221008c7278bf5a3a0f79afade499f3c2c574a54d936708e078408030e222fb4aaea102203559198c9b99a4fe679e40c48c8d25390e5bdf42ec2aafe6a2c85ab637e34748", + ); + const deserialized = TransactionFactory.fromBytes(serialized); - describe("ser/deserialize - second signature", () => { - it("should ser/deserialize giving back original fields", () => { - const secondSignature = BuilderFactory.secondSignature() - .signatureAsset("signature") - .fee("50000000") - .network(30) - .sign("dummy passphrase") - .getStruct(); + expect(deserialized.verified).toBeTrue(); + expect(deserialized.data.vendorField).toHaveLength(255); + expect(deserialized.data.vendorField).toEqual("y".repeat(255)); - const serialized = TransactionFactory.fromData(secondSignature).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + configManager.getMilestone().vendorFieldLength = 64; + }); - checkCommonFields(deserialized, secondSignature); + it("should not ser/deserialize long vendorfield when vendorFieldLength=255 milestone is not active", () => { + const transferWithLongVendorfield = BuilderFactory.transfer() + .recipientId("D5q7YfEFDky1JJVQQEy4MGyiUhr5cGg47F") + .amount("10000") + .fee("50000000") + .network(30) + .sign("dummy passphrase") + .getStruct(); - expect(deserialized.data.asset).toEqual(secondSignature.asset); + transferWithLongVendorfield.vendorField = "y".repeat(255); + expect(() => { + const serialized = TransactionUtils.toBytes(transferWithLongVendorfield); + TransactionFactory.fromBytes(serialized); + }).toThrow(TransactionSchemaError); + }); }); - }); - describe("ser/deserialize - delegate registration", () => { - it("should ser/deserialize giving back original fields", () => { - const delegateRegistration = BuilderFactory.delegateRegistration() - .usernameAsset("homer") - .network(30) - .sign("dummy passphrase") - .getStruct(); + describe("ser/deserialize - second signature", () => { + it("should ser/deserialize giving back original fields", () => { + const secondSignature = BuilderFactory.secondSignature() + .signatureAsset("signature") + .fee("50000000") + .timestamp(148354645) + .network(30) + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(delegateRegistration).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(secondSignature).serialized.toString("hex"); + expect(serialized).toEqual( + "ff011e0155b6d70802a47a2f594635737d2ce9898680812ff7fa6aaa64ddea1360474c110e9985a08780f0fa02000000000002314387e7f065bc95bb23197b39179f6fb8b9a23771e228a65326604f2c9860a13044022066b9d53702e38f2cf416fed043d30da6fa1adc140d144bfd563ba0be48f2de16022007c82133bc9c23a81390c4ed2237865a57c662bd536e5f1fcab2a3ae14f06287", + ); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, delegateRegistration); + checkCommonFields(deserialized, secondSignature); - expect(deserialized.data.asset).toEqual(delegateRegistration.asset); + expect(deserialized.data.asset).toEqual(secondSignature.asset); + }); }); - }); - describe("ser/deserialize - vote", () => { - it("should ser/deserialize giving back original fields", () => { - const vote = BuilderFactory.vote() - .votesAsset(["+02bcfa0951a92e7876db1fb71996a853b57f996972ed059a950d910f7d541706c9"]) - .fee("50000000") - .network(30) - .sign("dummy passphrase") - .getStruct(); + describe("ser/deserialize - delegate registration", () => { + it("should ser/deserialize giving back original fields", () => { + const delegateRegistration = BuilderFactory.delegateRegistration() + .usernameAsset("homer") + .timestamp(148354645) + .network(30) + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(vote).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(delegateRegistration).serialized.toString("hex"); + expect(serialized).toEqual( + "ff011e0255b6d70802a47a2f594635737d2ce9898680812ff7fa6aaa64ddea1360474c110e9985a08700f90295000000000005686f6d6572304402207752a833bd57722134a07796a44eb2a132e37a873e6fdb51c1bf217116f6293d02204ee141716b142e49e62488ee9c97458a38942177a7ef8f7737b702c896245655", + ); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, vote); + checkCommonFields(deserialized, delegateRegistration); - expect(deserialized.data.asset).toEqual(vote.asset); + expect(deserialized.data.asset).toEqual(delegateRegistration.asset); + }); }); - }); - describe("ser/deserialize - multi signature (LEGACY)", () => { - it.skip("should ser/deserialize a legacy multisig registration", () => { - const deserialized = TransactionFactory.fromHex(legacyMultiSignatureRegistration.serialized); + describe("ser/deserialize - vote", () => { + it("should ser/deserialize giving back original fields", () => { + const vote = BuilderFactory.vote() + .votesAsset(["+02bcfa0951a92e7876db1fb71996a853b57f996972ed059a950d910f7d541706c9"]) + .timestamp(148354645) + .fee("50000000") + .network(30) + .sign("dummy passphrase") + .getStruct(); - expect(deserialized.id).toEqual(legacyMultiSignatureRegistration.data.id); - expect(deserialized.toJson()).toMatchObject(legacyMultiSignatureRegistration.data); - }); - }); + const serialized = TransactionFactory.fromData(vote).serialized.toString("hex"); + expect(serialized).toEqual( + "ff011e0355b6d70802a47a2f594635737d2ce9898680812ff7fa6aaa64ddea1360474c110e9985a08780f0fa020000000000010102bcfa0951a92e7876db1fb71996a853b57f996972ed059a950d910f7d541706c93045022100b80680e9368e830663c10e52ab69b4adbbf4d55b9701a301cec5849640109fb102202c42de6a55792a16c8394d0981a852b0dea314b14378cdd3b4026e6b2e840074", + ); + const deserialized = Deserializer.deserialize(serialized); - describe("ser/deserialize - multi signature", () => { - let multiSignatureRegistration; + checkCommonFields(deserialized, vote); - beforeEach(() => { - // todo: completely wrap this into a function to hide the generation and setting of the config? - configManager.setConfig(Generators.generateCryptoConfigRaw()); + expect(deserialized.data.asset).toEqual(vote.asset); + }); + }); - const participant1 = Keys.fromPassphrase("secret 1"); - const participant2 = Keys.fromPassphrase("secret 2"); - const participant3 = Keys.fromPassphrase("secret 3"); + describe("ser/deserialize - multi signature (LEGACY)", () => { + it.skip("should ser/deserialize a legacy multisig registration", () => { + const deserialized = TransactionFactory.fromHex(legacyMultiSignatureRegistration.serialized); - multiSignatureRegistration = BuilderFactory.multiSignature() - .senderPublicKey(participant1.publicKey) - .network(23) - .participant(participant1.publicKey) - .participant(participant2.publicKey) - .participant(participant3.publicKey) - .min(3) - .multiSign("secret 1", 0) - .multiSign("secret 2", 1) - .multiSign("secret 3", 2) - .sign("secret 1") - .getStruct(); + expect(deserialized.id).toEqual(legacyMultiSignatureRegistration.data.id); + expect(deserialized.toJson()).toMatchObject(legacyMultiSignatureRegistration.data); + }); }); - it("should ser/deserialize a multisig registration", () => { - const transaction = TransactionFactory.fromData(multiSignatureRegistration); - const deserialized = TransactionFactory.fromBytes(transaction.serialized); + describe("ser/deserialize - multi signature", () => { + let multiSignatureRegistration; + + beforeEach(() => { + // todo: completely wrap this into a function to hide the generation and setting of the config? + configManager.setConfig(Generators.generateCryptoConfigRaw()); + + const participant1 = Keys.fromPassphrase("secret 1"); + const participant2 = Keys.fromPassphrase("secret 2"); + const participant3 = Keys.fromPassphrase("secret 3"); + + multiSignatureRegistration = BuilderFactory.multiSignature() + .senderPublicKey(participant1.publicKey) + .network(23) + .timestamp(148354645) + .participant(participant1.publicKey) + .participant(participant2.publicKey) + .participant(participant3.publicKey) + .min(3) + .multiSign("secret 1", 0) + .multiSign("secret 2", 1) + .multiSign("secret 3", 2) + .sign("secret 1") + .getStruct(); + }); - expect(transaction.isVerified).toBeTrue(); - expect(deserialized.isVerified).toBeTrue(); - expect(deserialized.data.asset).toEqual(multiSignatureRegistration.asset); - expect(transaction.data.signatures).toEqual(deserialized.data.signatures); - checkCommonFields(deserialized, multiSignatureRegistration); - }); + it("should ser/deserialize a multisig registration", () => { + const transaction = TransactionFactory.fromData(multiSignatureRegistration); + expect(transaction.serialized.toString("hex")).toEqual( + "ff02170100000004000000000000000000039180ea4a8a803ee11ecb462bb8f9613fcdb5fe917e292dbcc73409f0e98f8f220094357700000000000303039180ea4a8a803ee11ecb462bb8f9613fcdb5fe917e292dbcc73409f0e98f8f22028d3611c4f32feca3e6713992ae9387e18a0e01954046511878fe078703324dc0021d3932ab673230486d0f956d05b9e88791ee298d9af2d6df7d9ed5bb861c92dd5e3b61f2d6a2589b9abb4ed1dfd7253a1d2ac586d383a8a17237928d4648cd6d3ff1c8b025c7e150282f73ecd8a13f86254b508940ebb23d4f6f4f473b3a15de007dbeace4f00c9d5961a6bd65b4dbc6ea2b4c6278adc351e6da9eeba69478a7784e17754eff20a3ccd68cd48d87847d40768785852594e73cc6b01105064b6b5701d1c435978899abafd485f5e2dfe737781368efc1c4d02f4009a650849a434b923b2e6b79164181df493c9a05e2e6664c2ac0059d9194c792c1b1a85695b6215e0286b1d2b6abf7ca5090c66598e898aa08ba2de90dbd2ae9fe728b8b2d29504c6ad5a96ca1f0365e0390d0cf508550ded10a5e111db5bbf2b0f87972215ee69f9f", + ); + const deserialized = TransactionFactory.fromBytes(transaction.serialized); + + expect(transaction.isVerified).toBeTrue(); + expect(deserialized.isVerified).toBeTrue(); + expect(deserialized.data.asset).toEqual(multiSignatureRegistration.asset); + expect(transaction.data.signatures).toEqual(deserialized.data.signatures); + checkCommonFields(deserialized, multiSignatureRegistration); + }); - it("should fail to verify", () => { - const transaction = TransactionFactory.fromData(multiSignatureRegistration); - configManager.getMilestone().aip11 = false; - expect(transaction.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(transaction.verify()).toBeTrue(); - }); + it("should fail to verify", () => { + const transaction = TransactionFactory.fromData(multiSignatureRegistration); + configManager.getMilestone().aip11 = false; + expect(transaction.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(transaction.verify()).toBeTrue(); + }); - it("should not deserialize a malformed signature", () => { - const transaction = TransactionFactory.fromData(multiSignatureRegistration); - transaction.serialized = transaction.serialized.slice(0, transaction.serialized.length - 2); + it("should not deserialize a malformed signature", () => { + const transaction = TransactionFactory.fromData(multiSignatureRegistration); + transaction.serialized = transaction.serialized.slice(0, transaction.serialized.length - 2); - expect(() => TransactionFactory.fromBytes(transaction.serialized)).toThrowError( - InvalidTransactionBytesError, - ); + expect(() => TransactionFactory.fromBytes(transaction.serialized)).toThrowError( + InvalidTransactionBytesError, + ); + }); }); }); - describe("ser/deserialize - ipfs", () => { - let ipfsTransaction; + describe("Version 2", () => { + beforeEach(() => { + configManager.getMilestone().aip11 = true; + }); - const ipfsIds = [ - "QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w", - "QmYSK2JyM3RyDyB52caZCTKFR3HKniEcMnNJYdk8DQ6KKB", - "QmQeUqdjFmaxuJewStqCLUoKrR9khqb4Edw9TfRQQdfWz3", - "Qma98bk1hjiRZDTmYmfiUXDj8hXXt7uGA5roU5mfUb3sVG", - ]; + describe("ser/deserialize - ipfs", () => { + let ipfsTransaction; - beforeAll(() => { - // todo: completely wrap this into a function to hide the generation and setting of the config? - configManager.setConfig(Generators.generateCryptoConfigRaw()); - }); + const ipfsIds = [ + "QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w", + "QmYSK2JyM3RyDyB52caZCTKFR3HKniEcMnNJYdk8DQ6KKB", + "QmQeUqdjFmaxuJewStqCLUoKrR9khqb4Edw9TfRQQdfWz3", + "Qma98bk1hjiRZDTmYmfiUXDj8hXXt7uGA5roU5mfUb3sVG", + ]; - beforeEach(() => { - ipfsTransaction = BuilderFactory.ipfs() - .fee("50000000") - .version(2) - .network(23) - .ipfsAsset(ipfsIds[0]) - .sign("dummy passphrase") - .getStruct(); - }); + beforeAll(() => { + // todo: completely wrap this into a function to hide the generation and setting of the config? + configManager.setConfig(Generators.generateCryptoConfigRaw()); + }); - it("should ser/deserialize giving back original fields", () => { - const serialized = TransactionFactory.fromData(ipfsTransaction).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + beforeEach(() => { + ipfsTransaction = BuilderFactory.ipfs() + .fee("50000000") + .version(2) + .network(23) + .timestamp(148354645) + .ipfsAsset(ipfsIds[0]) + .sign("dummy passphrase") + .getStruct(); + }); - checkCommonFields(deserialized, ipfsTransaction); + it("should ser/deserialize giving back original fields", () => { + const serialized = TransactionFactory.fromData(ipfsTransaction).serialized.toString("hex"); + expect(serialized).toEqual( + "ff0217010000000500000000000000000002a47a2f594635737d2ce9898680812ff7fa6aaa64ddea1360474c110e9985a08780f0fa02000000000012202853f0f11ab91d73b73a2a86606103f45dd469ad2e89ec6f9a25febe8758d3fed28df5c7334e86d67074330c8e4418c47ca82a6aff823431c9690213b6983dd82569730fb267ad96750a5249b7f751d2beb3b0958ed48b0517223531d80eaf89", + ); + const deserialized = Deserializer.deserialize(serialized); - expect(deserialized.data.asset).toEqual(ipfsTransaction.asset); - }); + checkCommonFields(deserialized, ipfsTransaction); - it("should fail to verify", () => { - const transaction = TransactionFactory.fromData(ipfsTransaction); - configManager.getMilestone().aip11 = false; - expect(transaction.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(transaction.verify()).toBeTrue(); + expect(deserialized.data.asset).toEqual(ipfsTransaction.asset); + }); + + it("should fail to verify", () => { + const transaction = TransactionFactory.fromData(ipfsTransaction); + configManager.getMilestone().aip11 = false; + expect(transaction.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(transaction.verify()).toBeTrue(); + }); }); - }); - describe("ser/deserialize - delegate resignation", () => { - it("should ser/deserialize giving back original fields", () => { - const delegateResignation = BuilderFactory.delegateResignation() - .fee("50000000") - .network(23) - .sign("dummy passphrase") - .getStruct(); + describe("ser/deserialize - delegate resignation", () => { + it("should ser/deserialize giving back original fields", () => { + const delegateResignation = BuilderFactory.delegateResignation() + .fee("50000000") + .network(23) + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(delegateResignation).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(delegateResignation).serialized.toString("hex"); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, delegateResignation); - }); + checkCommonFields(deserialized, delegateResignation); + }); - it("should fail to verify", () => { - const delegateResignation = BuilderFactory.delegateResignation() - .fee("50000000") - .network(23) - .sign("dummy passphrase") - .build(); + it("should fail to verify", () => { + const delegateResignation = BuilderFactory.delegateResignation() + .fee("50000000") + .network(23) + .sign("dummy passphrase") + .build(); - configManager.getMilestone().aip11 = false; - expect(delegateResignation.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(delegateResignation.verify()).toBeTrue(); + configManager.getMilestone().aip11 = false; + expect(delegateResignation.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(delegateResignation.verify()).toBeTrue(); + }); }); - }); - describe("ser/deserialize - multi payment", () => { - beforeAll(() => { - // todo: completely wrap this into a function to hide the generation and setting of the config? - configManager.setConfig(Generators.generateCryptoConfigRaw()); - }); + describe("ser/deserialize - multi payment", () => { + beforeAll(() => { + // todo: completely wrap this into a function to hide the generation and setting of the config? + configManager.setConfig(Generators.generateCryptoConfigRaw()); + }); - it("should ser/deserialize giving back original fields", () => { - const multiPayment = BuilderFactory.multiPayment() - .fee("50000000") - .network(23) - .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "1555") - .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "5000") - .vendorField("Multipayment") - .sign("dummy passphrase") - .getStruct(); + it("should ser/deserialize giving back original fields", () => { + const multiPayment = BuilderFactory.multiPayment() + .fee("50000000") + .network(23) + .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "1555") + .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "5000") + .vendorField("Multipayment") + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(multiPayment).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(multiPayment).serialized.toString("hex"); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, multiPayment); - }); + checkCommonFields(deserialized, multiPayment); + }); - it("should fail to verify", () => { - const multiPayment = BuilderFactory.multiPayment() - .fee("50000000") - .network(23) - .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "1555") - .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "5000") - .sign("dummy passphrase") - .build(); + it("should fail to verify", () => { + const multiPayment = BuilderFactory.multiPayment() + .fee("50000000") + .network(23) + .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "1555") + .addPayment("AW5wtiimZntaNvxH6QBi7bBpH2rDtFeD8C", "5000") + .sign("dummy passphrase") + .build(); - configManager.getMilestone().aip11 = false; - expect(multiPayment.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(multiPayment.verify()).toBeTrue(); - }); + configManager.getMilestone().aip11 = false; + expect(multiPayment.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(multiPayment.verify()).toBeTrue(); + }); - it("should fail if more than hardcoded maximum of payments", () => { - const multiPayment = BuilderFactory.multiPayment().fee("50000000").network(23); + it("should fail if more than hardcoded maximum of payments", () => { + const multiPayment = BuilderFactory.multiPayment().fee("50000000").network(23); - for (let i = 0; i < configManager.getMilestone().multiPaymentLimit; i++) { - multiPayment.addPayment(Address.fromPassphrase(`recipient-${i}`), "1"); - } + for (let i = 0; i < configManager.getMilestone().multiPaymentLimit; i++) { + multiPayment.addPayment(Address.fromPassphrase(`recipient-${i}`), "1"); + } - expect(() => multiPayment.addPayment(Address.fromPassphrase("recipientBad"), "1")).toThrow( - Errors.MaximumPaymentCountExceededError, - ); + expect(() => multiPayment.addPayment(Address.fromPassphrase("recipientBad"), "1")).toThrow( + Errors.MaximumPaymentCountExceededError, + ); - const transaction = multiPayment.sign("dummy passphrase").build(); - expect(transaction.verify()).toBeTrue(); - expect(TransactionFactory.fromBytes(transaction.serialized, true).verify()).toBeTrue(); - }); + const transaction = multiPayment.sign("dummy passphrase").build(); + expect(transaction.verify()).toBeTrue(); + expect(TransactionFactory.fromBytes(transaction.serialized, true).verify()).toBeTrue(); + }); - it("should fail if recipient on different network", () => { - expect(() => - BuilderFactory.multiPayment() - .fee("50000000") - .addPayment("DBzGiUk8UVjB2dKCfGRixknB7Ki3Zhqthp", "1555") - .addPayment("AJWRd23HNEhPLkK1ymMnwnDBX2a7QBZqff", "1555") - .sign("dummy passphrase") - .build(), - ).toThrow(InvalidTransactionBytesError); + it("should fail if recipient on different network", () => { + expect(() => + BuilderFactory.multiPayment() + .fee("50000000") + .addPayment("DBzGiUk8UVjB2dKCfGRixknB7Ki3Zhqthp", "1555") + .addPayment("AJWRd23HNEhPLkK1ymMnwnDBX2a7QBZqff", "1555") + .sign("dummy passphrase") + .build(), + ).toThrow(InvalidTransactionBytesError); + }); }); - }); - describe("ser/deserialize - htlc lock", () => { - const htlcLockAsset = { - secretHash: htlcSecretHashHex, - expiration: { - type: Enums.HtlcLockExpirationType.EpochTimestamp, - value: Math.floor(Date.now() / 1000), - }, - }; + describe("ser/deserialize - htlc lock", () => { + const htlcLockAsset = { + secretHash: htlcSecretHashHex, + expiration: { + type: Enums.HtlcLockExpirationType.EpochTimestamp, + value: Math.floor(Date.now() / 1000), + }, + }; - beforeAll(() => { - // todo: completely wrap this into a function to hide the generation and setting of the config? - configManager.setConfig(Generators.generateCryptoConfigRaw()); - }); + beforeAll(() => { + // todo: completely wrap this into a function to hide the generation and setting of the config? + configManager.setConfig(Generators.generateCryptoConfigRaw()); + }); - it("should ser/deserialize giving back original fields", () => { - const htlcLock = BuilderFactory.htlcLock() - .recipientId("AJWRd23HNEhPLkK1ymMnwnDBX2a7QBZqff") - .amount("10000") - .fee("50000000") - .network(23) - .vendorField("HTLC") - .htlcLockAsset(htlcLockAsset) - .sign("dummy passphrase") - .getStruct(); + it("should ser/deserialize giving back original fields", () => { + const htlcLock = BuilderFactory.htlcLock() + .recipientId("AJWRd23HNEhPLkK1ymMnwnDBX2a7QBZqff") + .amount("10000") + .fee("50000000") + .network(23) + .vendorField("HTLC") + .htlcLockAsset(htlcLockAsset) + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(htlcLock).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(htlcLock).serialized.toString("hex"); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, htlcLock); + checkCommonFields(deserialized, htlcLock); - expect(deserialized.data.asset).toEqual(htlcLock.asset); - }); + expect(deserialized.data.asset).toEqual(htlcLock.asset); + }); - it("should fail to verify", () => { - const htlcLock = BuilderFactory.htlcLock() - .recipientId("AJWRd23HNEhPLkK1ymMnwnDBX2a7QBZqff") - .amount("10000") - .fee("50000000") - .network(23) - .htlcLockAsset(htlcLockAsset) - .sign("dummy passphrase") - .build(); + it("should fail to verify", () => { + const htlcLock = BuilderFactory.htlcLock() + .recipientId("AJWRd23HNEhPLkK1ymMnwnDBX2a7QBZqff") + .amount("10000") + .fee("50000000") + .network(23) + .htlcLockAsset(htlcLockAsset) + .sign("dummy passphrase") + .build(); - configManager.getMilestone().aip11 = false; - expect(htlcLock.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(htlcLock.verify()).toBeTrue(); + configManager.getMilestone().aip11 = false; + expect(htlcLock.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(htlcLock.verify()).toBeTrue(); + }); }); - }); - describe("ser/deserialize - htlc claim", () => { - const htlcClaimAsset = { - lockTransactionId: "943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4", - unlockSecret: htlcSecretHex, - }; + describe("ser/deserialize - htlc claim", () => { + const htlcClaimAsset = { + lockTransactionId: "943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4", + unlockSecret: htlcSecretHex, + }; - beforeAll(() => { - // todo: completely wrap this into a function to hide the generation and setting of the config? - configManager.setConfig(Generators.generateCryptoConfigRaw()); - }); + beforeAll(() => { + // todo: completely wrap this into a function to hide the generation and setting of the config? + configManager.setConfig(Generators.generateCryptoConfigRaw()); + }); - it("should ser/deserialize giving back original fields", () => { - const htlcClaim = BuilderFactory.htlcClaim() - .fee("0") - .network(23) - .htlcClaimAsset(htlcClaimAsset) - .sign("dummy passphrase") - .getStruct(); + it("should ser/deserialize giving back original fields", () => { + const htlcClaim = BuilderFactory.htlcClaim() + .fee("0") + .network(23) + .htlcClaimAsset(htlcClaimAsset) + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(htlcClaim).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(htlcClaim).serialized.toString("hex"); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, htlcClaim); + checkCommonFields(deserialized, htlcClaim); - expect(deserialized.data.asset).toEqual(htlcClaim.asset); - }); + expect(deserialized.data.asset).toEqual(htlcClaim.asset); + }); - it("should fail to verify", () => { - const htlcClaim = BuilderFactory.htlcClaim() - .fee("0") - .network(23) - .htlcClaimAsset(htlcClaimAsset) - .sign("dummy passphrase") - .build(); + it("should fail to verify", () => { + const htlcClaim = BuilderFactory.htlcClaim() + .fee("0") + .network(23) + .htlcClaimAsset(htlcClaimAsset) + .sign("dummy passphrase") + .build(); - configManager.getMilestone().aip11 = false; - expect(htlcClaim.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(htlcClaim.verify()).toBeTrue(); + configManager.getMilestone().aip11 = false; + expect(htlcClaim.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(htlcClaim.verify()).toBeTrue(); + }); }); - }); - describe("ser/deserialize - htlc refund", () => { - const htlcRefundAsset = { - lockTransactionId: "943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4", - }; + describe("ser/deserialize - htlc refund", () => { + const htlcRefundAsset = { + lockTransactionId: "943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4", + }; - beforeAll(() => { - // todo: completely wrap this into a function to hide the generation and setting of the config? - configManager.setConfig(Generators.generateCryptoConfigRaw()); - }); + beforeAll(() => { + // todo: completely wrap this into a function to hide the generation and setting of the config? + configManager.setConfig(Generators.generateCryptoConfigRaw()); + }); - it("should ser/deserialize giving back original fields", () => { - const htlcRefund = BuilderFactory.htlcRefund() - .fee("0") - .network(23) - .htlcRefundAsset(htlcRefundAsset) - .sign("dummy passphrase") - .getStruct(); + it("should ser/deserialize giving back original fields", () => { + const htlcRefund = BuilderFactory.htlcRefund() + .fee("0") + .network(23) + .htlcRefundAsset(htlcRefundAsset) + .sign("dummy passphrase") + .getStruct(); - const serialized = TransactionFactory.fromData(htlcRefund).serialized.toString("hex"); - const deserialized = Deserializer.deserialize(serialized); + const serialized = TransactionFactory.fromData(htlcRefund).serialized.toString("hex"); + const deserialized = Deserializer.deserialize(serialized); - checkCommonFields(deserialized, htlcRefund); + checkCommonFields(deserialized, htlcRefund); - expect(deserialized.data.asset).toEqual(htlcRefund.asset); - }); + expect(deserialized.data.asset).toEqual(htlcRefund.asset); + }); - it("should fail to verify", () => { - const htlcRefund = BuilderFactory.htlcRefund() - .fee("0") - .network(23) - .htlcRefundAsset(htlcRefundAsset) - .sign("dummy passphrase") - .build(); + it("should fail to verify", () => { + const htlcRefund = BuilderFactory.htlcRefund() + .fee("0") + .network(23) + .htlcRefundAsset(htlcRefundAsset) + .sign("dummy passphrase") + .build(); - configManager.getMilestone().aip11 = false; - expect(htlcRefund.verify()).toBeFalse(); - configManager.getMilestone().aip11 = true; - expect(htlcRefund.verify()).toBeTrue(); + configManager.getMilestone().aip11 = false; + expect(htlcRefund.verify()).toBeFalse(); + configManager.getMilestone().aip11 = true; + expect(htlcRefund.verify()).toBeTrue(); + }); }); }); @@ -497,7 +538,7 @@ describe("Transaction serializer / deserializer", () => { buffer.writeByte(transaction.network); buffer.writeUint32(Enums.TransactionTypeGroup.Core); buffer.writeUint16(transaction.type); - buffer.writeUint64(transaction.nonce.toFixed()); + buffer.writeUint64(transaction.nonce!.toFixed()); buffer.append(transaction.senderPublicKey, "hex"); buffer.writeUint64(Utils.BigNumber.make(transaction.fee).toFixed()); buffer.writeByte(0x00); @@ -520,6 +561,10 @@ describe("Transaction serializer / deserializer", () => { }); describe("deserialize Schnorr / ECDSA", () => { + beforeEach(() => { + configManager.getMilestone().aip11 = true; + }); + const builderWith = ( hasher: (buffer: Buffer, keys: IKeyPair) => string, hasher2?: (buffer: Buffer, keys: IKeyPair) => string, @@ -557,7 +602,7 @@ describe("Transaction serializer / deserializer", () => { let transaction: ITransaction; expect(builder.data.version).toBe(2); expect(() => (transaction = builder.build())).not.toThrow(); - expect(transaction.verify()).toBeTrue(); + expect(transaction!.verify()).toBeTrue(); }); it("should deserialize a V2 transaction signed with ECDSA", () => { @@ -567,7 +612,7 @@ describe("Transaction serializer / deserializer", () => { expect(builder.data.version).toBe(2); expect(builder.data.signature).not.toHaveLength(64); expect(() => (transaction = builder.build())).not.toThrow(); - expect(transaction.verify()).toBeTrue(); + expect(transaction!.verify()).toBeTrue(); }); it("should deserialize a V2 transaction when signed with Schnorr/Schnorr", () => { @@ -577,9 +622,9 @@ describe("Transaction serializer / deserializer", () => { expect(builder.data.version).toBe(2); expect(() => (transaction = builder.build())).not.toThrow(); - expect(transaction.verify()).toBeTrue(); - expect(Verifier.verifySecondSignature(transaction.data, PublicKey.fromPassphrase("secret 2"))).toBeTrue(); - expect(Verifier.verifySecondSignature(transaction.data, PublicKey.fromPassphrase("secret 3"))).toBeFalse(); + expect(transaction!.verify()).toBeTrue(); + expect(Verifier.verifySecondSignature(transaction!.data, PublicKey.fromPassphrase("secret 2"))).toBeTrue(); + expect(Verifier.verifySecondSignature(transaction!.data, PublicKey.fromPassphrase("secret 3"))).toBeFalse(); }); it("should throw when V2 transaction is signed with Schnorr and ECDSA", () => { @@ -692,7 +737,7 @@ describe("Transaction serializer / deserializer", () => { // signature: '618a54975212ead93df8c881655c625544bce8ed7ccdfe6f08a42eecfb1adebd051307be5014bb051617baf7815d50f62129e70918190361e5d4dd4796541b0a', // secondSignature: '618a54975212ead93df8c881655c625544bce8ed7ccdfe6f08a42eecfb1adebd051307be5014bb051617baf7815d50f62129e70918190361e5d4dd4796541b0a' // } - + // // bytes = crypto.getBytes(transaction) // expect(bytes).toBeObject() // expect(bytes.toString('hex') + transaction.signature + transaction.secondSignature).toHaveLength(420) diff --git a/__tests__/unit/crypto/transactions/factory.test.ts b/__tests__/unit/crypto/transactions/factory.test.ts index 6dbe39f2a7..41e455328e 100644 --- a/__tests__/unit/crypto/transactions/factory.test.ts +++ b/__tests__/unit/crypto/transactions/factory.test.ts @@ -1,20 +1,20 @@ import "jest-extended"; -import { Interfaces, Utils } from "@arkecosystem/crypto"; - +import { Interfaces, Utils } from "@packages/crypto"; import { InvalidTransactionBytesError, TransactionSchemaError, UnkownTransactionError, -} from "../../../../packages/crypto/src/errors"; -import { ITransactionData } from "../../../../packages/crypto/src/interfaces"; -import { configManager } from "../../../../packages/crypto/src/managers"; +} from "@packages/crypto/src/errors"; +import { ITransactionData } from "@packages/crypto/src/interfaces"; +import { configManager } from "@packages/crypto/src/managers"; import { Serializer, Transaction, TransactionFactory, Utils as TransactionUtils, -} from "../../../../packages/crypto/src/transactions"; +} from "@packages/crypto/src/transactions"; + import { transaction as transactionFixture } from "../fixtures/transaction"; import { transaction as transactionDataFixture } from "../fixtures/transaction"; import { createRandomTx } from "./__support__"; @@ -36,7 +36,7 @@ beforeEach(() => { }; }); -const transaction: Interfaces.ITransaction = TransactionFactory.fromData(transactionFixture); +const transaction = TransactionFactory.fromData(transactionFixture); const transactionJson: Interfaces.ITransactionJson = transaction.toJson(); const transactionSerialized: Buffer = Serializer.serialize(transaction); diff --git a/__tests__/unit/crypto/transactions/serde.test.ts b/__tests__/unit/crypto/transactions/serde.test.ts new file mode 100644 index 0000000000..303f3338fe --- /dev/null +++ b/__tests__/unit/crypto/transactions/serde.test.ts @@ -0,0 +1,282 @@ +import { Address, PublicKey } from "@packages/crypto/src/identities"; +import { Keys } from "@packages/crypto/src/identities"; +import { ITransaction } from "@packages/crypto/src/interfaces"; +import { configManager } from "@packages/crypto/src/managers"; +import { + Deserializer, + InternalTransactionType, + Serializer, + Signer, + Transaction, + TransactionTypeFactory, +} from "@packages/crypto/src/transactions"; +import { BigNumber, ByteBuffer } from "@packages/crypto/src/utils"; + +configManager.getMilestone().aip11 = true; + +class TestTransaction extends Transaction { + public hasVendorField(): boolean { + return true; + } + + public serialize(): ByteBuffer { + const { data } = this; + const buffer: ByteBuffer = new ByteBuffer(Buffer.alloc(33)); + buffer.writeBigUInt64LE(data.amount.toBigInt()); + buffer.writeUInt32LE(data.expiration || 0); + + if (data.recipientId) { + const { addressBuffer } = Address.toBuffer(data.recipientId); + + buffer.writeBuffer(addressBuffer); + } + + return buffer; + } + + public deserialize(buf: ByteBuffer): void { + const { data } = this; + data.amount = BigNumber.make(buf.readBigInt64LE().toString()); + data.expiration = buf.readUInt32LE(); + data.recipientId = Address.fromBuffer(buf.readBuffer(21)); + } +} + +type TransactionConstructorMap = Map; + +const registerTransactionTypes = (transaction: typeof Transaction) => { + const testInternalTransactionType = InternalTransactionType.from(1, 3); + + const transactionConstructors: TransactionConstructorMap = new Map(); + transactionConstructors.set(1, transaction); + + const transactionTypes: Map = new Map(); + transactionTypes.set(testInternalTransactionType, transactionConstructors); + + TransactionTypeFactory.initialize(transactionTypes); +}; + +// @ts-ignore +const checkCommonFields = (deserialized: ITransaction, expected) => { + // const fieldsToCheck = ["version", "network", "type", "senderPublicKey", "fee", "amount"]; + const fieldsToCheck = ["version", "type", "senderPublicKey", "recipientId", "fee"]; + if (deserialized.data.version === 1) { + fieldsToCheck.push("timestamp"); + } else { + fieldsToCheck.push("typeGroup"); + fieldsToCheck.push("nonce"); + } + + for (const field of fieldsToCheck) { + expect(deserialized.data[field].toString()).toEqual(expected[field].toString()); + } +}; + +const checkV2Fields = (deserialized: ITransaction, expected) => { + const fieldsToCheck = ["version", "type", "senderPublicKey", "recipientId", "fee", "typeGroup", "nonce", "amount"]; + + for (const field of fieldsToCheck) { + expect(deserialized.data[field].toString()).toEqual(expected[field].toString()); + } +}; + +describe("Transaction serializer / deserializer", () => { + describe("signatures", () => { + it("should ser/deser single sing", () => { + registerTransactionTypes(TestTransaction); + + const transaction = new TestTransaction(); + transaction.data = { + amount: new BigNumber(100), + fee: new BigNumber(200), + nonce: new BigNumber(1), + senderPublicKey: PublicKey.fromPassphrase("sender passphrase"), + recipientId: Address.fromPassphrase("recipient passphrase"), + timestamp: 0, + type: 1, + expiration: 0, + typeGroup: 3, + version: 2, + }; + + Signer.sign(transaction.data, Keys.fromPassphrase("sender passphrase")); + + const serialized = Serializer.serialize(transaction); + expect(serialized.toString("hex")).toEqual( + "ff" + // Header + "02" + // Version + "1e" + // Network + "03000000" + // Typegroup + "0100" + // Type + "0100000000000000" + // Nonce + "0316a0b23be3408a4af227280bb005e9a136e0dbdd86860516850e5c29c1829113" + // senderPublicKey + "c800000000000000" + // Fee + "00" + // VendorField lenght + "6400000000000000" + // Amount + "00000000" + // Expiration + "1e66314f1ccb9741d6f1a6f9b26ed563c439fc1a94" + // RecipientId + "fa17823c3e591586626426b494c8038d0eb10a67bcf06f2e6959a76b40898124c13e68a6ad36fd131affdeac64fc8c2b85c371b194ffc6e3ba868070fe677df2", // Signature + ); + + const deserialized = Deserializer.deserialize(serialized); + checkV2Fields(deserialized, transaction.data); + }); + + it("should ser/deser second sign", () => { + registerTransactionTypes(TestTransaction); + + const transaction = new TestTransaction(); + transaction.data = { + amount: new BigNumber(100), + fee: new BigNumber(200), + nonce: new BigNumber(1), + senderPublicKey: PublicKey.fromPassphrase("sender passphrase"), + recipientId: Address.fromPassphrase("recipient passphrase"), + timestamp: 0, + type: 1, + expiration: 0, + typeGroup: 3, + version: 2, + }; + + Signer.sign(transaction.data, Keys.fromPassphrase("sender passphrase")); + Signer.secondSign(transaction.data, Keys.fromPassphrase("second passphrase")); + + const serialized = Serializer.serialize(transaction); + expect(serialized.toString("hex")).toEqual( + "ff" + // Header + "02" + // Version + "1e" + // Network + "03000000" + // TypeGroup + "0100" + // Type + "0100000000000000" + // Nonce + "0316a0b23be3408a4af227280bb005e9a136e0dbdd86860516850e5c29c1829113" + // senderPublicKey + "c800000000000000" + // Fee + "00" + // VendorField Length + "6400000000000000" + // Amount + "00000000" + // Expiration + "1e66314f1ccb9741d6f1a6f9b26ed563c439fc1a94" + // RecipientId + "fa17823c3e591586626426b494c8038d0eb10a67bcf06f2e6959a76b40898124c13e68a6ad36fd131affdeac64fc8c2b85c371b194ffc6e3ba868070fe677df2" + // Signature + "11816c200a139458c257fbb14c2f07c4dbb2ebf42ab9b98fbb8a702729c0427192dec75c2933db09333e2f790df652ee3a27d1e1730b8f28e786821fd9cf7587", // Second Signature + ); + + const deserialized = Deserializer.deserialize(serialized); + checkV2Fields(deserialized, transaction.data); + }); + + it("should ser/deser multi sign", () => { + registerTransactionTypes(TestTransaction); + + const transaction = new TestTransaction(); + transaction.data = { + amount: new BigNumber(100), + fee: new BigNumber(200), + nonce: new BigNumber(1), + senderPublicKey: PublicKey.fromPassphrase("sender passphrase"), + recipientId: Address.fromPassphrase("recipient passphrase"), + timestamp: 0, + type: 1, + expiration: 0, + typeGroup: 3, + version: 2, + }; + + Signer.multiSign(transaction.data, Keys.fromPassphrase("passphrase 0"), 0); + Signer.multiSign(transaction.data, Keys.fromPassphrase("passphrase 1"), 1); + Signer.multiSign(transaction.data, Keys.fromPassphrase("passphrase 2"), 2); + + const serialized = Serializer.serialize(transaction); + expect(serialized.toString("hex")).toEqual( + "ff" + // Header + "02" + // Version + "1e" + // Network + "03000000" + // TypeGroup + "0100" + // Type + "0100000000000000" + // Nonce + "0316a0b23be3408a4af227280bb005e9a136e0dbdd86860516850e5c29c1829113" + // SenderPublicKey + "c800000000000000" + // Fee + "00" + // VendorField lenght + "6400000000000000" + // Amount + "00000000" + // Expiration + "1e66314f1ccb9741d6f1a6f9b26ed563c439fc1a94" + // RecipientId + "00090bb29f6301ad77b1159b430af42fa228d21187025fc0fb347e0dc83a9eb0a21341c772f956d7349eb867072f6a09d44c828d38cb6bf52df0a06dc099bb13e2" + // 1st signature + "01f1241bbd5be038302c00fb6cdaf6c4da0a860fa82ef601510efaf0ca13ddd6f098db62e30d79d7190705c49366d091c136845416a295daad96a0d03149520a65" + // 2nd signature + "02bda0a17aa62c9c5ed904eae3915dd414e1faf67905c32c260f9c6ffbdaa9ace8b270051d9a81b243a15b4448ce97199562814cbc7c23a6375b411e9616090a67", // 3rd signature + ); + + const deserialized = Deserializer.deserialize(serialized); + checkV2Fields(deserialized, transaction.data); + }); + }); + + describe("other", () => { + it("should ser/deser vendorField", () => { + registerTransactionTypes(TestTransaction); + + const transaction = new TestTransaction(); + transaction.data = { + amount: new BigNumber(100), + fee: new BigNumber(200), + nonce: new BigNumber(1), + senderPublicKey: PublicKey.fromPassphrase("sender passphrase"), + recipientId: Address.fromPassphrase("recipient passphrase"), + timestamp: 0, + vendorField: "vendorField", + type: 1, + expiration: 0, + typeGroup: 3, + version: 2, + }; + + Signer.sign(transaction.data, Keys.fromPassphrase("sender passphrase")); + + const serialized = Serializer.serialize(transaction); + expect(serialized.toString("hex")).toEqual( + "ff" + // Header + "02" + // Version + "1e" + // Network + "03000000" + // Typegroup + "0100" + // Type + "0100000000000000" + // Nonce + "0316a0b23be3408a4af227280bb005e9a136e0dbdd86860516850e5c29c1829113" + // senderPublicKey + "c800000000000000" + // Fee + "0b" + // VendorField length + "76656e646f724669656c64" + // VendorField length + "6400000000000000" + // Amount + "00000000" + // Expiration + "1e66314f1ccb9741d6f1a6f9b26ed563c439fc1a94" + // RecipientId + "95a6303660af0a43d71d9d7434aababfd5fd9679c690164c3aea32ff3793ce00dc50868a41f379eee5470498e4c0a125f9dd5c6c12d1c5b1d7e708be6883ca31", // Signature + ); + + const deserialized = Deserializer.deserialize(serialized); + checkV2Fields(deserialized, transaction.data); + }); + + it("should ser/deser V1", () => { + configManager.getMilestone().aip11 = false; + + registerTransactionTypes(TestTransaction); + + const transaction = new TestTransaction(); + transaction.data = { + amount: new BigNumber(100), + fee: new BigNumber(200), + nonce: new BigNumber(1), + senderPublicKey: PublicKey.fromPassphrase("sender passphrase"), + recipientId: Address.fromPassphrase("recipient passphrase"), + timestamp: 0, + type: 1, + expiration: 0, + typeGroup: 3, + version: 1, + }; + + Signer.sign(transaction.data, Keys.fromPassphrase("sender passphrase")); + const serialized = Serializer.serialize(transaction); + + expect(serialized.toString("hex")).toEqual( + "ff011e01000000000316a0b23be3408a4af227280bb005e9a136e0dbdd86860516850e5c29c1829113c800000000000000006400000000000000000000001e66314f1ccb9741d6f1a6f9b26ed563c439fc1a9430450221008067d1beb623f2e7dbcb8580c0036a2d4a59c1a64fc3ba66f05fcea5a0614c6302203e94b41d50ca69498e4970d8a289c431474728e26652db8889bec4d8d0001144", + ); + }); + }); +}); diff --git a/__tests__/unit/crypto/utils/byte-buffer.test.ts b/__tests__/unit/crypto/utils/byte-buffer.test.ts new file mode 100644 index 0000000000..bd04efc55b --- /dev/null +++ b/__tests__/unit/crypto/utils/byte-buffer.test.ts @@ -0,0 +1,633 @@ +import { ByteBuffer } from "@packages/crypto/src/utils"; +import { Buffer } from "buffer"; + +describe("ByteBuffer", () => { + describe("result", () => { + it("should return valid result & result length", () => { + const buffer = Buffer.alloc(2); + const byteBuffer = new ByteBuffer(buffer); + + expect(byteBuffer.getResultLength()).toEqual(0); + expect(Buffer.alloc(0).compare(byteBuffer.getResult())).toEqual(0); + + byteBuffer.writeInt8(1); + + expect(byteBuffer.getResultLength()).toEqual(1); + const tmpBuffer1 = Buffer.alloc(1); + tmpBuffer1.writeInt8(1); + expect(tmpBuffer1.compare(byteBuffer.getResult())).toEqual(0); + + byteBuffer.writeInt8(2); + + expect(byteBuffer.getResultLength()).toEqual(2); + const tmpBuffer2 = Buffer.alloc(2); + tmpBuffer2.writeInt8(1); + tmpBuffer2.writeInt8(2, 1); + expect(tmpBuffer2.compare(byteBuffer.getResult())).toEqual(0); + }); + }); + + describe("reminder", () => { + it("should return valid remainders and remainder length", () => { + const buffer = Buffer.alloc(2); + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeInt8(1); + byteBuffer.writeInt8(2); + byteBuffer.reset(); + + expect(byteBuffer.getRemainderLength()).toEqual(2); + const tmpBuffer1 = Buffer.alloc(2); + tmpBuffer1.writeInt8(1); + tmpBuffer1.writeInt8(2, 1); + expect(tmpBuffer1.compare(byteBuffer.getRemainder())).toEqual(0); + + byteBuffer.readInt8(); + + expect(byteBuffer.getRemainderLength()).toEqual(1); + const tmpBuffer2 = Buffer.alloc(1); + tmpBuffer2.writeInt8(2); + expect(tmpBuffer2.compare(byteBuffer.getRemainder())).toEqual(0); + + byteBuffer.readInt8(); + + expect(byteBuffer.getRemainderLength()).toEqual(0); + expect(Buffer.alloc(0).compare(byteBuffer.getRemainder())).toEqual(0); + }); + }); + + describe("jump", () => { + it("should jump", () => { + const buffer = Buffer.alloc(1); + const byteBuffer = new ByteBuffer(buffer); + + expect(byteBuffer.getResultLength()).toEqual(0); + + byteBuffer.jump(1); + expect(byteBuffer.getResultLength()).toEqual(1); + + byteBuffer.jump(-1); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + + it("should throw error when jumping outside boundary", () => { + const buffer = Buffer.alloc(1); + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.jump(2); + }).toThrowError("Jump over buffer boundary."); + + expect(() => { + byteBuffer.jump(-1); + }).toThrowError("Jump over buffer boundary."); + }); + }); + + describe("Int8", () => { + const bufferSize = 1; + const min = -128; + const max = 127; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeInt8(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readInt8()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeInt8(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("UInt8", () => { + const bufferSize = 1; + const min = 0; + const max = 255; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeUInt8(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readUInt8()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeUInt8(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("Int16BE", () => { + const bufferSize = 2; + const min = -32768; + const max = 32767; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeInt16BE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readInt16BE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeInt16BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("UInt16BE", () => { + const bufferSize = 2; + const min = 0; + const max = 65535; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeUInt16BE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readUInt16BE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeUInt16BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("Int16LE", () => { + const bufferSize = 2; + const min = -32768; + const max = 32767; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeInt16LE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readInt16LE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeInt16LE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("UInt16LE", () => { + const bufferSize = 2; + const min = 0; + const max = 65535; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeUInt16LE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readUInt16LE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeUInt16LE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("Int32BE", () => { + const bufferSize = 4; + const min = -2147483648; + const max = 2147483647; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeInt32BE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readInt32BE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeInt32BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("UInt32BE", () => { + const bufferSize = 4; + const min = 0; + const max = 4294967295; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeUInt32BE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readUInt32BE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeUInt32BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("Int32LE", () => { + const bufferSize = 4; + const min = -2147483648; + const max = 2147483647; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeInt32LE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readInt32LE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeInt32LE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("UInt32LE", () => { + const bufferSize = 4; + const min = 0; + const max = 4294967295; + const validValues = [min, max]; + const invalidValues = [min - 1, max + 1]; + + it.each(validValues)("should write and read value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeUInt32LE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readUInt32LE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: number) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeUInt32LE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= ${min} and <= ${max}. Received ${value}`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("BigInt64BE", () => { + const bufferSize = 8; + const min = -9223372036854775808n; + const max = 9223372036854775807n; + const validValues = [min, max]; + const invalidValues = [min - 1n, max + 1n]; + + it.each(validValues)("should write and read value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeBigInt64BE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readBigInt64BE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeBigInt64BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= -(2n ** 63n) and < 2n ** 63n. Received ${value + .toLocaleString() + .replace(new RegExp(",", "g"), "_")}n`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("BigUInt64BE", () => { + const bufferSize = 8; + const min = 0n; + const max = 18_446_744_073_709_551_615n; + const validValues = [min, max]; + const invalidValues = [min - 1n, max + 1n]; + + it.each(validValues)("should write and read value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeBigUInt64BE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readBigUInt64BE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeBigUInt64BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= 0n and < 2n ** 64n. Received ${value + .toLocaleString() + .replace(new RegExp(",", "g"), "_")}n`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("BigInt64LE", () => { + const bufferSize = 8; + const min = -9223372036854775808n; + const max = 9223372036854775807n; + const validValues = [min, max]; + const invalidValues = [min - 1n, max + 1n]; + + it.each(validValues)("should write and read value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeBigInt64LE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readBigInt64LE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeBigInt64BE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= -(2n ** 63n) and < 2n ** 63n. Received ${value + .toLocaleString() + .replace(new RegExp(",", "g"), "_")}n`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("BigUInt64LE", () => { + const bufferSize = 8; + const min = 0n; + const max = 18_446_744_073_709_551_615n; + const validValues = [min, max]; + const invalidValues = [min - 1n, max + 1n]; + + it.each(validValues)("should write and read value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeBigUInt64LE(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(byteBuffer.readBigUInt64LE()).toEqual(value); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it.each(invalidValues)("should fail writing value: %s", (value: bigint) => { + const buffer = Buffer.alloc(bufferSize); + + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeBigUInt64LE(value); + }).toThrowError( + new RangeError( + `The value of "value" is out of range. It must be >= 0n and < 2n ** 64n. Received ${value + .toLocaleString() + .replace(new RegExp(",", "g"), "_")}n`, + ), + ); + expect(byteBuffer.getResultLength()).toEqual(0); + }); + }); + + describe("buffer", () => { + it("should write and read value", () => { + const bufferSize = 5; + const buffer = Buffer.alloc(bufferSize); + const bufferToCompare = Buffer.alloc(bufferSize).fill(1); + + const byteBuffer = new ByteBuffer(buffer); + + byteBuffer.writeBuffer(bufferToCompare); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + + byteBuffer.reset(); + expect(bufferToCompare.compare(byteBuffer.readBuffer(bufferSize))).toEqual(0); + expect(byteBuffer.getResultLength()).toEqual(bufferSize); + }); + + it("should throw when writing over boundary", () => { + const buffer = Buffer.alloc(5); + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.writeBuffer(Buffer.alloc(6)); + }).toThrowError("Write over buffer boundary."); + }); + + it("should throw reading writing over boundary", () => { + const buffer = Buffer.alloc(5); + const byteBuffer = new ByteBuffer(buffer); + + expect(() => { + byteBuffer.readBuffer(6); + }).toThrowError("Read over buffer boundary."); + }); + }); +}); diff --git a/benchmark/crypto/hash-algorithms.js b/benchmark/crypto/hash-algorithms.js index 4b644135b6..9109bf246e 100644 --- a/benchmark/crypto/hash-algorithms.js +++ b/benchmark/crypto/hash-algorithms.js @@ -1,50 +1,59 @@ -const { - Crypto, - Transactions -} = require('@arkecosystem/crypto') +const { Crypto, Transactions, Utils } = require("@arkecosystem/crypto"); const createHash = require("create-hash"); -const nodeSha256 = (bytes) => createHash("sha256").update(bytes).digest() +const nodeSha256 = (bytes) => createHash("sha256").update(bytes).digest(); -const data = require('../helpers').getJSONFixture('transaction/deserialized/0'); +const prepareData = (data) => { + const bigNumbers = ["fee", "amount", "nonce"]; + + for (const [key, value] of Object.entries(data)) { + if (bigNumbers.includes(key)) { + data[key] = new Utils.BigNumber(value); + } + } + + return data; +}; + +const data = prepareData(require("../helpers").getJSONFixture("transaction/deserialized/0")); const transactionBytes = Transactions.Utils.toBytes(data); -exports['bcrypto.sha256'] = () => { +exports["bcrypto.sha256"] = () => { Crypto.HashAlgorithms.sha256(transactionBytes); }; -exports['node.sha256'] = () => { +exports["node.sha256"] = () => { nodeSha256(transactionBytes); }; -exports['bcrypto.sha1'] = () => { +exports["bcrypto.sha1"] = () => { Crypto.HashAlgorithms.sha1(transactionBytes); }; -exports['node.sha1'] = () => { +exports["node.sha1"] = () => { createHash("sha1").update(transactionBytes).digest(); }; -exports['bcrypto.ripemd160'] = () => { +exports["bcrypto.ripemd160"] = () => { Crypto.HashAlgorithms.ripemd160(transactionBytes); }; -exports['node.ripemd160'] = () => { +exports["node.ripemd160"] = () => { createHash("ripemd160").update(transactionBytes).digest(); }; -exports['bcrypto.hash160'] = () => { +exports["bcrypto.hash160"] = () => { Crypto.HashAlgorithms.hash160(transactionBytes); }; -exports['node.hash160'] = () => { +exports["node.hash160"] = () => { createHash("ripemd160").update(nodeSha256(transactionBytes)).digest(); }; -exports['bcrypto.hash256'] = () => { +exports["bcrypto.hash256"] = () => { Crypto.HashAlgorithms.hash256(transactionBytes); }; -exports['node.hash256'] = () => { +exports["node.hash256"] = () => { nodeSha256(nodeSha256(transactionBytes)); }; diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile index 59f7639dc5..e19b560953 100644 --- a/docker/production/Dockerfile +++ b/docker/production/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-alpine +FROM node:18-alpine WORKDIR /home/node/core @@ -6,10 +6,11 @@ ADD docker/production/entrypoint.sh /entrypoint.sh ARG core_channel=latest -RUN apk add --no-cache --virtual .build-deps make gcc g++ python git \ +RUN apk add --no-cache --virtual .build-deps make gcc g++ python3 git \ && apk add --no-cache bash sudo git openntpd openssl \ && echo "servers pool.ntp.org" > /etc/ntpd.conf \ && echo "servers time.google.com" >> /etc/ntpd.conf \ + && su node -c "yarn global add node-gyp" \ && su node -c "yarn global add @arkecosystem/core@${core_channel}" \ && su node -c "yarn cache clean" \ && apk del .build-deps \ diff --git a/docker/production/README.md b/docker/production/README.md index 31a616d1c8..b0cebe64ef 100644 --- a/docker/production/README.md +++ b/docker/production/README.md @@ -23,7 +23,7 @@ Run Relay only node using [Docker Compose](https://docs.docker.com/compose/) **_DevNet_** -> Create file `docker-compose.yml` with the following content: +> Create file `docker compose.yml` with the following content: ```bash version: '2' @@ -97,7 +97,7 @@ CORE_WEBHOOKS_PORT=4004 **_MainNet_** -> Create file `docker-compose.yml` with the following content: +> Create file `docker compose.yml` with the following content: ```bash version: '2' @@ -174,7 +174,7 @@ _If you prefer to use custom DB Name, DB User and DB Password simply adjust vari > _Time to start the relay node_: ```bash -docker-compose up -d +docker compose up -d ``` ### _ARK Core docker image allows you to run a `forger`. However it requires some additional steps that can be found by visiting our [Documentation page](https://guides.ark.dev/devops-guides/how-to-setup-a-node-with-docker#production-setup)._ diff --git a/docker/production/entrypoint.sh b/docker/production/entrypoint.sh index 25870fd18e..74b4972fd3 100755 --- a/docker/production/entrypoint.sh +++ b/docker/production/entrypoint.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -sudo /usr/sbin/ntpd -s +sudo /usr/sbin/ntpd sudo rm -rf /home/node/.config/ark-core/* sudo rm -rf /home/node/.local/state/ark-core/* diff --git a/install-next.sh b/install-next.sh index d9871470e0..876b1a8896 100644 --- a/install-next.sh +++ b/install-next.sh @@ -110,13 +110,13 @@ sudo rm -rf ~/{.npm,.forever,.node*,.cache,.nvm} if [[ ! -z $DEB ]]; then sudo wget --quiet -O - https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add - - (echo "deb https://deb.nodesource.com/node_14.x ${DEB_ID} main" | sudo tee /etc/apt/sources.list.d/nodesource.list) + (echo "deb https://deb.nodesource.com/node_16.x ${DEB_ID} main" | sudo tee /etc/apt/sources.list.d/nodesource.list) sudo apt-get update sudo apt-get install nodejs -y elif [[ ! -z $RPM ]]; then sudo yum install gcc-c++ make -y - curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash - > /dev/null 2>&1 + curl -sL https://rpm.nodesource.com/setup_16.x | sudo -E bash - > /dev/null 2>&1 fi success "Installed node.js & npm!" diff --git a/install.sh b/install.sh index b1aab5b085..4c27e18979 100644 --- a/install.sh +++ b/install.sh @@ -48,7 +48,11 @@ RPM=$(which yum || :) SYS=$([[ -L "/sbin/init" ]] && echo 'SystemD' || echo 'SystemV') # Detect Debian/Ubuntu derivative -DEB_ID=$( (grep DISTRIB_CODENAME /etc/upstream-release/lsb-release || grep DISTRIB_CODENAME /etc/lsb-release) 2>/dev/null | cut -d'=' -f2 ) +DEB_ID=$( (grep DISTRIB_CODENAME /etc/upstream-release/lsb-release || grep DISTRIB_CODENAME /etc/lsb-release || grep VERSION_CODENAME /etc/os-release) 2>/dev/null | cut -d'=' -f2 ) + +#APT Vars +APT_ENV="DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a" + if [[ ! -z $DEB ]]; then success "Running install for Debian derivative" @@ -95,7 +99,7 @@ heading "Installing system dependencies..." if [[ ! -z $DEB ]]; then sudo apt-get update - sudo apt-get install -y git curl apt-transport-https update-notifier + sudo $APT_ENV apt-get install git curl apt-transport-https bc wget gnupg -yq elif [[ ! -z $RPM ]]; then sudo yum update -y sudo yum install git curl epel-release --skip-broken -y @@ -109,14 +113,15 @@ sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man sudo rm -rf ~/{.npm,.forever,.node*,.cache,.nvm} if [[ ! -z $DEB ]]; then - sudo wget --quiet -O - https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add - - (echo "deb https://deb.nodesource.com/node_14.x ${DEB_ID} main" | sudo tee /etc/apt/sources.list.d/nodesource.list) + (echo -e "Package: nodejs\nPin: origin deb.nodesource.com\nPin-Priority: 999" | sudo tee /etc/apt/preferences.d/nodesource) + curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/nodesource.gpg >/dev/null + (echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x ${DEB_ID} main" | sudo tee /etc/apt/sources.list.d/nodesource.list) sudo apt-get update - sudo apt-get install nodejs -y + sudo $APT_ENV apt-get install nodejs -yq elif [[ ! -z $RPM ]]; then sudo yum install gcc-c++ make -y - curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash - > /dev/null 2>&1 + curl -sL https://rpm.nodesource.com/setup_16.x | sudo -E bash - > /dev/null 2>&1 fi success "Installed node.js & npm!" @@ -124,11 +129,10 @@ success "Installed node.js & npm!" heading "Installing Yarn..." if [[ ! -z $DEB ]]; then - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - - (echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list) - + curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null + (echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list) sudo apt-get update - sudo apt-get install -y yarn + sudo $APT_ENV apt-get install yarn -yq elif [[ ! -z $RPM ]]; then curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo sudo yum install yarn -y @@ -146,22 +150,13 @@ pm2 set pm2-logrotate:retain 7 success "Installed PM2!" -heading "Installing program dependencies..." - -if [[ ! -z $DEB ]]; then - sudo apt-get install build-essential libcairo2-dev pkg-config libtool autoconf automake python libpq-dev jq libjemalloc-dev -y -elif [[ ! -z $RPM ]]; then - sudo yum groupinstall "Development Tools" -y -q - sudo yum install postgresql-devel jq jemalloc-devel -y -q -fi - -success "Installed program dependencies!" - heading "Installing PostgreSQL..." if [[ ! -z $DEB ]]; then + curl -sL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/pgdg.gpg >/dev/null + (echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt ${DEB_ID}-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list ) sudo apt-get update - sudo apt-get install postgresql postgresql-contrib -y + sudo $APT_ENV apt-get install postgresql -yq elif [[ ! -z $RPM ]]; then sudo yum install postgresql-server postgresql-contrib -y @@ -177,12 +172,24 @@ fi success "Installed PostgreSQL!" +heading "Installing program dependencies..." + +if [[ ! -z $DEB ]]; then + sudo $APT_ENV apt-get install build-essential pkg-config libtool autoconf automake libpq-dev jq libjemalloc-dev -yq +elif [[ ! -z $RPM ]]; then + sudo yum groupinstall "Development Tools" -y -q + sudo yum install postgresql-devel jq jemalloc-devel -y -q +fi + +success "Installed program dependencies!" + + heading "Installing NTP..." sudo timedatectl set-ntp off > /dev/null 2>&1 || true # disable the default systemd timesyncd service if [[ ! -z $DEB ]]; then - sudo apt-get install ntp -yyq + sudo $APT_ENV apt-get install ntp -yq if [ -z "$(sudo service ntp status |grep running)" ] ; then sudo ntpd -gq fi @@ -201,9 +208,9 @@ heading "Installing system updates..." if [[ ! -z $DEB ]]; then sudo apt-get update - sudo apt-get upgrade -yqq - sudo apt-get dist-upgrade -yq - sudo apt-get autoremove -yyq + sudo $APT_ENV apt-get upgrade -yq + sudo $APT_ENV apt-get dist-upgrade -yq + sudo apt-get autoremove -yq sudo apt-get autoclean -yq elif [[ ! -z $RPM ]]; then sudo yum update diff --git a/lerna.json b/lerna.json index 8d202c4aed..f296a1f53d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,10 +1,9 @@ { - "lerna": "3.5.0", - "npmClient": "yarn", - "packages": [ - "packages/*", - "plugins/*" - ], - "useWorkspaces": true, - "version": "3.0.6" + "npmClient": "yarn", + "packages": [ + "packages/*", + "plugins/*" + ], + "version": "3.12.0", + "$schema": "node_modules/lerna/schemas/lerna-schema.json" } diff --git a/package.json b/package.json index c7490b8d86..1e4b433a31 100644 --- a/package.json +++ b/package.json @@ -1,109 +1,98 @@ { - "private": true, - "name": "core", - "description": "The packages that make up the ARK Core", - "scripts": { - "lerna": "node ./node_modules/lerna/cli.js", - "setup": "yarn && yarn bootstrap && yarn build", - "setup:clean": "yarn && yarn clean && yarn bootstrap && yarn build", - "bootstrap": "yarn lerna bootstrap", - "clean": "yarn lerna clean --yes", - "build": "yarn lerna run build", - "lint": "./node_modules/eslint/bin/eslint.js packages --ext .ts --fix", - "lint:tests": "./node_modules/eslint/bin/eslint.js __tests__ --ext .ts --fix", - "prettier": "prettier --write \"./*.{ts,js,json,md}\" \"./packages/**/*.{ts,js,json,md}\" \"./__tests__/**/*.{ts,js,json,md}\"", - "format": "yarn lint && yarn prettier", - "test": "cross-env CORE_ENV=test jest --runInBand --forceExit", - "test:parallel": "cross-env CORE_ENV=test jest --forceExit", - "test:coverage": "cross-env CORE_ENV=test jest --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", - "test:debug": "cross-env CORE_ENV=test node --inspect-brk ./node_modules/.bin/jest --runInBand", - "test:watch": "cross-env CORE_ENV=test jest --runInBand --watch", - "test:watch:all": "cross-env CORE_ENV=test jest --runInBand --watchAll", - "test:unit": "cross-env jest __tests__/unit/** --forceExit", - "test:unit:coverage": "cross-env jest __tests__/unit --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$'", - "test:unit:debug": "cross-env node --inspect-brk ./node_modules/.bin/jest __tests__/unit", - "test:unit:watch": "cross-env jest __tests__/unit --watch", - "test:unit:watch:all": "cross-env CORE_ENV=test jest __tests__/unit --watchAll", - "test:integration": "cross-env CORE_ENV=test jest __tests__/integration --runInBand --forceExit", - "test:integration:coverage": "cross-env CORE_ENV=test jest __tests__/integration --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", - "test:integration:debug": "cross-env CORE_ENV=test node --inspect-brk ./node_modules/.bin/jest __tests__/integration --runInBand", - "test:integration:watch": "cross-env CORE_ENV=test jest __tests__/integration --runInBand --watch", - "test:integration:watch:all": "cross-env CORE_ENV=test jest __tests__/integration --runInBand --watchAll", - "test:functional": "cross-env CORE_ENV=test jest __tests__/functional --runInBand --forceExit", - "test:functional:coverage": "cross-env CORE_ENV=test jest __tests__/functional --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", - "test:functional:debug": "cross-env CORE_ENV=test node --inspect-brk ./node_modules/.bin/jest __tests__/functional --runInBand", - "test:functional:watch": "cross-env CORE_ENV=test jest __tests__/functional --runInBand --watch", - "test:functional:watch:all": "cross-env CORE_ENV=test jest __tests__/functional --runInBand --watchAll", - "publish:alpha": "cross-env-shell ./scripts/publish/alpha.sh", - "publish:beta": "cross-env-shell ./scripts/publish/beta.sh", - "publish:rc": "cross-env-shell ./scripts/publish/rc.sh", - "publish:next": "cross-env-shell ./scripts/publish/next.sh", - "publish:latest": "cross-env-shell ./scripts/publish/latest.sh", - "upgrade": "cross-env-shell ./scripts/upgrade.sh", - "version": "cross-env-shell ./scripts/version.sh", - "deps": "cross-env-shell ./scripts/deps/update.sh", - "deps:missing": "node ./scripts/deps/missing.js", - "deps:unused": "node ./scripts/deps/unused.js", - "deps:types": "./node_modules/typesync/bin/typesync", - "madge:circular": "node ./scripts/circular.js", - "madge:graph": "./node_modules/madge/bin/cli.js --image circular-graph.svg --extensions ts ./packages/**/src", - "docker": "node ./scripts/docker/generate-docker.js", - "bench": "node benchmark/index.js" - }, - "devDependencies": { - "@babel/core": "7.15.5", - "@babel/preset-env": "7.15.4", - "@commitlint/cli": "11.0.0", - "@commitlint/config-conventional": "11.0.0", - "@faustbrian/benchmarker": "0.1.2", - "@oclif/dev-cli": "1.26.0", - "@types/babel__core": "7.1.16", - "@types/create-hash": "1.2.2", - "@types/depcheck": "0.9.1", - "@types/jest": "26.0.24", - "@types/js-yaml": "3.12.7", - "@types/node": "13.9.5", - "@types/prettier": "2.3.2", - "@types/rimraf": "3.0.2", - "@types/uuid": "8.3.1", - "@typescript-eslint/eslint-plugin": "3.10.1", - "@typescript-eslint/parser": "3.10.1", - "babel-loader": "8.2.2", - "capture-console": "1.0.1", - "cpy-cli": "3.1.1", - "create-hash": "1.2.0", - "cross-env": "7.0.3", - "del-cli": "3.0.1", - "depcheck": "1.4.2", - "eslint": "7.32.0", - "eslint-config-prettier": "6.15.0", - "eslint-plugin-jest": "24.4.0", - "eslint-plugin-prettier": "3.4.1", - "eslint-plugin-simple-import-sort": "5.0.3", - "get-port": "5.1.1", - "husky": "4.3.8", - "jest": "26.6.3", - "jest-extended": "0.11.5", - "js-yaml": "3.14.1", - "lerna": "3.22.1", - "lint-staged": "10.5.4", - "madge": "4.0.1", - "moment": "2.29.1", - "moment-timezone": "0.5.33", - "nock": "13.1.3", - "npm-check-updates": "9.2.4", - "prettier": "2.4.0", - "rimraf": "3.0.2", - "sinon": "9.2.4", - "tmp": "0.2.1", - "ts-jest": "26.5.6", - "typedoc": "0.21.9", - "typescript": "3.8.3", - "typesync": "0.8.0", - "uuid": "8.3.2" - }, - "workspaces": [ - "packages/*", - "plugins/*" - ] + "private": true, + "name": "core", + "description": "The packages that make up the ARK Core", + "scripts": { + "setup": "yarn && yarn build", + "setup:clean": "yarn && yarn clean && yarn build", + "clean": "yarn lerna clean --yes", + "build": "yarn lerna run build", + "lint": "./node_modules/eslint/bin/eslint.js packages --ext .ts --fix", + "lint:tests": "./node_modules/eslint/bin/eslint.js __tests__ --ext .ts --fix", + "prettier": "prettier --write \"./*.{ts,js,json,md}\" \"./packages/**/*.{ts,js,json,md}\" \"./__tests__/**/*.{ts,js,json,md}\"", + "format": "yarn lint && yarn prettier", + "test": "cross-env CORE_ENV=test jest --runInBand --forceExit", + "test:parallel": "cross-env CORE_ENV=test jest --forceExit", + "test:coverage": "cross-env CORE_ENV=test jest --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", + "test:debug": "cross-env CORE_ENV=test node --inspect-brk ./node_modules/.bin/jest --runInBand", + "test:watch": "cross-env CORE_ENV=test jest --runInBand --watch", + "test:watch:all": "cross-env CORE_ENV=test jest --runInBand --watchAll", + "test:unit": "cross-env jest __tests__/unit/** --forceExit", + "test:unit:coverage": "cross-env jest __tests__/unit --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$'", + "test:unit:debug": "cross-env node --inspect-brk ./node_modules/.bin/jest __tests__/unit", + "test:unit:watch": "cross-env jest __tests__/unit --watch", + "test:unit:watch:all": "cross-env CORE_ENV=test jest __tests__/unit --watchAll", + "test:integration": "cross-env CORE_ENV=test jest __tests__/integration --runInBand --forceExit", + "test:integration:coverage": "cross-env CORE_ENV=test jest __tests__/integration --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", + "test:integration:debug": "cross-env CORE_ENV=test node --inspect-brk ./node_modules/.bin/jest __tests__/integration --runInBand", + "test:integration:watch": "cross-env CORE_ENV=test jest __tests__/integration --runInBand --watch", + "test:integration:watch:all": "cross-env CORE_ENV=test jest __tests__/integration --runInBand --watchAll", + "test:functional": "cross-env CORE_ENV=test jest __tests__/functional --runInBand --forceExit", + "test:functional:coverage": "cross-env CORE_ENV=test jest __tests__/functional --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", + "test:functional:debug": "cross-env CORE_ENV=test node --inspect-brk ./node_modules/.bin/jest __tests__/functional --runInBand", + "test:functional:watch": "cross-env CORE_ENV=test jest __tests__/functional --runInBand --watch", + "test:functional:watch:all": "cross-env CORE_ENV=test jest __tests__/functional --runInBand --watchAll", + "publish:alpha": "cross-env-shell ./scripts/publish/alpha.sh", + "publish:beta": "cross-env-shell ./scripts/publish/beta.sh", + "publish:rc": "cross-env-shell ./scripts/publish/rc.sh", + "publish:next": "cross-env-shell ./scripts/publish/next.sh", + "publish:latest": "cross-env-shell ./scripts/publish/latest.sh", + "upgrade": "cross-env-shell ./scripts/upgrade.sh", + "version": "cross-env-shell ./scripts/version.sh", + "deps": "cross-env-shell ./scripts/deps/update.sh", + "deps:missing": "node ./scripts/deps/missing.js", + "deps:unused": "node ./scripts/deps/unused.js", + "deps:types": "./node_modules/typesync/bin/typesync", + "madge:circular": "node ./scripts/circular.js", + "madge:graph": "./node_modules/madge/bin/cli.js --image circular-graph.svg --extensions ts ./packages/**/src", + "docker": "node ./scripts/docker/generate-docker.js", + "bench": "node benchmark/index.js" + }, + "devDependencies": { + "@babel/core": "7.15.5", + "@babel/preset-env": "7.15.4", + "@commitlint/cli": "11.0.0", + "@commitlint/config-conventional": "11.0.0", + "@faustbrian/benchmarker": "0.1.2", + "@oclif/dev-cli": "1.26.0", + "@types/babel__core": "7.1.16", + "@types/create-hash": "1.2.2", + "@types/depcheck": "0.9.1", + "@types/jest": "26.0.24", + "@types/node": "13.9.5", + "@types/prettier": "2.3.2", + "@types/rimraf": "3.0.2", + "@typescript-eslint/eslint-plugin": "3.10.1", + "@typescript-eslint/parser": "3.10.1", + "babel-loader": "8.2.2", + "capture-console": "1.0.2", + "create-hash": "1.2.0", + "cross-env": "7.0.3", + "depcheck": "1.4.7", + "eslint-config-prettier": "6.15.0", + "eslint-plugin-jest": "24.4.0", + "eslint-plugin-prettier": "3.4.1", + "eslint-plugin-simple-import-sort": "5.0.3", + "eslint": "7.32.0", + "fs-extra": "8.1.0", + "jest-extended": "0.11.5", + "jest": "26.6.3", + "lerna": "7.4.2", + "madge": "6.1.0", + "moment-timezone": "0.5.44", + "nock": "13.5.1", + "npm-check-updates": "16.14.14", + "prettier": "2.4.0", + "rimraf": "5.0.5", + "sinon": "17.0.1", + "tmp": "0.2.1", + "ts-jest": "26.5.6", + "typedoc": "0.22.17", + "typescript": "4.1.6", + "typesync": "0.8.0" + }, + "workspaces": [ + "packages/*", + "plugins/*" + ] } diff --git a/packages/core-api/package.json b/packages/core-api/package.json index 942c8b9d67..638ff46e56 100644 --- a/packages/core-api/package.json +++ b/packages/core-api/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-api", - "version": "3.0.6", + "version": "3.12.0", "description": "Public API for ARK Core", "license": "MIT", "contributors": [ @@ -22,25 +22,25 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6", + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0", "@hapi/boom": "9.1.4", "@hapi/hapi": "20.1.5", "@hapi/hoek": "9.2.0", - "joi": "17.4.2", + "joi": "17.12.1", "nanomatch": "1.2.13", "node-cache": "5.1.2", - "rate-limiter-flexible": "1.3.2", - "semver": "6.3.0" + "qs": "6.11.2", + "rate-limiter-flexible": "4.0.1", + "semaphore": "1.1.0", + "semver": "7.5.4" }, "devDependencies": { "@types/hapi__boom": "7.4.1", - "@types/hapi__joi": "17.1.7", - "@types/ip": "1.1.0", - "@types/semver": "6.2.3", - "lodash.clonedeep": "4.5.0" + "@types/semaphore": "1.1.4", + "@types/semver": "7.5.6" }, "engines": { "node": ">=10.x" diff --git a/packages/core-api/src/controllers/blocks.ts b/packages/core-api/src/controllers/blocks.ts index 7fd69ccf27..ec05ff7c93 100644 --- a/packages/core-api/src/controllers/blocks.ts +++ b/packages/core-api/src/controllers/blocks.ts @@ -12,9 +12,11 @@ export class BlocksController extends Controller { private readonly blockchain!: Contracts.Blockchain.Blockchain; @Container.inject(Container.Identifiers.BlockHistoryService) + @Container.tagged("connection", "api") private readonly blockHistoryService!: Contracts.Shared.BlockHistoryService; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "api") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; @Container.inject(Container.Identifiers.StateStore) @@ -46,7 +48,11 @@ export class BlocksController extends Controller { const block = this.stateStore.getGenesisBlock(); if (request.query.transform) { - return this.respondWithResource(block, BlockWithTransactionsResource, true); + return this.respondWithResource( + { data: block.data, transactions: block.transactions.map((t) => t.data) }, + BlockWithTransactionsResource, + true, + ); } else { return this.respondWithResource(block.data, BlockResource, false); } @@ -56,7 +62,11 @@ export class BlocksController extends Controller { const block = this.blockchain.getLastBlock(); if (request.query.transform) { - return this.respondWithResource(block, BlockWithTransactionsResource, true); + return this.respondWithResource( + { data: block.data, transactions: block.transactions.map((t) => t.data) }, + BlockWithTransactionsResource, + true, + ); } else { return this.respondWithResource(block.data, BlockResource, false); } diff --git a/packages/core-api/src/controllers/controller.ts b/packages/core-api/src/controllers/controller.ts index ceddc9cf12..6afd39d733 100644 --- a/packages/core-api/src/controllers/controller.ts +++ b/packages/core-api/src/controllers/controller.ts @@ -58,10 +58,12 @@ export class Controller { const orderBy = Array.isArray(request.query.orderBy) ? request.query.orderBy : request.query.orderBy.split(","); - return orderBy.map((s: string) => ({ - property: s.split(":")[0], - direction: s.split(":")[1] === "desc" ? "desc" : "asc", - })); + return orderBy + .flatMap((o: object) => o) + .map((s: string) => ({ + property: s.split(":")[0], + direction: s.split(":")[1] === "desc" ? "desc" : "asc", + })); } protected getListingOptions(): Contracts.Search.Options { diff --git a/packages/core-api/src/controllers/delegates.ts b/packages/core-api/src/controllers/delegates.ts index 5468012a45..488317f32c 100644 --- a/packages/core-api/src/controllers/delegates.ts +++ b/packages/core-api/src/controllers/delegates.ts @@ -6,6 +6,7 @@ import Hapi from "@hapi/hapi"; import { Identifiers } from "../identifiers"; import { BlockResource, BlockWithTransactionsResource } from "../resources"; import { + blockCriteriaSchemaObject, DelegateCriteria, delegateCriteriaSchemaObject, DelegateResource, @@ -25,9 +26,10 @@ export class DelegatesController extends Controller { private readonly walletSearchService!: WalletSearchService; @Container.inject(Container.Identifiers.BlockHistoryService) + @Container.tagged("connection", "api") private readonly blockHistoryService!: Contracts.Shared.BlockHistoryService; - public index(request: Hapi.Request): Contracts.Search.ResultsPage { + public async index(request: Hapi.Request): Promise> { const pagination = this.getQueryPagination(request.query); const sorting = request.query.orderBy as Contracts.Search.Sorting; const criteria = this.getQueryCriteria(request.query, delegateCriteriaSchemaObject) as DelegateCriteria; @@ -51,7 +53,7 @@ export class DelegatesController extends Controller { return { data: delegateResource }; } - public voters(request: Hapi.Request): Contracts.Search.ResultsPage | Boom { + public async voters(request: Hapi.Request): Promise | Boom> { const walletId = request.params.id as string; const walletResource = this.walletSearchService.getWallet(walletId); @@ -88,8 +90,12 @@ export class DelegatesController extends Controller { return notFound("Delegate not found"); } + const blockCriteria = { + ...(this.getQueryCriteria(request.query, blockCriteriaSchemaObject) as Contracts.Shared.OrBlockCriteria), + generatorPublicKey: delegateResource.publicKey, + }; + if (request.query.transform) { - const blockCriteria = { generatorPublicKey: delegateResource.publicKey }; const blockWithSomeTransactionsListResult = await this.blockHistoryService.listByCriteriaJoinTransactions( blockCriteria, { typeGroup: Enums.TransactionTypeGroup.Core, type: Enums.TransactionType.MultiPayment }, @@ -100,7 +106,6 @@ export class DelegatesController extends Controller { return this.toPagination(blockWithSomeTransactionsListResult, BlockWithTransactionsResource, true); } else { - const blockCriteria = { generatorPublicKey: delegateResource.publicKey }; const blockListResult = await this.blockHistoryService.listByCriteria( blockCriteria, this.getListingOrder(request), diff --git a/packages/core-api/src/controllers/locks.ts b/packages/core-api/src/controllers/locks.ts index 751ed6f7e3..c8f4abe8e2 100644 --- a/packages/core-api/src/controllers/locks.ts +++ b/packages/core-api/src/controllers/locks.ts @@ -15,9 +15,10 @@ export class LocksController extends Controller { private readonly lockSearchService!: LockSearchService; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "api") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; - public index(request: Hapi.Request): Contracts.Search.ResultsPage { + public async index(request: Hapi.Request): Promise> { const pagination = this.getQueryPagination(request.query); const sorting = request.query.orderBy as Contracts.Search.Sorting; const criteria = this.getQueryCriteria(request.query, lockCriteriaSchemaObject) as LockCriteria; diff --git a/packages/core-api/src/controllers/node.ts b/packages/core-api/src/controllers/node.ts index 50f6da36bc..92f50bea2a 100644 --- a/packages/core-api/src/controllers/node.ts +++ b/packages/core-api/src/controllers/node.ts @@ -27,6 +27,7 @@ export class NodeController extends Controller { private readonly networkMonitor!: Contracts.P2P.NetworkMonitor; @Container.inject(Container.Identifiers.DatabaseTransactionRepository) + @Container.tagged("connection", "api") private readonly transactionRepository!: Repositories.TransactionRepository; public async status(request: Hapi.Request, h: Hapi.ResponseToolkit) { @@ -80,15 +81,12 @@ export class NodeController extends Controller { constants: Managers.configManager.getMilestone(this.blockchain.getLastHeight()), transactionPool: { dynamicFees: dynamicFees.enabled ? dynamicFees : { enabled: false }, - maxTransactionsInPool: this.transactionPoolConfiguration.getRequired( - "maxTransactionsInPool", - ), - maxTransactionsPerSender: this.transactionPoolConfiguration.getRequired( - "maxTransactionsPerSender", - ), - maxTransactionsPerRequest: this.transactionPoolConfiguration.getRequired( - "maxTransactionsPerRequest", - ), + maxTransactionsInPool: + this.transactionPoolConfiguration.getRequired("maxTransactionsInPool"), + maxTransactionsPerSender: + this.transactionPoolConfiguration.getRequired("maxTransactionsPerSender"), + maxTransactionsPerRequest: + this.transactionPoolConfiguration.getRequired("maxTransactionsPerRequest"), maxTransactionAge: this.transactionPoolConfiguration.getRequired("maxTransactionAge"), maxTransactionBytes: this.transactionPoolConfiguration.getRequired("maxTransactionBytes"), }, @@ -106,12 +104,11 @@ export class NodeController extends Controller { // @ts-ignore const handlers = this.nullHandlerRegistry.getRegisteredHandlers(); const handlersKey = {}; - const txsTypes: Array<{ type: number, typeGroup: number }> = []; + const txsTypes: Array<{ type: number; typeGroup: number }> = []; for (const handler of handlers) { - handlersKey[ - `${handler.getConstructor().type}-${handler.getConstructor().typeGroup}` - ] = handler.getConstructor().key; - txsTypes.push({ type: handler.getConstructor().type!, typeGroup: handler.getConstructor().typeGroup!}); + handlersKey[`${handler.getConstructor().type}-${handler.getConstructor().typeGroup}`] = + handler.getConstructor().key; + txsTypes.push({ type: handler.getConstructor().type!, typeGroup: handler.getConstructor().typeGroup! }); } const results = await this.transactionRepository.getFeeStatistics(txsTypes, request.query.days); diff --git a/packages/core-api/src/controllers/rounds.ts b/packages/core-api/src/controllers/rounds.ts index a1cd44fad2..2e5602fe5a 100644 --- a/packages/core-api/src/controllers/rounds.ts +++ b/packages/core-api/src/controllers/rounds.ts @@ -8,6 +8,7 @@ import { Controller } from "./controller"; export class RoundsController extends Controller { @Container.inject(Container.Identifiers.DatabaseRoundRepository) + @Container.tagged("connection", "api") private readonly roundRepository!: Repositories.RoundRepository; public async delegates(request: Hapi.Request, h: Hapi.ResponseToolkit) { diff --git a/packages/core-api/src/controllers/transactions.ts b/packages/core-api/src/controllers/transactions.ts index ec7783080d..399ce06123 100644 --- a/packages/core-api/src/controllers/transactions.ts +++ b/packages/core-api/src/controllers/transactions.ts @@ -20,9 +20,11 @@ export class TransactionsController extends Controller { private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "api") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; @Container.inject(Container.Identifiers.BlockHistoryService) + @Container.tagged("connection", "api") private readonly blockHistoryService!: Contracts.Shared.BlockHistoryService; @Container.inject(Container.Identifiers.TransactionPoolProcessor) diff --git a/packages/core-api/src/controllers/votes.ts b/packages/core-api/src/controllers/votes.ts index fa1a504fa3..52309f61f8 100644 --- a/packages/core-api/src/controllers/votes.ts +++ b/packages/core-api/src/controllers/votes.ts @@ -9,6 +9,7 @@ import { Controller } from "./controller"; @Container.injectable() export class VotesController extends Controller { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "api") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public async index(request: Hapi.Request, h: Hapi.ResponseToolkit) { diff --git a/packages/core-api/src/controllers/wallets.ts b/packages/core-api/src/controllers/wallets.ts index 46cf708d03..4044b1b65f 100644 --- a/packages/core-api/src/controllers/wallets.ts +++ b/packages/core-api/src/controllers/wallets.ts @@ -28,9 +28,10 @@ export class WalletsController extends Controller { private readonly lockSearchService!: LockSearchService; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "api") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; - public index(request: Hapi.Request): Contracts.Search.ResultsPage { + public async index(request: Hapi.Request): Promise> { const pagination = this.getQueryPagination(request.query); const sorting = request.query.orderBy as Contracts.Search.Sorting; const criteria = this.getQueryCriteria(request.query, walletCriteriaSchemaObject) as WalletCriteria; @@ -38,7 +39,7 @@ export class WalletsController extends Controller { return this.walletSearchService.getWalletsPage(pagination, sorting, criteria); } - public top(request: Hapi.Request): Contracts.Search.ResultsPage { + public async top(request: Hapi.Request): Promise> { const pagination = this.getQueryPagination(request.query); const sorting = request.query.orderBy as Contracts.Search.Sorting; const criteria = this.getQueryCriteria(request.query, walletCriteriaSchemaObject) as WalletCriteria; @@ -57,7 +58,7 @@ export class WalletsController extends Controller { return { data: walletResource }; } - public locks(request: Hapi.Request): Contracts.Search.ResultsPage | Boom { + public async locks(request: Hapi.Request): Promise | Boom> { const walletId = request.params.id as string; const walletResource = this.walletSearchService.getWallet(walletId); diff --git a/packages/core-api/src/defaults.ts b/packages/core-api/src/defaults.ts index bcb2e7ab95..db1ba3ba16 100644 --- a/packages/core-api/src/defaults.ts +++ b/packages/core-api/src/defaults.ts @@ -17,11 +17,39 @@ export const defaults = { }, }, plugins: { + log: { + enabled: !!process.env.CORE_API_LOG, + }, cache: { enabled: !!process.env.CORE_API_CACHE, stdTTL: 8, checkperiod: 120, }, + semaphore: { + enabled: !process.env.CORE_API_SEMAPHORE_DISABLED, + database: { + levelOne: { + concurrency: 10, + queueLimit: 100, + maxOffset: 10_000, + }, + levelTwo: { + concurrency: 1, + queueLimit: 5, + }, + }, + memory: { + levelOne: { + concurrency: 3, + queueLimit: 30, + maxOffset: 1_000, + }, + levelTwo: { + concurrency: 1, + queueLimit: 5, + }, + }, + }, rateLimit: { enabled: !process.env.CORE_API_RATE_LIMIT_DISABLED, points: process.env.CORE_API_RATE_LIMIT_USER_LIMIT || 100, diff --git a/packages/core-api/src/plugins/index.ts b/packages/core-api/src/plugins/index.ts index d93a15a26a..2b0fa6e19f 100644 --- a/packages/core-api/src/plugins/index.ts +++ b/packages/core-api/src/plugins/index.ts @@ -1,7 +1,9 @@ import { commaArrayQuery } from "./comma-array-query"; import { dotSeparatedQuery } from "./dot-separated-query"; import { hapiAjv } from "./hapi-ajv"; +import { log } from "./log"; import { responseHeaders } from "./response-headers"; +import { semaphore } from "./semaphore"; import { whitelist } from "./whitelist"; export const preparePlugins = (config) => [ @@ -13,8 +15,16 @@ export const preparePlugins = (config) => [ }, }, { plugin: hapiAjv }, + { + plugin: log, + options: { + ...config.log, + trustProxy: config.trustProxy, + }, + }, { plugin: commaArrayQuery }, { plugin: dotSeparatedQuery }, + { plugin: semaphore, options: config.semaphore }, { plugin: require("./cache"), options: config.cache, diff --git a/packages/core-api/src/plugins/log.ts b/packages/core-api/src/plugins/log.ts new file mode 100644 index 0000000000..55caf27b69 --- /dev/null +++ b/packages/core-api/src/plugins/log.ts @@ -0,0 +1,33 @@ +import { Container, Contracts } from "@arkecosystem/core-kernel"; +import Hapi from "@hapi/hapi"; + +import { getIp } from "../utils"; + +export const log = { + name: "log", + version: "1.0.0", + + register( + server: Hapi.Server, + options: { + enabled: boolean; + trustProxy: boolean; + }, + ): void { + if (!options.enabled) { + return; + } + + const logger = server.app.app.get(Container.Identifiers.LogService); + + server.ext("onRequest", (request: Hapi.Request, h: Hapi.ResponseToolkit) => { + logger.debug( + `API request on: "${request.path}" from: "${getIp(request, options.trustProxy)}" with query: "${ + request.url.search + }"`, + ); + + return h.continue; + }); + }, +}; diff --git a/packages/core-api/src/plugins/pagination/ext.ts b/packages/core-api/src/plugins/pagination/ext.ts index ff02438251..c03003ad38 100644 --- a/packages/core-api/src/plugins/pagination/ext.ts +++ b/packages/core-api/src/plugins/pagination/ext.ts @@ -2,7 +2,7 @@ import { Utils } from "@arkecosystem/core-kernel"; import Hoek from "@hapi/hoek"; -import Qs from "querystring"; +import qs from "qs"; export class Ext { private readonly routePathPrefix = "/api"; @@ -54,7 +54,8 @@ export class Ext { // strip prefix in baseUri, we want a "clean" relative path const baseUri = request.url.pathname.slice(this.routePathPrefix.length) + "?"; - const { query } = request; + const query = { ...request.query }; + delete query.orderBy; const currentPage = query.page; const currentLimit = query.limit; @@ -68,8 +69,14 @@ export class Ext { const getUri = (page: number | null): string | null => /* istanbul ignore next */ - // tslint:disable-next-line: no-null-keyword - page ? baseUri + Qs.stringify(Hoek.applyToDefaults({ ...query, ...request.orig.query }, { page })) : null; + page + ? baseUri + + qs.stringify(Hoek.applyToDefaults({ ...query, ...request.orig.query }, { page }), { + allowDots: true, + arrayFormat: "comma", + encode: false, + }) + : null; const newSource = { meta: { @@ -78,14 +85,10 @@ export class Ext { count: results.length, pageCount: pageCount, totalCount: totalCount ? totalCount : 0, - - // tslint:disable-next-line: no-null-keyword /* istanbul ignore next */ next: totalCount && currentPage < pageCount ? getUri(currentPage + 1) : null, previous: - // tslint:disable-next-line: no-null-keyword totalCount && currentPage > 1 && currentPage <= pageCount + 1 ? getUri(currentPage - 1) : null, - self: getUri(currentPage), first: getUri(1), last: getUri(pageCount), diff --git a/packages/core-api/src/plugins/rate-limit.ts b/packages/core-api/src/plugins/rate-limit.ts index 233b432bb9..fb718f0eed 100644 --- a/packages/core-api/src/plugins/rate-limit.ts +++ b/packages/core-api/src/plugins/rate-limit.ts @@ -47,10 +47,10 @@ export = { limiter: new RateLimiterMemory({ points: options.points, duration: options.duration }), whiteList: options.whitelist || ["*"], blackList: options.blacklist || [], - isWhite: (ip: string) => { + isWhiteListed: (ip: string) => { return isListed(ip, options.whitelist); }, - isBlack: (ip: string) => { + isBlackListed: (ip: string) => { return isListed(ip, options.blacklist); }, runActionAnyway: false, diff --git a/packages/core-api/src/plugins/semaphore.ts b/packages/core-api/src/plugins/semaphore.ts new file mode 100644 index 0000000000..c6b3779346 --- /dev/null +++ b/packages/core-api/src/plugins/semaphore.ts @@ -0,0 +1,221 @@ +import Boom from "@hapi/boom"; +import Hapi from "@hapi/hapi"; +import makeSemaphore, { Semaphore } from "semaphore"; + +type PluginOptions = { + enabled: boolean; + database: { + levelOne: LevelOneOptions; + levelTwo: LevelOptions; + }; + memory: { + levelOne: LevelOneOptions; + levelTwo: LevelOptions; + }; +}; + +type LevelOptions = { + concurrency: number; + queueLimit: number; +}; + +type LevelOneOptions = LevelOptions & { + maxOffset: number; +}; + +type QueryLevelOptions = { + field: string; + asc: boolean; + desc: boolean; + allowSecondOrderBy: boolean; + diverse: boolean; +}; + +type SemaphoreOptions = { + enabled: boolean; + type: "database" | "memory"; + queryLevelOptions?: QueryLevelOptions[]; +}; + +type FullSemaphoreOptions = Required; + +enum Level { + One = 1, + Two = 2, +} + +export const semaphore = { + name: "onPreHandler", + version: "1.0.0", + register(server: Hapi.Server, pluginOptions: PluginOptions): void { + if (!pluginOptions.enabled) { + return; + } + + const semaphores = { database: new Map(), memory: new Map() }; + semaphores.database.set(Level.One, makeSemaphore(pluginOptions.database.levelOne.concurrency)); + semaphores.database.set(Level.Two, makeSemaphore(pluginOptions.database.levelTwo.concurrency)); + semaphores.memory.set(Level.One, makeSemaphore(pluginOptions.memory.levelOne.concurrency)); + semaphores.memory.set(Level.Two, makeSemaphore(pluginOptions.memory.levelTwo.concurrency)); + + const semaphoresConcurrency = { database: new Map(), memory: new Map() }; + semaphoresConcurrency.database.set(Level.One, pluginOptions.database.levelOne.concurrency); + semaphoresConcurrency.database.set(Level.Two, pluginOptions.database.levelTwo.concurrency); + semaphoresConcurrency.memory.set(Level.One, pluginOptions.memory.levelOne.concurrency); + semaphoresConcurrency.memory.set(Level.Two, pluginOptions.memory.levelTwo.concurrency); + + const semaphoresQueueLimit = { database: new Map(), memory: new Map() }; + semaphoresQueueLimit.database.set(Level.One, pluginOptions.database.levelOne.queueLimit); + semaphoresQueueLimit.database.set(Level.Two, pluginOptions.database.levelTwo.queueLimit); + semaphoresQueueLimit.memory.set(Level.One, pluginOptions.memory.levelOne.queueLimit); + semaphoresQueueLimit.memory.set(Level.Two, pluginOptions.memory.levelTwo.queueLimit); + + const requestLevels = new Map(); + + server.ext("onPreHandler", async (request: Hapi.Request, h: Hapi.ResponseToolkit) => { + const options = getRouteSemaphoreOptions(request); + + if (options.enabled) { + const level = getLevel(request, options); + const sem = semaphores[options.type].get(level)!; + + if ( + // @ts-ignore + sem.queue.length + (sem.current - semaphoresConcurrency[options.type].get(level)!) >= + semaphoresQueueLimit[options.type].get(level)! + ) { + return Boom.tooManyRequests(); + } + + requestLevels.set(request, level); + + await new Promise((resolve) => { + sem.take(() => { + resolve(); + }); + }); + } + + return h.continue; + }); + + server.events.on("response", (request: Hapi.Request) => { + const options = getRouteSemaphoreOptions(request); + + const level = requestLevels.get(request); + + if (level) { + requestLevels.delete(request); + const sem = semaphores[options.type].get(level)!; + + sem.leave(); + } + }); + + const isFullSemaphoreOptions = (b: SemaphoreOptions): b is FullSemaphoreOptions => { + return !!b.queryLevelOptions; + }; + + const getLevel = (request: Hapi.Request, options: SemaphoreOptions): Level => { + if (isFullSemaphoreOptions(options)) { + if (usesDiverseIndex(request, options)) { + return Level.One; + } + + const levels = [ + orderByLevel(request, options), + offsetLevel(request, options), + queryLevel(request, options), + ]; + + return levels.includes(Level.Two) ? Level.Two : Level.One; + } + + return offsetLevel(request, options); + }; + + const usesDiverseIndex = (request: Hapi.Request, options: FullSemaphoreOptions): boolean => { + const distributedIndices = options.queryLevelOptions + .filter((option) => option.diverse) + .map((option) => option.field); + + for (const key of Object.keys(request.query)) { + if (distributedIndices.includes(key) && ["number", "string"].includes(typeof request.query[key])) { + return true; + } + } + + return false; + }; + + const orderByLevel = (request: Hapi.Request, options: FullSemaphoreOptions): Level => { + if (request.query.orderBy && request.query.orderBy.length) { + const orderBy = Array.isArray(request.query.orderBy) ? request.query.orderBy : [request.query.orderBy]; + + const [field, sortOrder]: [string, "asc" | "desc"] = orderBy[0].split(":"); + + const fieldOptions = options.queryLevelOptions.find((options) => options.field === field); + + if (!fieldOptions) { + return Level.Two; + } + + if (!fieldOptions[sortOrder]) { + return Level.Two; + } + + if (!fieldOptions.allowSecondOrderBy && orderBy.length > 1) { + return Level.Two; + } + } + + return Level.One; + }; + + const offsetLevel = (request: Hapi.Request, options: SemaphoreOptions): Level => { + const offset = pluginOptions[options.type].levelOne.maxOffset; + + if (request.query.offset && request.query.offset > offset) { + return Level.Two; + } + + if (request.query.page && request.query.limit) { + if (request.query.page * request.query.limit > offset) { + return Level.Two; + } + } + + return Level.One; + }; + + const queryLevel = (request: Hapi.Request, options: FullSemaphoreOptions): Level => { + const reservedFields = ["page", "limit", "transform", "offset", "orderBy"]; + const indices = options.queryLevelOptions.map((options) => options.field); + + for (const key of Object.keys(request.query)) { + if (reservedFields.includes(key)) { + continue; + } + + if (!indices.includes(key)) { + return Level.Two; + } + } + + return Level.One; + }; + + const getRouteSemaphoreOptions = (request): SemaphoreOptions => { + const result: SemaphoreOptions = { + enabled: false, + type: "database", + }; + + if (request.route.settings.plugins.semaphore) { + return { ...result, ...request.route.settings.plugins.semaphore }; + } + + return result; + }; + }, +}; diff --git a/packages/core-api/src/resources-new/block.ts b/packages/core-api/src/resources-new/block.ts index 44a56c2b7c..0983b02054 100644 --- a/packages/core-api/src/resources-new/block.ts +++ b/packages/core-api/src/resources-new/block.ts @@ -1,5 +1,7 @@ import Joi from "joi"; +import * as Schemas from "../schemas"; + const blockHeightSchema = Joi.number().integer().min(1); const blockIdSchema = Joi.alternatives( Joi.string() @@ -30,3 +32,16 @@ export const blockCriteriaSchemaObject = { }; export const blockParamSchema = Joi.alternatives(blockIdSchema, blockHeightSchema); +export const blockSortingSchema = Schemas.createSortingSchema(Schemas.blockCriteriaSchemas, [], false); + +export const blockQueryLevelOptions = [ + { field: "version", asc: true, desc: true, allowSecondOrderBy: false, diverse: false }, + { field: "timestamp", asc: true, desc: true, allowSecondOrderBy: true, diverse: true }, + { field: "height", asc: true, desc: true, allowSecondOrderBy: true, diverse: true }, + { field: "numberOfTransactions", asc: true, desc: false, allowSecondOrderBy: false, diverse: false }, + { field: "totalAmount", asc: true, desc: false, allowSecondOrderBy: false, diverse: false }, + { field: "totalFee", asc: true, desc: false, allowSecondOrderBy: false, diverse: false }, + { field: "reward", asc: true, desc: true, allowSecondOrderBy: false, diverse: false }, + { field: "id", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, + { field: "previousBlock", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, +]; diff --git a/packages/core-api/src/resources-new/transaction.ts b/packages/core-api/src/resources-new/transaction.ts index 8b249606a5..fd488a91d8 100644 --- a/packages/core-api/src/resources-new/transaction.ts +++ b/packages/core-api/src/resources-new/transaction.ts @@ -1,5 +1,6 @@ import Joi from "joi"; +import * as Schemas from "../schemas"; import { walletCriteriaSchemaObject } from "./wallet"; export const transactionIdSchema = Joi.string().hex().length(64); @@ -17,3 +18,19 @@ export const transactionCriteriaSchemaObject = { }; export const transactionParamSchema = transactionIdSchema; +export const transactionSortingSchema = Schemas.createSortingSchema(Schemas.transactionCriteriaSchemas, [], false); + +export const transactionQueryLevelOptions = [ + { field: "version", asc: true, desc: true, allowSecondOrderBy: false, diverse: false }, + { field: "timestamp", asc: true, desc: true, allowSecondOrderBy: true, diverse: true }, + { field: "type", asc: true, desc: false, allowSecondOrderBy: false, diverse: false }, + { field: "amount", asc: true, desc: false, allowSecondOrderBy: false, diverse: false }, + { field: "fee", asc: true, desc: false, allowSecondOrderBy: false, diverse: false }, + { field: "typeGroup", asc: true, desc: true, allowSecondOrderBy: false, diverse: false }, + { field: "nonce", asc: true, desc: true, allowSecondOrderBy: false, diverse: false }, + { field: "id", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, + { field: "blockId", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, + { field: "senderPublicKey", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, + { field: "recipientId", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, + { field: "address", asc: false, desc: false, allowSecondOrderBy: false, diverse: true }, +]; diff --git a/packages/core-api/src/resources/transaction.ts b/packages/core-api/src/resources/transaction.ts index 660b84ab02..f46037aa99 100644 --- a/packages/core-api/src/resources/transaction.ts +++ b/packages/core-api/src/resources/transaction.ts @@ -56,7 +56,7 @@ export class TransactionResource implements Resource { confirmations: 0, // ! resource.block ? lastBlock.data.height - resource.block.height + 1 : 0 timestamp: typeof resource.timestamp !== "undefined" ? AppUtils.formatTimestamp(resource.timestamp) : undefined, - nonce: resource.nonce!.toFixed(), + nonce: resource.nonce?.toFixed(), }; } } diff --git a/packages/core-api/src/routes/blocks.ts b/packages/core-api/src/routes/blocks.ts index 7ed626005f..b2500e0c77 100644 --- a/packages/core-api/src/routes/blocks.ts +++ b/packages/core-api/src/routes/blocks.ts @@ -2,6 +2,7 @@ import Hapi from "@hapi/hapi"; import Joi from "joi"; import { BlocksController } from "../controllers/blocks"; +import { blockQueryLevelOptions, blockSortingSchema, transactionSortingSchema } from "../resources-new"; import * as Schemas from "../schemas"; export const register = (server: Hapi.Server): void => { @@ -18,9 +19,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.blockCriteriaSchemas, orderBy: server.app.schemas.blocksOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(blockSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: blockQueryLevelOptions, + }, pagination: { enabled: true, }, @@ -67,6 +75,12 @@ export const register = (server: Hapi.Server): void => { transform: Joi.bool().default(true), }), }, + plugins: { + semaphore: { + enabled: true, + type: "database", + }, + }, }, }); @@ -83,9 +97,15 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + }, pagination: { enabled: true, }, diff --git a/packages/core-api/src/routes/delegates.ts b/packages/core-api/src/routes/delegates.ts index f6e0ad92ee..9937b5b4c8 100644 --- a/packages/core-api/src/routes/delegates.ts +++ b/packages/core-api/src/routes/delegates.ts @@ -3,6 +3,8 @@ import Joi from "joi"; import { DelegatesController } from "../controllers/delegates"; import { + blockQueryLevelOptions, + blockSortingSchema, delegateCriteriaSchema, delegateSortingSchema, walletCriteriaSchema, @@ -75,9 +77,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.blockCriteriaSchemas, orderBy: server.app.schemas.blocksOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(blockSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: blockQueryLevelOptions, + }, pagination: { enabled: true, }, diff --git a/packages/core-api/src/routes/locks.ts b/packages/core-api/src/routes/locks.ts index 5828abba73..f049a956ca 100644 --- a/packages/core-api/src/routes/locks.ts +++ b/packages/core-api/src/routes/locks.ts @@ -18,6 +18,10 @@ export const register = (server: Hapi.Server): void => { query: Joi.object().concat(lockCriteriaSchema).concat(lockSortingSchema).concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "memory", + }, pagination: { enabled: true }, }, }, @@ -50,6 +54,10 @@ export const register = (server: Hapi.Server): void => { }).required(), }, plugins: { + semaphore: { + enabled: true, + type: "database", + }, pagination: { enabled: true, }, diff --git a/packages/core-api/src/routes/node.ts b/packages/core-api/src/routes/node.ts index 36ec0b78ce..60ef9899b8 100644 --- a/packages/core-api/src/routes/node.ts +++ b/packages/core-api/src/routes/node.ts @@ -41,6 +41,12 @@ export const register = (server: Hapi.Server): void => { days: Joi.number().integer().min(1).max(30), }), }, + plugins: { + semaphore: { + enabled: true, + type: "database", + }, + }, }, }); }; diff --git a/packages/core-api/src/routes/rounds.ts b/packages/core-api/src/routes/rounds.ts index 3d824c1895..705cc15642 100644 --- a/packages/core-api/src/routes/rounds.ts +++ b/packages/core-api/src/routes/rounds.ts @@ -17,6 +17,12 @@ export const register = (server: Hapi.Server): void => { id: Joi.number().integer().min(1), }), }, + plugins: { + semaphore: { + enabled: true, + type: "database", + }, + }, }, }); }; diff --git a/packages/core-api/src/routes/transactions.ts b/packages/core-api/src/routes/transactions.ts index fd5e34f72c..5285049489 100644 --- a/packages/core-api/src/routes/transactions.ts +++ b/packages/core-api/src/routes/transactions.ts @@ -3,6 +3,7 @@ import Hapi from "@hapi/hapi"; import Joi from "joi"; import { TransactionsController } from "../controllers/transactions"; +import { transactionQueryLevelOptions, transactionSortingSchema } from "../resources-new"; import * as Schemas from "../schemas"; export const register = (server: Hapi.Server): void => { @@ -19,9 +20,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: transactionQueryLevelOptions, + }, pagination: { enabled: true, }, @@ -72,6 +80,12 @@ export const register = (server: Hapi.Server): void => { transform: Joi.bool().default(true), }), }, + plugins: { + semaphore: { + enabled: true, + type: "database", + }, + }, }, }); diff --git a/packages/core-api/src/routes/votes.ts b/packages/core-api/src/routes/votes.ts index b33b2cf592..5dab045815 100644 --- a/packages/core-api/src/routes/votes.ts +++ b/packages/core-api/src/routes/votes.ts @@ -2,6 +2,7 @@ import Hapi from "@hapi/hapi"; import Joi from "joi"; import { VotesController } from "../controllers/votes"; +import { transactionQueryLevelOptions, transactionSortingSchema } from "../resources-new"; import * as Schemas from "../schemas"; export const register = (server: Hapi.Server): void => { @@ -18,9 +19,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: transactionQueryLevelOptions, + }, pagination: { enabled: true, }, @@ -41,6 +49,12 @@ export const register = (server: Hapi.Server): void => { transform: Joi.bool().default(true), }), }, + plugins: { + semaphore: { + enabled: true, + type: "database", + }, + }, }, }); }; diff --git a/packages/core-api/src/routes/wallets.ts b/packages/core-api/src/routes/wallets.ts index a2ca9cdbb0..45691eccb3 100644 --- a/packages/core-api/src/routes/wallets.ts +++ b/packages/core-api/src/routes/wallets.ts @@ -5,6 +5,8 @@ import { WalletsController } from "../controllers/wallets"; import { lockCriteriaSchema, lockSortingSchema, + transactionQueryLevelOptions, + transactionSortingSchema, walletCriteriaSchema, walletParamSchema, walletSortingSchema, @@ -24,6 +26,10 @@ export const register = (server: Hapi.Server): void => { query: Joi.object().concat(walletCriteriaSchema).concat(walletSortingSchema).concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "memory", + }, pagination: { enabled: true }, }, }, @@ -38,6 +44,10 @@ export const register = (server: Hapi.Server): void => { query: Joi.object().concat(walletCriteriaSchema).concat(walletSortingSchema).concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "memory", + }, pagination: { enabled: true }, }, }, @@ -68,6 +78,10 @@ export const register = (server: Hapi.Server): void => { query: Joi.object().concat(lockCriteriaSchema).concat(lockSortingSchema).concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "memory", + }, pagination: { enabled: true }, }, }, @@ -86,9 +100,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: transactionQueryLevelOptions, + }, pagination: { enabled: true, }, @@ -109,9 +130,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: transactionQueryLevelOptions, + }, pagination: { enabled: true, }, @@ -132,9 +160,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: transactionQueryLevelOptions, + }, pagination: { enabled: true, }, @@ -155,9 +190,16 @@ export const register = (server: Hapi.Server): void => { ...server.app.schemas.transactionCriteriaSchemas, orderBy: server.app.schemas.transactionsOrderBy, transform: Joi.bool().default(true), - }).concat(Schemas.pagination), + }) + .concat(transactionSortingSchema) + .concat(Schemas.pagination), }, plugins: { + semaphore: { + enabled: true, + type: "database", + queryLevelOptions: transactionQueryLevelOptions, + }, pagination: { enabled: true, }, diff --git a/packages/core-api/src/schemas.ts b/packages/core-api/src/schemas.ts index ea6a3ca2e4..ab3833c72e 100644 --- a/packages/core-api/src/schemas.ts +++ b/packages/core-api/src/schemas.ts @@ -44,7 +44,11 @@ export const createRangeCriteriaSchema = (item: Joi.Schema): Joi.Schema => { // Sorting -export const createSortingSchema = (schemaObject: SchemaObject, wildcardPaths: string[] = []): Joi.ObjectSchema => { +export const createSortingSchema = ( + schemaObject: SchemaObject, + wildcardPaths: string[] = [], + transform: boolean = true, +): Joi.ObjectSchema => { const getObjectPaths = (object: SchemaObject): string[] => { return Object.entries(object) .map(([key, value]) => { @@ -55,15 +59,17 @@ export const createSortingSchema = (schemaObject: SchemaObject, wildcardPaths: s const exactPaths = getObjectPaths(schemaObject); - return Joi.object({ - orderBy: Joi.custom((value, helpers) => { - if (value === "") { - return []; - } + const orderBy = Joi.custom((value, helpers) => { + if (value === "") { + return []; + } + + const sorting: Contracts.Search.Sorting = []; - const sorting: Contracts.Search.Sorting = []; + const sortingCriteria: string[] = Array.isArray(value) ? value : [value]; - for (const item of value.split(",")) { + for (const criteria of sortingCriteria) { + for (const item of criteria.split(",")) { const pair = item.split(":"); const property = String(pair[0]); const direction = pair.length === 1 ? "asc" : pair[1]; @@ -80,12 +86,24 @@ export const createSortingSchema = (schemaObject: SchemaObject, wildcardPaths: s }); } - sorting.push({ property, direction: direction as "asc" | "desc" }); + if (transform) { + sorting.push({ property, direction: direction as "asc" | "desc" }); + } } + } - return sorting; - }).default([]), + if (!transform) { + return value; + } + + return sorting; }); + + if (transform) { + return Joi.object({ orderBy: orderBy.default([]) }); + } else { + return Joi.object({ orderBy }); + } }; // Pagination diff --git a/packages/core-api/src/server.ts b/packages/core-api/src/server.ts index 4b4926f3ff..df0a6f0bd9 100644 --- a/packages/core-api/src/server.ts +++ b/packages/core-api/src/server.ts @@ -73,13 +73,20 @@ export class Server { this.server.app.app = this.app; this.server.app.schemas = Schemas; + this.server.ext("onRequest", (request, h) => { + request.raw.res.on("finish", () => { + request.raw.req.socket?.destroy(); + }); + return h.continue; + }); + this.server.ext("onPreHandler", (request, h) => { request.headers["content-type"] = "application/json"; return h.continue; }); this.server.ext("onPreResponse", (request, h) => { - if (request.response.isBoom && request.response.isServer) { + if (request.response.isBoom && request.response.isServer && request.response.name !== "QueryFailedError") { this.logger.error(request.response.stack); } return h.continue; diff --git a/packages/core-api/src/service-provider.ts b/packages/core-api/src/service-provider.ts index 2be2db1cdc..f5e5cf9240 100644 --- a/packages/core-api/src/service-provider.ts +++ b/packages/core-api/src/service-provider.ts @@ -61,11 +61,39 @@ export class ServiceProvider extends Providers.ServiceProvider { }).required(), }).required(), plugins: Joi.object({ + log: Joi.object({ + enabled: Joi.bool().required(), + }).required(), cache: Joi.object({ enabled: Joi.bool().required(), stdTTL: Joi.number().integer().min(0).required(), checkperiod: Joi.number().integer().min(0).required(), }).required(), + semaphore: Joi.object({ + enabled: Joi.bool().required(), + database: Joi.object({ + levelOne: Joi.object({ + concurrency: Joi.number().integer().min(0).required(), + queueLimit: Joi.number().integer().min(0).required(), + maxOffset: Joi.number().integer().min(0).required(), + }).required(), + levelTwo: Joi.object({ + concurrency: Joi.number().integer().min(0).required(), + queueLimit: Joi.number().integer().min(0).required(), + }).required(), + }).required(), + memory: Joi.object({ + levelOne: Joi.object({ + concurrency: Joi.number().integer().min(0).required(), + queueLimit: Joi.number().integer().min(0).required(), + maxOffset: Joi.number().integer().min(0).required(), + }).required(), + levelTwo: Joi.object({ + concurrency: Joi.number().integer().min(0).required(), + queueLimit: Joi.number().integer().min(0).required(), + }).required(), + }).required(), + }).required(), rateLimit: Joi.object({ enabled: Joi.bool().required(), points: Joi.number().integer().min(0).required(), diff --git a/packages/core-api/src/services/delegate-search-service.ts b/packages/core-api/src/services/delegate-search-service.ts index 9f66b32c71..06bf5a0c91 100644 --- a/packages/core-api/src/services/delegate-search-service.ts +++ b/packages/core-api/src/services/delegate-search-service.ts @@ -8,6 +8,9 @@ export class DelegateSearchService { @Container.tagged("state", "blockchain") private readonly walletRepository!: Contracts.State.WalletRepository; + @Container.inject(Container.Identifiers.StateStore) + private readonly stateStore!: Contracts.State.StateStore; + @Container.inject(Container.Identifiers.StandardCriteriaService) private readonly standardCriteriaService!: Services.Search.StandardCriteriaService; @@ -24,12 +27,12 @@ export class DelegateSearchService { } } - public getDelegatesPage( + public async getDelegatesPage( pagination: Contracts.Search.Pagination, sorting: Contracts.Search.Sorting, ...criterias: DelegateCriteria[] - ): Contracts.Search.ResultsPage { - sorting = [...sorting, { property: "rank", direction: "asc" }]; + ): Promise> { + sorting = [...sorting, { property: "rank", direction: "asc" }, { property: "publicKey", direction: "asc" }]; return this.paginationService.getPage(pagination, sorting, this.getDelegates(...criterias)); } @@ -61,7 +64,10 @@ export class DelegateSearchService { last: delegateLastBlock, }, production: { - approval: AppUtils.delegateCalculator.calculateApproval(wallet), + approval: AppUtils.delegateCalculator.calculateApproval( + wallet, + this.stateStore.getLastBlock().data.height, + ), }, forged: { fees: delegateAttribute.forgedFees, diff --git a/packages/core-api/src/services/lock-search-service.ts b/packages/core-api/src/services/lock-search-service.ts index 123ab3408a..dc9055aece 100644 --- a/packages/core-api/src/services/lock-search-service.ts +++ b/packages/core-api/src/services/lock-search-service.ts @@ -27,22 +27,22 @@ export class LockSearchService { } } - public getLocksPage( + public async getLocksPage( pagination: Contracts.Search.Pagination, sorting: Contracts.Search.Sorting, ...criterias: LockCriteria[] - ): Contracts.Search.ResultsPage { + ): Promise> { sorting = [...sorting, { property: "timestamp.unix", direction: "desc" }]; return this.paginationService.getPage(pagination, sorting, this.getLocks(...criterias)); } - public getWalletLocksPage( + public async getWalletLocksPage( pagination: Contracts.Search.Pagination, sorting: Contracts.Search.Sorting, walletAddress: string, ...criterias: LockCriteria[] - ): Contracts.Search.ResultsPage { + ): Promise> { sorting = [...sorting, { property: "timestamp.unix", direction: "desc" }]; return this.paginationService.getPage(pagination, sorting, this.getWalletLocks(walletAddress, ...criterias)); diff --git a/packages/core-api/src/services/wallet-search-service.ts b/packages/core-api/src/services/wallet-search-service.ts index 96afd63074..3a4d313d2f 100644 --- a/packages/core-api/src/services/wallet-search-service.ts +++ b/packages/core-api/src/services/wallet-search-service.ts @@ -36,21 +36,21 @@ export class WalletSearchService { } } - public getWalletsPage( + public async getWalletsPage( pagination: Contracts.Search.Pagination, sorting: Contracts.Search.Sorting, ...criterias: WalletCriteria[] - ): Contracts.Search.ResultsPage { + ): Promise> { sorting = [...sorting, { property: "balance", direction: "desc" }]; return this.paginationService.getPage(pagination, sorting, this.getWallets(...criterias)); } - public getActiveWalletsPage( + public async getActiveWalletsPage( pagination: Contracts.Search.Pagination, sorting: Contracts.Search.Sorting, ...criterias: WalletCriteria[] - ): Contracts.Search.ResultsPage { + ): Promise> { sorting = [...sorting, { property: "balance", direction: "desc" }]; return this.paginationService.getPage(pagination, sorting, this.getActiveWallets(...criterias)); diff --git a/packages/core-blockchain/package.json b/packages/core-blockchain/package.json index 64973c54c5..d15f73f0cb 100644 --- a/packages/core-blockchain/package.json +++ b/packages/core-blockchain/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-blockchain", - "version": "3.0.6", + "version": "3.12.0", "description": "Blockchain Manager for ARK Core", "license": "MIT", "contributors": [ @@ -23,16 +23,13 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-state": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "joi": "17.4.2", - "xstate": "4.23.4" - }, - "devDependencies": { - "@types/async": "3.2.7" + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-state": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "joi": "17.12.1", + "xstate": "4.38.3" }, "engines": { "node": ">=10.x" diff --git a/packages/core-blockchain/src/blockchain.ts b/packages/core-blockchain/src/blockchain.ts index 5ee33c6e56..fff6115e31 100644 --- a/packages/core-blockchain/src/blockchain.ts +++ b/packages/core-blockchain/src/blockchain.ts @@ -27,6 +27,7 @@ export class Blockchain implements Contracts.Blockchain.Blockchain { private readonly database!: DatabaseService; @Container.inject(Container.Identifiers.DatabaseBlockRepository) + @Container.tagged("connection", "default") private readonly blockRepository!: Repositories.BlockRepository; @Container.inject(Container.Identifiers.TransactionPoolService) @@ -160,9 +161,12 @@ export class Blockchain implements Contracts.Blockchain.Blockchain { * Set wakeup timeout to check the network for new blocks. */ public setWakeUp(): void { - this.stateStore.setWakeUpTimeout(() => { - this.dispatch("WAKEUP"); - }, 60000); + this.stateStore.setWakeUpTimeout( + () => { + this.dispatch("WAKEUP"); + }, + this.configuration.getRequired("fastSync") ? 8000 : 60000, + ); } /** @@ -436,8 +440,11 @@ export class Blockchain implements Contracts.Blockchain.Blockchain { block = block || this.getLastBlock().data; + const blockCount = this.configuration.getRequired("fastSync") ? 1 : 3; + return ( - Crypto.Slots.getTime() - block.timestamp < 3 * Managers.configManager.getMilestone(block.height).blocktime + Crypto.Slots.getTime() - block.timestamp < + blockCount * Managers.configManager.getMilestone(block.height).blocktime ); } diff --git a/packages/core-blockchain/src/defaults.ts b/packages/core-blockchain/src/defaults.ts index d61c4d7989..64209d2dc7 100644 --- a/packages/core-blockchain/src/defaults.ts +++ b/packages/core-blockchain/src/defaults.ts @@ -1,4 +1,5 @@ export const defaults = { + fastSync: !!process.env.CORE_BLOCKCHAIN_FAST_SYNC, // Improves sync rate for readonly nodes, that have a p2p port closed to public. Such node doesn't broadcast data databaseRollback: { maxBlockRewind: 10000, steps: 1000, diff --git a/packages/core-blockchain/src/process-blocks-job.ts b/packages/core-blockchain/src/process-blocks-job.ts index b483dc68e8..868c228846 100644 --- a/packages/core-blockchain/src/process-blocks-job.ts +++ b/packages/core-blockchain/src/process-blocks-job.ts @@ -25,6 +25,7 @@ export class ProcessBlocksJob implements Contracts.Kernel.QueueJob { private readonly database!: DatabaseService; @Container.inject(Container.Identifiers.DatabaseBlockRepository) + @Container.tagged("connection", "default") private readonly blockRepository!: Repositories.BlockRepository; @Container.inject(Container.Identifiers.DatabaseInteraction) @@ -33,6 +34,9 @@ export class ProcessBlocksJob implements Contracts.Kernel.QueueJob { @Container.inject(Container.Identifiers.PeerNetworkMonitor) private readonly networkMonitor!: Contracts.P2P.NetworkMonitor; + @Container.inject(Container.Identifiers.TransactionPoolService) + private readonly transactionPool!: Contracts.TransactionPool.Service; + @Container.inject(Container.Identifiers.TriggerService) private readonly triggers!: Services.Triggers.Triggers; @@ -174,6 +178,13 @@ export class ProcessBlocksJob implements Contracts.Kernel.QueueJob { this.blockchain.resetLastDownloadedBlock(); } + for (const block of acceptedBlocks) { + await this.transactionPool.applyBlock(block); + } + if (acceptedBlocks.length) { + await this.transactionPool.cleanUp(); + } + return; } diff --git a/packages/core-blockchain/src/processor/block-processor.ts b/packages/core-blockchain/src/processor/block-processor.ts index 5fdde32da9..29a6b26b94 100644 --- a/packages/core-blockchain/src/processor/block-processor.ts +++ b/packages/core-blockchain/src/processor/block-processor.ts @@ -35,6 +35,7 @@ export class BlockProcessor { private readonly blockchain!: Contracts.Blockchain.Blockchain; @Container.inject(Container.Identifiers.DatabaseTransactionRepository) + @Container.tagged("connection", "default") private readonly transactionRepository!: Repositories.TransactionRepository; @Container.inject(Container.Identifiers.WalletRepository) @@ -220,6 +221,25 @@ export class BlockProcessor { } private async validateGenerator(block: Interfaces.IBlock): Promise { + const walletRepository = this.app.getTagged( + Container.Identifiers.WalletRepository, + "state", + "blockchain", + ); + + if (!walletRepository.hasByPublicKey(block.data.generatorPublicKey)) { + return false; + } + + const generatorWallet: Contracts.State.Wallet = walletRepository.findByPublicKey(block.data.generatorPublicKey); + + let generatorUsername: string; + try { + generatorUsername = generatorWallet.getAttribute("delegate.username"); + } catch { + return false; + } + const blockTimeLookup = await AppUtils.forgingInfoCalculator.getBlockTimeLookup(this.app, block.data.height); const roundInfo: Contracts.Shared.RoundInfo = AppUtils.roundCalculator.calculateRound(block.data.height); @@ -235,20 +255,6 @@ export class BlockProcessor { const forgingDelegate: Contracts.State.Wallet = delegates[forgingInfo.currentForger]; - const walletRepository = this.app.getTagged( - Container.Identifiers.WalletRepository, - "state", - "blockchain", - ); - const generatorWallet: Contracts.State.Wallet = walletRepository.findByPublicKey(block.data.generatorPublicKey); - - let generatorUsername: string; - try { - generatorUsername = generatorWallet.getAttribute("delegate.username"); - } catch { - return false; - } - if (!forgingDelegate) { this.logger.debug( `Could not decide if delegate ${generatorUsername} (${ diff --git a/packages/core-blockchain/src/processor/handlers/accept-block-handler.ts b/packages/core-blockchain/src/processor/handlers/accept-block-handler.ts index e9695ff43c..78e9fac538 100644 --- a/packages/core-blockchain/src/processor/handlers/accept-block-handler.ts +++ b/packages/core-blockchain/src/processor/handlers/accept-block-handler.ts @@ -23,9 +23,6 @@ export class AcceptBlockHandler implements BlockHandler { @Container.inject(Container.Identifiers.DatabaseInteraction) private readonly databaseInteraction!: DatabaseInteraction; - @Container.inject(Container.Identifiers.TransactionPoolService) - private readonly transactionPool!: Contracts.TransactionPool.Service; - public async execute(block: Interfaces.IBlock): Promise { try { await this.databaseInteraction.applyBlock(block); @@ -37,10 +34,6 @@ export class AcceptBlockHandler implements BlockHandler { this.state.clearForkedBlock(); } - for (const transaction of block.transactions) { - await this.transactionPool.removeForgedTransaction(transaction); - } - // Reset wake-up timer after chaining a block, since there's no need to // wake up at all if blocks arrive periodically. Only wake up when there are // no new blocks. diff --git a/packages/core-blockchain/src/processor/handlers/revert-block-handler.ts b/packages/core-blockchain/src/processor/handlers/revert-block-handler.ts index 29792be195..ed1d143b80 100644 --- a/packages/core-blockchain/src/processor/handlers/revert-block-handler.ts +++ b/packages/core-blockchain/src/processor/handlers/revert-block-handler.ts @@ -20,18 +20,10 @@ export class RevertBlockHandler implements BlockHandler { @Container.inject(Container.Identifiers.DatabaseService) private readonly database!: DatabaseService; - @Container.inject(Container.Identifiers.TransactionPoolService) - private readonly transactionPool!: Contracts.TransactionPool.Service; - public async execute(block: Interfaces.IBlock): Promise { try { await this.databaseInteraction.revertBlock(block); - // TODO: Check if same situation applies to fork revert - for (const transaction of block.transactions) { - await this.transactionPool.addTransaction(transaction); - } - // Remove last block, take from DB if list is empty let previousBlock: Interfaces.IBlock | undefined = this.state .getLastBlocks() diff --git a/packages/core-blockchain/src/service-provider.ts b/packages/core-blockchain/src/service-provider.ts index 5698bc1166..91a5ce8fd3 100644 --- a/packages/core-blockchain/src/service-provider.ts +++ b/packages/core-blockchain/src/service-provider.ts @@ -29,6 +29,7 @@ export class ServiceProvider extends Providers.ServiceProvider { public configSchema(): object { return Joi.object({ + fastSync: Joi.bool().required(), databaseRollback: Joi.object({ maxBlockRewind: Joi.number().integer().min(1).required(), steps: Joi.number().integer().min(1).required(), diff --git a/packages/core-cli/package.json b/packages/core-cli/package.json index 8d5b452e8d..4e5286e63c 100644 --- a/packages/core-cli/package.json +++ b/packages/core-cli/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-cli", - "version": "3.0.6", + "version": "3.12.0", "description": "Core of the ARK Blockchain", "license": "MIT", "contributors": [ @@ -21,38 +21,40 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "@arkecosystem/utils": "1.3.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "@arkecosystem/utils": "1.3.1", "boxen": "4.2.0", "cli-table3": "0.6.0", - "dayjs": "1.10.7", + "dayjs": "1.11.10", "env-paths": "2.2.0", "envfile": "5.2.0", "execa": "3.4.0", "fast-levenshtein": "2.0.6", "fs-extra": "8.1.0", "glob": "7.1.7", + "got": "11.8.5", "inversify": "5.1.1", - "joi": "17.4.2", - "kleur": "4.0.0", + "joi": "17.12.1", + "kleur": "4.1.5", "latest-version": "5.1.0", "listr": "0.14.3", "nodejs-tail": "1.1.1", "ora": "4.1.1", "prompts": "2.4.0", "read-last-lines": "1.8.0", - "reflect-metadata": "0.1.13", - "semver": "6.3.0", + "reflect-metadata": "0.2.1", + "semver": "7.5.4", + "tar": "6.2.0", "type-fest": "0.21.3", - "yargs-parser": "20.2.9" + "yargs-parser": "21.1.1" }, "devDependencies": { "@types/fast-levenshtein": "0.0.2", "@types/fs-extra": "8.1.2", "@types/is-ci": "2.0.0", "@types/listr": "0.14.4", - "@types/semver": "6.2.3", + "@types/semver": "7.5.6", "@types/yargs-parser": "20.2.1" }, "engines": { diff --git a/packages/core-cli/src/application-factory.ts b/packages/core-cli/src/application-factory.ts index a74d071c34..6dfdb6ceca 100644 --- a/packages/core-cli/src/application-factory.ts +++ b/packages/core-cli/src/application-factory.ts @@ -46,7 +46,7 @@ import { import { Input, InputValidator } from "./input"; import { Container, Identifiers, interfaces } from "./ioc"; import { Output } from "./output"; -import { Config, Environment, Installer, Logger, ProcessManager, Updater } from "./services"; +import { Config, Environment, Installer, Logger, PluginManager, ProcessManager, Updater } from "./services"; import { Process } from "./utils"; export class ApplicationFactory { @@ -65,12 +65,13 @@ export class ApplicationFactory { app.bind(Identifiers.ComponentFactory).to(ComponentFactory).inSingletonScope(); app.bind(Identifiers.ProcessFactory).toFactory( - (context: interfaces.Context) => (token: string, type: string): Process => { - const process: Process = context.container.resolve(Process); - process.initialize(token, type); + (context: interfaces.Context) => + (token: string, type: string): Process => { + const process: Process = context.container.resolve(Process); + process.initialize(token, type); - return process; - }, + return process; + }, ); // Services @@ -84,6 +85,8 @@ export class ApplicationFactory { app.bind(Identifiers.ProcessManager).to(ProcessManager).inSingletonScope(); + app.bind(Identifiers.PluginManager).to(PluginManager).inSingletonScope(); + app.bind(Identifiers.Installer).to(Installer).inSingletonScope(); app.bind(Identifiers.Environment).to(Environment).inSingletonScope(); diff --git a/packages/core-cli/src/commands/command.ts b/packages/core-cli/src/commands/command.ts index 36446405ce..800030cf2b 100644 --- a/packages/core-cli/src/commands/command.ts +++ b/packages/core-cli/src/commands/command.ts @@ -326,5 +326,5 @@ export abstract class Command { * @returns {Promise} * @memberof Command */ - public abstract async execute(): Promise; + public abstract execute(): Promise; } diff --git a/packages/core-cli/src/commands/discover-plugins.ts b/packages/core-cli/src/commands/discover-plugins.ts deleted file mode 100644 index 5392be47b9..0000000000 --- a/packages/core-cli/src/commands/discover-plugins.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { readJSONSync } from "fs-extra"; -import { join } from "path"; -import glob from "glob"; - -import { injectable } from "../ioc"; - -interface Plugin { - path: string; - name: string; - version: string; -} - -/** - * @export - * @class DiscoverPlugins - */ -@injectable() -export class DiscoverPlugins { - /** - * @returns {Promise} - * @memberof DiscoverPlugins - * @param path - */ - public async discover(path: string): Promise { - const plugins: Plugin[] = []; - - const packagePaths = glob - .sync("{*/*/package.json,*/package.json}", { cwd: path }) - .map((packagePath) => join(path, packagePath).slice(0, -"/package.json".length)); - - for (let packagePath of packagePaths) { - const packageJson = readJSONSync(join(packagePath, "package.json")); - - plugins.push({ - path: packagePath, - name: packageJson.name, - version: packageJson.version, - }); - } - - return plugins; - } -} diff --git a/packages/core-cli/src/commands/index.ts b/packages/core-cli/src/commands/index.ts index 1c344c2afb..6f2fd27be2 100644 --- a/packages/core-cli/src/commands/index.ts +++ b/packages/core-cli/src/commands/index.ts @@ -3,4 +3,3 @@ export * from "./command"; export * from "./discover-commands"; export * from "./discover-config"; export * from "./discover-network"; -export * from "./discover-plugins"; diff --git a/packages/core-cli/src/contracts.ts b/packages/core-cli/src/contracts.ts index 106cb0a197..e144fc1a60 100644 --- a/packages/core-cli/src/contracts.ts +++ b/packages/core-cli/src/contracts.ts @@ -55,6 +55,22 @@ export interface Installer { installFromChannel(pkg: string, channel: string): void; } +export interface Plugin { + path: string; + name: string; + version: string; +} + +export interface PluginManager { + list(token: string, network: string): Promise; + + install(token: string, network: string, pkg: string, version?: string): Promise; + + update(token: string, network: string, pkg: string): Promise; + + remove(token: string, network: string, pkg: string): Promise; +} + export enum ProcessState { Online = "online", Stopped = "stopped", diff --git a/packages/core-cli/src/input/parser.ts b/packages/core-cli/src/input/parser.ts index 7d59df1ae4..b072375fe6 100644 --- a/packages/core-cli/src/input/parser.ts +++ b/packages/core-cli/src/input/parser.ts @@ -11,11 +11,13 @@ export class InputParser { * @returns * @memberof InputParser */ - public static parseArgv(args: string[]) { + public static parseArgv(args: string[]): { args: string[]; flags: yargs.Arguments } { const parsed: yargs.Arguments = yargs(args, { count: ["v"] }); - const argv: string[] = parsed._; + const argv = parsed._.map((argument) => argument.toString()); + + // @ts-ignore delete parsed._; return { args: argv, flags: parsed }; diff --git a/packages/core-cli/src/ioc/identifiers.ts b/packages/core-cli/src/ioc/identifiers.ts index a054350d3e..c1677fb42a 100644 --- a/packages/core-cli/src/ioc/identifiers.ts +++ b/packages/core-cli/src/ioc/identifiers.ts @@ -11,6 +11,7 @@ export const Identifiers = { Output: Symbol.for("Output"), Package: Symbol.for("Package"), ProcessManager: Symbol.for("ProcessManager"), + PluginManager: Symbol.for("PluginManager"), Updater: Symbol.for("Updater"), // Input InputValidator: Symbol.for("Input"), diff --git a/packages/core-cli/src/services/config.ts b/packages/core-cli/src/services/config.ts index 5f18981a36..6949e97def 100644 --- a/packages/core-cli/src/services/config.ts +++ b/packages/core-cli/src/services/config.ts @@ -148,7 +148,7 @@ export class Config { * @memberof Config */ private getRegistryChannel(version: string): string { - const channels: string[] = ["next"]; + const channels: string[] = ["next", "rc"]; let channel = "latest"; for (const item of channels) { diff --git a/packages/core-cli/src/services/index.ts b/packages/core-cli/src/services/index.ts index a67807a6e9..5a7a94fc65 100644 --- a/packages/core-cli/src/services/index.ts +++ b/packages/core-cli/src/services/index.ts @@ -2,5 +2,6 @@ export * from "./config"; export * from "./environment"; export * from "./installer"; export * from "./logger"; +export * from "./plugin-manager"; export * from "./process-manager"; export * from "./updater"; diff --git a/packages/core-cli/src/services/installer.ts b/packages/core-cli/src/services/installer.ts index 528fd61173..d229314823 100644 --- a/packages/core-cli/src/services/installer.ts +++ b/packages/core-cli/src/services/installer.ts @@ -16,6 +16,12 @@ export class Installer { public install(pkg: string, tag: string = "latest"): void { this.installPeerDependencies(pkg, tag); + try { + sync(`rm -f "\`yarn global dir\`"/node_modules/better-sqlite3/build/Release/better_sqlite3.node`, { + shell: true, + }); + } catch {} + const { stdout, stderr, exitCode } = sync(`yarn global add ${pkg}@${tag} --force`, { shell: true }); if (exitCode !== 0) { diff --git a/packages/core-cli/src/services/plugin-manager.ts b/packages/core-cli/src/services/plugin-manager.ts new file mode 100644 index 0000000000..a8a35efb35 --- /dev/null +++ b/packages/core-cli/src/services/plugin-manager.ts @@ -0,0 +1,87 @@ +import { existsSync, readJSONSync, removeSync } from "fs-extra"; +import glob from "glob"; +import { join } from "path"; + +import * as Contracts from "../contracts"; +import { Identifiers, inject, injectable } from "../ioc"; +import { Environment } from "./environment"; +import { File, Git, NPM, Source } from "./source-providers"; + +@injectable() +export class PluginManager implements Contracts.PluginManager { + @inject(Identifiers.Environment) + private readonly environment!: Environment; + + public async list(token: string, network: string): Promise { + const plugins: Contracts.Plugin[] = []; + + const path = this.getPluginsPath(token, network); + + const packagePaths = glob + .sync("{@*/*/package.json,*/package.json}", { cwd: path }) + .map((packagePath) => join(path, packagePath).slice(0, -"/package.json".length)); + + for (const packagePath of packagePaths) { + const packageJson = readJSONSync(join(packagePath, "package.json")); + + plugins.push({ + path: packagePath, + name: packageJson.name, + version: packageJson.version, + }); + } + + return plugins; + } + + public async install(token: string, network: string, pkg: string, version?: string): Promise { + for (const Instance of [File, Git, NPM]) { + const source: Source = new Instance({ + data: this.getPluginsPath(token, network), + temp: this.getTempPath(token, network), + }); + + if (await source.exists(pkg, version)) { + return source.install(pkg, version); + } + } + + throw new Error(`The given package [${pkg}] is neither a git nor a npm package.`); + } + + public async update(token: string, network: string, pkg: string): Promise { + const paths = { + data: this.getPluginsPath(token, network), + temp: this.getTempPath(token, network), + }; + const directory: string = join(paths.data, pkg); + + if (!existsSync(directory)) { + throw new Error(`The package [${pkg}] does not exist.`); + } + + if (existsSync(`${directory}/.git`)) { + return new Git(paths).update(pkg); + } + + return new NPM(paths).update(pkg); + } + + public async remove(token: string, network: string, pkg): Promise { + const directory: string = join(this.getPluginsPath(token, network), pkg); + + if (!existsSync(directory)) { + throw new Error(`The package [${pkg}] does not exist.`); + } + + removeSync(directory); + } + + private getPluginsPath(token: string, network: string): string { + return join(this.environment.getPaths(token, network).data, "plugins"); + } + + private getTempPath(token: string, network: string): string { + return join(this.environment.getPaths(token, network).temp, "plugins"); + } +} diff --git a/packages/core/src/source-providers/abstract-source.ts b/packages/core-cli/src/services/source-providers/abstract-source.ts similarity index 87% rename from packages/core/src/source-providers/abstract-source.ts rename to packages/core-cli/src/services/source-providers/abstract-source.ts index 50d655f97c..7eccff21ac 100644 --- a/packages/core/src/source-providers/abstract-source.ts +++ b/packages/core-cli/src/services/source-providers/abstract-source.ts @@ -57,9 +57,9 @@ export abstract class AbstractSource implements Source { removeSync(this.getDestPath(packageName)); } - public abstract async exists(value: string, version?: string): Promise; + public abstract exists(value: string, version?: string): Promise; - public abstract async update(value: string): Promise; + public abstract update(value: string): Promise; - protected abstract async preparePackage(value: string, version?: string): Promise; + protected abstract preparePackage(value: string, version?: string): Promise; } diff --git a/packages/core/src/source-providers/contracts.ts b/packages/core-cli/src/services/source-providers/contracts.ts similarity index 100% rename from packages/core/src/source-providers/contracts.ts rename to packages/core-cli/src/services/source-providers/contracts.ts diff --git a/packages/core/src/source-providers/errors.ts b/packages/core-cli/src/services/source-providers/errors.ts similarity index 100% rename from packages/core/src/source-providers/errors.ts rename to packages/core-cli/src/services/source-providers/errors.ts diff --git a/packages/core/src/source-providers/file.ts b/packages/core-cli/src/services/source-providers/file.ts similarity index 100% rename from packages/core/src/source-providers/file.ts rename to packages/core-cli/src/services/source-providers/file.ts diff --git a/packages/core/src/source-providers/git.ts b/packages/core-cli/src/services/source-providers/git.ts similarity index 100% rename from packages/core/src/source-providers/git.ts rename to packages/core-cli/src/services/source-providers/git.ts diff --git a/packages/core/src/source-providers/index.ts b/packages/core-cli/src/services/source-providers/index.ts similarity index 100% rename from packages/core/src/source-providers/index.ts rename to packages/core-cli/src/services/source-providers/index.ts diff --git a/packages/core/src/source-providers/npm.ts b/packages/core-cli/src/services/source-providers/npm.ts similarity index 100% rename from packages/core/src/source-providers/npm.ts rename to packages/core-cli/src/services/source-providers/npm.ts diff --git a/packages/core-database/package.json b/packages/core-database/package.json index d2adc6e446..f3d375e2cf 100644 --- a/packages/core-database/package.json +++ b/packages/core-database/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-database", - "version": "3.0.6", + "version": "3.12.0", "description": "Database Interface for ARK Core", "license": "MIT", "contributors": [ @@ -22,13 +22,13 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "@arkecosystem/utils": "1.3.0", - "dayjs": "1.10.7", - "joi": "17.4.2", - "pg": "8.7.1", - "reflect-metadata": "0.1.13", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "@arkecosystem/utils": "1.3.1", + "dayjs": "1.11.10", + "joi": "17.12.1", + "pg": "8.11.3", + "reflect-metadata": "0.2.1", "typeorm": "0.2.25" }, "engines": { diff --git a/packages/core-database/src/database-service.ts b/packages/core-database/src/database-service.ts index ded2b88196..1a0b4597cb 100644 --- a/packages/core-database/src/database-service.ts +++ b/packages/core-database/src/database-service.ts @@ -15,15 +15,19 @@ export class DatabaseService { private readonly app!: Contracts.Kernel.Application; @Container.inject(Container.Identifiers.DatabaseConnection) + @Container.tagged("connection", "default") private readonly connection!: Connection; @Container.inject(Container.Identifiers.DatabaseBlockRepository) + @Container.tagged("connection", "default") private readonly blockRepository!: BlockRepository; @Container.inject(Container.Identifiers.DatabaseTransactionRepository) + @Container.tagged("connection", "default") private readonly transactionRepository!: TransactionRepository; @Container.inject(Container.Identifiers.DatabaseRoundRepository) + @Container.tagged("connection", "default") private readonly roundRepository!: RoundRepository; @Container.inject(Container.Identifiers.LogService) @@ -37,6 +41,8 @@ export class DatabaseService { if (process.env.CORE_RESET_DATABASE) { await this.reset(); } + this.logger.info("Analyzing database"); + await this.analyze(); } catch (error) { this.logger.error(error.stack); this.app.terminate("Failed to initialize database service.", error); @@ -58,11 +64,15 @@ export class DatabaseService { await this.connection.query("TRUNCATE TABLE blocks, rounds, transactions RESTART IDENTITY;"); } + public async analyze(): Promise { + await this.connection.query("ANALYZE;"); + } + public async getBlock(id: string): Promise { // TODO: caching the last 1000 blocks, in combination with `saveBlock` could help to optimise - const block: Interfaces.IBlockData = ((await this.blockRepository.findOne( + const block: Interfaces.IBlockData = (await this.blockRepository.findOne( id, - )) as unknown) as Interfaces.IBlockData; + )) as unknown as Interfaces.IBlockData; if (!block) { return undefined; @@ -101,16 +111,16 @@ export class DatabaseService { // ! method is identical to getBlocks, but skips faster stateStore.getLastBlocksByHeight if (headersOnly) { - return (this.blockRepository.findByHeightRange(offset, offset + limit - 1) as unknown) as Promise< + return this.blockRepository.findByHeightRange(offset, offset + limit - 1) as unknown as Promise< Contracts.Shared.DownloadBlock[] >; } // TODO: fix types - return (this.blockRepository.findByHeightRangeWithTransactionsForDownload( + return this.blockRepository.findByHeightRangeWithTransactionsForDownload( offset, offset + limit - 1, - ) as unknown) as Promise; + ) as unknown as Promise; } public async findBlockByHeights(heights: number[]) { @@ -146,9 +156,9 @@ export class DatabaseService { public async getTopBlocks(count: number): Promise { // ! blockRepository.findTop returns blocks in reverse order // ! where recent block is first in array - const blocks: Interfaces.IBlockData[] = ((await this.blockRepository.findTop( + const blocks: Interfaces.IBlockData[] = (await this.blockRepository.findTop( count, - )) as unknown) as Interfaces.IBlockData[]; + )) as unknown as Interfaces.IBlockData[]; await this.loadTransactionsForBlocks(blocks); @@ -172,7 +182,7 @@ export class DatabaseService { } public async findBlockByID(ids: any[]): Promise { - return ((await this.blockRepository.findByIds(ids)) as unknown) as Interfaces.IBlockData[]; + return (await this.blockRepository.findByIds(ids)) as unknown as Interfaces.IBlockData[]; } public async findRecentBlocks(limit: number): Promise<{ id: string }[]> { @@ -279,9 +289,7 @@ export class DatabaseService { } } - private async getTransactionsForBlocks( - blocks: Interfaces.IBlockData[], - ): Promise< + private async getTransactionsForBlocks(blocks: Interfaces.IBlockData[]): Promise< Array<{ id: string; blockId: string; diff --git a/packages/core-database/src/defaults.ts b/packages/core-database/src/defaults.ts index 3cb8050073..7383ff427b 100644 --- a/packages/core-database/src/defaults.ts +++ b/packages/core-database/src/defaults.ts @@ -10,4 +10,5 @@ export const defaults = { synchronize: false, logging: false, }, + apiConnectionTimeout: 3000, }; diff --git a/packages/core-database/src/migrations/20220606000000-disable-fastupdate-on-gin-indexes.ts b/packages/core-database/src/migrations/20220606000000-disable-fastupdate-on-gin-indexes.ts new file mode 100644 index 0000000000..0c0c444d7a --- /dev/null +++ b/packages/core-database/src/migrations/20220606000000-disable-fastupdate-on-gin-indexes.ts @@ -0,0 +1,21 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class DisableFastupdateOnGinIndexes20220606000000 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + DROP INDEX IF EXISTS transactions_asset; + DROP INDEX IF EXISTS transactions_asset_payments; + CREATE INDEX transactions_asset ON transactions USING GIN(asset) WITH (fastupdate = off); + CREATE INDEX transactions_asset_payments ON transactions USING GIN ((asset->'payments')) WITH (fastupdate = off); + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + DROP INDEX IF EXISTS transactions_asset; + DROP INDEX IF EXISTS transactions_asset_payments; + CREATE INDEX transactions_asset ON transactions USING GIN(asset); + CREATE INDEX transactions_asset_payments ON transactions USING GIN ((asset->'payments')); + `); + } +} diff --git a/packages/core-database/src/service-provider.ts b/packages/core-database/src/service-provider.ts index 48ce24b005..2a7e200dca 100644 --- a/packages/core-database/src/service-provider.ts +++ b/packages/core-database/src/service-provider.ts @@ -1,6 +1,6 @@ import { Container, Contracts, Providers } from "@arkecosystem/core-kernel"; -import { Connection, createConnection, getCustomRepository } from "typeorm"; import Joi from "joi"; +import { Connection, createConnection, getCustomRepository } from "typeorm"; import { BlockFilter } from "./block-filter"; import { BlockHistoryService } from "./block-history-service"; @@ -19,19 +19,51 @@ export class ServiceProvider extends Providers.ServiceProvider { logger.info("Connecting to database: " + (this.config().all().connection as any).database); - this.app.bind(Container.Identifiers.DatabaseConnection).toConstantValue(await this.connect()); + this.app + .bind(Container.Identifiers.DatabaseConnection) + .toConstantValue(await this.connect()) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "default")); + this.app + .bind(Container.Identifiers.DatabaseConnection) + .toConstantValue( + await this.connect("api", { + options: `-c statement_timeout=${this.config().getRequired("apiConnectionTimeout")}ms`, + }), + ) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "api")); logger.debug("Connection established."); - this.app.bind(Container.Identifiers.DatabaseRoundRepository).toConstantValue(this.getRoundRepository()); + this.app + .bind(Container.Identifiers.DatabaseRoundRepository) + .toConstantValue(this.getRoundRepository()) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "default")); + this.app + .bind(Container.Identifiers.DatabaseRoundRepository) + .toConstantValue(this.getRoundRepository("api")) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "api")); + + this.app + .bind(Container.Identifiers.DatabaseBlockRepository) + .toConstantValue(this.getBlockRepository()) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "default")); + this.app + .bind(Container.Identifiers.DatabaseBlockRepository) + .toConstantValue(this.getBlockRepository("api")) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "api")); - this.app.bind(Container.Identifiers.DatabaseBlockRepository).toConstantValue(this.getBlockRepository()); this.app.bind(Container.Identifiers.DatabaseBlockFilter).to(BlockFilter); this.app.bind(Container.Identifiers.BlockHistoryService).to(BlockHistoryService); this.app .bind(Container.Identifiers.DatabaseTransactionRepository) - .toConstantValue(this.getTransactionRepository()); + .toConstantValue(this.getTransactionRepository()) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "default")); + this.app + .bind(Container.Identifiers.DatabaseTransactionRepository) + .toConstantValue(this.getTransactionRepository("api")) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("connection", "api")); + this.app.bind(Container.Identifiers.DatabaseTransactionFilter).to(TransactionFilter); this.app.bind(Container.Identifiers.TransactionHistoryService).to(TransactionHistoryService); @@ -52,7 +84,7 @@ export class ServiceProvider extends Providers.ServiceProvider { return true; } - public async connect(): Promise { + public async connect(connectionName = "default", extra = {}): Promise { const connection: Record = this.config().all().connection as any; this.app .get(Container.Identifiers.EventDispatcherService) @@ -65,24 +97,26 @@ export class ServiceProvider extends Providers.ServiceProvider { return createConnection({ ...(connection as any), + name: connectionName, namingStrategy: new SnakeNamingStrategy(), migrations: [__dirname + "/migrations/*.js"], - migrationsRun: true, + migrationsRun: connectionName === "default", + extra, // TODO: expose entities to allow extending the models by plugins entities: [__dirname + "/models/*.js"], }); } - public getRoundRepository(): RoundRepository { - return getCustomRepository(RoundRepository); + public getRoundRepository(connectionName = "default"): RoundRepository { + return getCustomRepository(RoundRepository, connectionName); } - public getBlockRepository(): BlockRepository { - return getCustomRepository(BlockRepository); + public getBlockRepository(connectionName = "default"): BlockRepository { + return getCustomRepository(BlockRepository, connectionName); } - public getTransactionRepository(): TransactionRepository { - return getCustomRepository(TransactionRepository); + public getTransactionRepository(connectionName = "default"): TransactionRepository { + return getCustomRepository(TransactionRepository, connectionName); } public configSchema(): object { @@ -98,6 +132,7 @@ export class ServiceProvider extends Providers.ServiceProvider { synchronize: Joi.bool().required(), logging: Joi.bool().required(), }).required(), + apiConnectionTimeout: Joi.number().integer().min(1).required(), }).unknown(true); } } diff --git a/packages/core-database/src/transaction-filter.ts b/packages/core-database/src/transaction-filter.ts index ef7c0e1c78..19d90adc9e 100644 --- a/packages/core-database/src/transaction-filter.ts +++ b/packages/core-database/src/transaction-filter.ts @@ -3,13 +3,8 @@ import { Enums } from "@arkecosystem/crypto"; import { Transaction } from "./models/transaction"; -const { - handleAndCriteria, - handleOrCriteria, - handleNumericCriteria, - optimizeExpression, - hasOrCriteria, -} = AppUtils.Search; +const { handleAndCriteria, handleOrCriteria, handleNumericCriteria, optimizeExpression, hasOrCriteria } = + AppUtils.Search; @Container.injectable() export class TransactionFilter implements Contracts.Database.TransactionFilter { @@ -82,7 +77,7 @@ export class TransactionFilter implements Contracts.Database.TransactionFilter { }); case "vendorField": return handleOrCriteria(criteria.vendorField!, async (c) => { - return { property: "vendorField", op: "like", pattern: c }; + return { property: "vendorField", op: "like", pattern: Buffer.from(c, "utf-8") }; }); case "amount": return handleOrCriteria(criteria.amount!, async (c) => { @@ -118,13 +113,15 @@ export class TransactionFilter implements Contracts.Database.TransactionFilter { private async handleSenderIdCriteria( criteria: Contracts.Search.EqualCriteria, ): Promise> { - const senderWallet = this.walletRepository.findByAddress(criteria); + if (this.walletRepository.hasByAddress(criteria)) { + const senderWallet = this.walletRepository.findByAddress(criteria); - if (senderWallet && senderWallet.getPublicKey()) { - return { op: "equal", property: "senderPublicKey", value: senderWallet.getPublicKey() }; - } else { - return { op: "false" }; + if (senderWallet.getPublicKey()) { + return { op: "equal", property: "senderPublicKey", value: senderWallet.getPublicKey() }; + } } + + return { op: "false" }; } private async handleRecipientIdCriteria( @@ -136,36 +133,16 @@ export class TransactionFilter implements Contracts.Database.TransactionFilter { value: criteria, }; - const multipaymentRecipientIdExpression: Contracts.Search.AndExpression = { - op: "and", - expressions: [ - { op: "equal", property: "typeGroup", value: Enums.TransactionTypeGroup.Core }, - { op: "equal", property: "type", value: Enums.TransactionType.MultiPayment }, - { op: "contains", property: "asset", value: { payments: [{ recipientId: criteria }] } }, - ], + const multipaymentRecipientIdExpression: Contracts.Search.ContainsExpression = { + op: "contains", + property: "asset", + value: { payments: [{ recipientId: criteria }] }, }; - const recipientWallet = this.walletRepository.findByAddress(criteria); - if (recipientWallet && recipientWallet.getPublicKey()) { - const delegateRegistrationExpression: Contracts.Search.AndExpression = { - op: "and", - expressions: [ - { op: "equal", property: "typeGroup", value: Enums.TransactionTypeGroup.Core }, - { op: "equal", property: "type", value: Enums.TransactionType.DelegateRegistration }, - { op: "equal", property: "senderPublicKey", value: recipientWallet.getPublicKey() }, - ], - }; - - return { - op: "or", - expressions: [recipientIdExpression, multipaymentRecipientIdExpression, delegateRegistrationExpression], - }; - } else { - return { - op: "or", - expressions: [recipientIdExpression, multipaymentRecipientIdExpression], - }; - } + return { + op: "or", + expressions: [recipientIdExpression, multipaymentRecipientIdExpression], + }; } private async handleAssetCriteria( diff --git a/packages/core-database/src/wallets-table-service.ts b/packages/core-database/src/wallets-table-service.ts index 2ef739b996..10c5e040f3 100644 --- a/packages/core-database/src/wallets-table-service.ts +++ b/packages/core-database/src/wallets-table-service.ts @@ -4,6 +4,7 @@ import { Connection } from "typeorm"; @Container.injectable() export class WalletsTableService implements Contracts.Database.WalletsTableService { @Container.inject(Container.Identifiers.DatabaseConnection) + @Container.tagged("connection", "default") private readonly connection!: Connection; public async flush(): Promise { @@ -38,7 +39,13 @@ export class WalletsTableService implements Contracts.Database.WalletsTableServi const batchWallets = wallets.slice(i, i + batchSize); const params = batchWallets - .map((w) => [w.getAddress(), w.getPublicKey(), w.getBalance().toFixed(), w.getNonce().toFixed(), w.getAttributes()]) + .map((w) => [ + w.getAddress(), + w.getPublicKey(), + w.getBalance().toFixed(), + w.getNonce().toFixed(), + w.getAttributes(), + ]) .flat(); const values = batchWallets diff --git a/packages/core-forger/package.json b/packages/core-forger/package.json index 74cf0b8f4a..2096838890 100644 --- a/packages/core-forger/package.json +++ b/packages/core-forger/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-forger", - "version": "3.0.6", + "version": "3.12.0", "description": "Forger for ARK Core", "license": "MIT", "contributors": [ @@ -22,16 +22,16 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-p2p": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "joi": "17.4.2", - "node-forge": "0.10.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-p2p": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "joi": "17.12.1", + "node-forge": "1.3.1", "wif": "2.0.6" }, "devDependencies": { - "@types/node-forge": "0.10.4", + "@types/node-forge": "1.3.11", "@types/wif": "2.0.2" }, "engines": { diff --git a/packages/core-kernel/package.json b/packages/core-kernel/package.json index c86c7b01c3..f9da7baae4 100644 --- a/packages/core-kernel/package.json +++ b/packages/core-kernel/package.json @@ -1,7 +1,7 @@ { "name": "@arkecosystem/core-kernel", "description": "Kernel of ARK Core", - "version": "3.0.6", + "version": "3.12.0", "contributors": [ "Brian Faust " ], @@ -21,35 +21,35 @@ "clean": "rimraf dist" }, "dependencies": { - "@arkecosystem/crypto": "3.0.6", - "@arkecosystem/utils": "1.3.0", - "@pm2/io": "4.3.5", + "@arkecosystem/crypto": "3.12.0", + "@arkecosystem/utils": "1.3.1", + "@pm2/io": "5.0.2", "chalk": "4.1.2", "cron": "1.8.2", - "dayjs": "1.10.7", - "deepmerge": "4.2.2", + "dayjs": "1.11.10", + "deepmerge": "4.3.1", "env-paths": "2.2.0", "fs-extra": "8.1.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.7", "import-fresh": "3.3.0", "inversify": "5.1.1", - "ipaddr.js": "2.0.1", - "joi": "17.4.2", + "ipaddr.js": "2.1.0", + "joi": "17.12.1", "log-process-errors": "5.1.2", "nanomatch": "1.2.13", - "nsfw": "2.1.2", - "reflect-metadata": "0.1.13", - "semver": "6.3.0", + "nsfw": "2.2.4", + "reflect-metadata": "0.2.1", + "semver": "7.5.4", "type-fest": "0.21.3" }, "devDependencies": { "@types/cron": "1.7.3", "@types/fs-extra": "8.1.2", - "@types/functional-red-black-tree": "1.0.1", + "@types/functional-red-black-tree": "1.0.6", "@types/got": "9.6.12", "@types/log-process-errors": "4.1.0", - "@types/semver": "6.2.3" + "@types/semver": "7.5.6" }, "publishConfig": { "access": "public" diff --git a/packages/core-kernel/src/contracts/index.ts b/packages/core-kernel/src/contracts/index.ts index 43d5205f14..3f1c7daccf 100644 --- a/packages/core-kernel/src/contracts/index.ts +++ b/packages/core-kernel/src/contracts/index.ts @@ -7,3 +7,4 @@ export * as Shared from "./shared"; export * as Snapshot from "./snapshot"; export * as State from "./state"; export * as TransactionPool from "./transaction-pool"; +export * as Transactions from "./transactions"; diff --git a/packages/core-kernel/src/contracts/kernel/log.ts b/packages/core-kernel/src/contracts/kernel/log.ts index f4c436b344..080866e892 100644 --- a/packages/core-kernel/src/contracts/kernel/log.ts +++ b/packages/core-kernel/src/contracts/kernel/log.ts @@ -96,6 +96,14 @@ export interface Logger { */ suppressConsoleOutput(suppress: boolean): void; + /** + * Dispose logger. + * + * @returns {Promise} + * @memberof Logger + */ + dispose(): Promise; + // /** // * @param {Record} levels // * @memberof Logger diff --git a/packages/core-kernel/src/contracts/p2p/peer-processor.ts b/packages/core-kernel/src/contracts/p2p/peer-processor.ts index 3ab104d18a..312da0eae0 100644 --- a/packages/core-kernel/src/contracts/p2p/peer-processor.ts +++ b/packages/core-kernel/src/contracts/p2p/peer-processor.ts @@ -1,5 +1,9 @@ import { Peer } from "./peer"; +export interface Headers { + version?: string; +} + export interface AcceptNewPeerOptions { seed?: boolean; lessVerbose?: boolean; @@ -8,7 +12,7 @@ export interface AcceptNewPeerOptions { export interface PeerProcessor { initialize(); - validateAndAcceptPeer(peer: Peer, options?: AcceptNewPeerOptions): Promise; + validateAndAcceptPeer(peer: Peer, headers: Headers, options?: AcceptNewPeerOptions): Promise; validatePeerIp(peer, options?: AcceptNewPeerOptions): boolean; diff --git a/packages/core-kernel/src/contracts/p2p/peer-verifier.ts b/packages/core-kernel/src/contracts/p2p/peer-verifier.ts index 40876e1931..d267a82e67 100644 --- a/packages/core-kernel/src/contracts/p2p/peer-verifier.ts +++ b/packages/core-kernel/src/contracts/p2p/peer-verifier.ts @@ -1,7 +1,9 @@ -import { Peer, PeerState, PeerVerificationResult } from "./peer"; +import { FastPeerVerificationResult, Peer, PeerState, PeerVerificationResult } from "./peer"; export interface PeerVerifier { initialize(peer: Peer); checkState(claimedState: PeerState, deadline: number): Promise; + + checkStateFast(claimedState: PeerState, deadline: number): Promise; } diff --git a/packages/core-kernel/src/contracts/p2p/peer.ts b/packages/core-kernel/src/contracts/p2p/peer.ts index 0617c04b27..1706e21e79 100644 --- a/packages/core-kernel/src/contracts/p2p/peer.ts +++ b/packages/core-kernel/src/contracts/p2p/peer.ts @@ -23,6 +23,7 @@ export interface Peer { lastPinged: Dayjs | undefined; sequentialErrorCounter: number; verificationResult: PeerVerificationResult | undefined; + fastVerificationResult: FastPeerVerificationResult | undefined; isVerified(): boolean; isForked(): boolean; @@ -74,3 +75,9 @@ export interface PeerVerificationResult { readonly highestCommonHeight: number; readonly forked: boolean; } + +export interface FastPeerVerificationResult { + readonly myHeight: number; + readonly hisHeight: number; + readonly forked: boolean; +} diff --git a/packages/core-kernel/src/contracts/transaction-pool/index.ts b/packages/core-kernel/src/contracts/transaction-pool/index.ts index 2189f24335..60ebb1cfb7 100644 --- a/packages/core-kernel/src/contracts/transaction-pool/index.ts +++ b/packages/core-kernel/src/contracts/transaction-pool/index.ts @@ -2,7 +2,8 @@ export * from "./collator"; export * from "./dynamic-fee-matcher"; export * from "./errors"; export * from "./expiration-service"; -export * from "./worker"; +export * from "./mempool-index-registry"; +export * from "./mempool-index"; export * from "./mempool"; export * from "./processor"; export * from "./query"; @@ -10,3 +11,4 @@ export * from "./sender-mempool"; export * from "./sender-state"; export * from "./service"; export * from "./storage"; +export * from "./worker"; diff --git a/packages/core-kernel/src/contracts/transaction-pool/mempool-index-registry.ts b/packages/core-kernel/src/contracts/transaction-pool/mempool-index-registry.ts new file mode 100644 index 0000000000..1efe855802 --- /dev/null +++ b/packages/core-kernel/src/contracts/transaction-pool/mempool-index-registry.ts @@ -0,0 +1,6 @@ +import { MempoolIndex } from "./mempool-index"; + +export interface MempoolIndexRegistry { + get(indexName: string): MempoolIndex; + clear(): void; +} diff --git a/packages/core-kernel/src/contracts/transaction-pool/mempool-index.ts b/packages/core-kernel/src/contracts/transaction-pool/mempool-index.ts new file mode 100644 index 0000000000..1e923a504d --- /dev/null +++ b/packages/core-kernel/src/contracts/transaction-pool/mempool-index.ts @@ -0,0 +1,9 @@ +import { Interfaces } from "@arkecosystem/crypto"; + +export interface MempoolIndex { + set(key: string, transaction: Interfaces.ITransaction): void; + has(key: string): boolean; + get(key: string): Interfaces.ITransaction; + forget(key: string): void; + clear(): void; +} diff --git a/packages/core-kernel/src/contracts/transaction-pool/mempool.ts b/packages/core-kernel/src/contracts/transaction-pool/mempool.ts index 757ba754b2..60dfe3b656 100644 --- a/packages/core-kernel/src/contracts/transaction-pool/mempool.ts +++ b/packages/core-kernel/src/contracts/transaction-pool/mempool.ts @@ -9,9 +9,9 @@ export interface Mempool { getSenderMempool(senderPublicKey: string): SenderMempool; getSenderMempools(): Iterable; + applyBlock(block: Interfaces.IBlock): Promise; addTransaction(transaction: Interfaces.ITransaction): Promise; removeTransaction(senderPublicKey: string, id: string): Promise; - removeForgedTransaction(senderPublicKey: string, id: string): Promise; flush(): void; } diff --git a/packages/core-kernel/src/contracts/transaction-pool/sender-mempool.ts b/packages/core-kernel/src/contracts/transaction-pool/sender-mempool.ts index 82373521b8..c7a7c9ea4c 100644 --- a/packages/core-kernel/src/contracts/transaction-pool/sender-mempool.ts +++ b/packages/core-kernel/src/contracts/transaction-pool/sender-mempool.ts @@ -9,7 +9,7 @@ export interface SenderMempool { addTransaction(transaction: Interfaces.ITransaction): Promise; removeTransaction(id: string): Promise; - removeForgedTransaction(id: string): Promise; + removeForgedTransaction(id: string): Promise; } export type SenderMempoolFactory = () => SenderMempool; diff --git a/packages/core-kernel/src/contracts/transaction-pool/service.ts b/packages/core-kernel/src/contracts/transaction-pool/service.ts index feaac83c4c..52d76aa40d 100644 --- a/packages/core-kernel/src/contracts/transaction-pool/service.ts +++ b/packages/core-kernel/src/contracts/transaction-pool/service.ts @@ -3,10 +3,10 @@ import { Interfaces } from "@arkecosystem/crypto"; export interface Service { getPoolSize(): number; + applyBlock(block: Interfaces.IBlock): Promise; addTransaction(transaction: Interfaces.ITransaction): Promise; readdTransactions(previouslyForgedTransactions?: Interfaces.ITransaction[]): Promise; removeTransaction(transaction: Interfaces.ITransaction): Promise; - removeForgedTransaction(transaction: Interfaces.ITransaction): Promise; cleanUp(): Promise; flush(): Promise; } diff --git a/packages/core-kernel/src/contracts/transaction-pool/worker.ts b/packages/core-kernel/src/contracts/transaction-pool/worker.ts index bdb38e1388..a52a7cf0b0 100644 --- a/packages/core-kernel/src/contracts/transaction-pool/worker.ts +++ b/packages/core-kernel/src/contracts/transaction-pool/worker.ts @@ -12,7 +12,7 @@ export interface WorkerScriptHandler { loadCryptoPackage(packageName: string): void; setConfig(networkConfig: any): void; setHeight(height: number): void; - getTransactionFromData(transactionData: Interfaces.ITransactionData | Buffer): Promise; + getTransactionFromData(transactionData: Interfaces.ITransactionData | string): Promise; } export type WorkerIpcSubprocess = IpcSubprocess; diff --git a/packages/core-kernel/src/contracts/transactions/index.ts b/packages/core-kernel/src/contracts/transactions/index.ts new file mode 100644 index 0000000000..b61ab99a2b --- /dev/null +++ b/packages/core-kernel/src/contracts/transactions/index.ts @@ -0,0 +1 @@ +export * from "./verification"; diff --git a/packages/core-kernel/src/contracts/transactions/verification.ts b/packages/core-kernel/src/contracts/transactions/verification.ts new file mode 100644 index 0000000000..1587bfce0a --- /dev/null +++ b/packages/core-kernel/src/contracts/transactions/verification.ts @@ -0,0 +1,16 @@ +import { Interfaces } from "@arkecosystem/crypto"; + +export interface SecondSignatureVerification { + verifySecondSignature(transaction: Interfaces.ITransactionData, publicKey: string): boolean; + + clear(transactionId: string): void; +} + +export interface MultiSignatureVerification { + verifySignatures( + transaction: Interfaces.ITransactionData, + multiSignatureAsset: Interfaces.IMultiSignatureAsset, + ): boolean; + + clear(transactionId: string): void; +} diff --git a/packages/core-kernel/src/ioc/identifiers.ts b/packages/core-kernel/src/ioc/identifiers.ts index 61f61519da..7f6c87a96d 100644 --- a/packages/core-kernel/src/ioc/identifiers.ts +++ b/packages/core-kernel/src/ioc/identifiers.ts @@ -104,6 +104,8 @@ export const Identifiers = { TransactionPoolService: Symbol.for("TransactionPool"), TransactionPoolCleaner: Symbol.for("TransactionPool"), TransactionPoolMempool: Symbol.for("TransactionPool"), + TransactionPoolMempoolIndex: Symbol.for("TransactionPool"), + TransactionPoolMempoolIndexRegistry: Symbol.for("TransactionPool"), TransactionPoolStorage: Symbol.for("TransactionPool"), TransactionPoolCollator: Symbol.for("TransactionPool"), TransactionPoolQuery: Symbol.for("TransactionPool"), @@ -128,6 +130,9 @@ export const Identifiers = { // Registries TransactionHandlerRegistry: Symbol.for("Registry"), TransactionHandlerProvider: Symbol.for("Provider"), + // Verification + TransactionSecondSignatureVerification: Symbol.for("Transaction"), + TransactionMultiSignatureVerification: Symbol.for("Transaction"), // Watcher WatcherEventListener: Symbol.for("Watcher"), diff --git a/packages/core-kernel/src/providers/service-provider.ts b/packages/core-kernel/src/providers/service-provider.ts index 5165baf6e4..c7e6f58fc6 100644 --- a/packages/core-kernel/src/providers/service-provider.ts +++ b/packages/core-kernel/src/providers/service-provider.ts @@ -228,5 +228,5 @@ export abstract class ServiceProvider { * @returns {Promise} * @memberof ServiceProvider */ - public abstract async register(): Promise; + public abstract register(): Promise; } diff --git a/packages/core-kernel/src/services/log/drivers/memory.ts b/packages/core-kernel/src/services/log/drivers/memory.ts index b0cbc57600..759a3da925 100644 --- a/packages/core-kernel/src/services/log/drivers/memory.ts +++ b/packages/core-kernel/src/services/log/drivers/memory.ts @@ -124,6 +124,14 @@ export class MemoryLogger implements Logger { this.silentConsole = suppress; } + /** + * Dispose logger. + * + * @returns {Promise} + * @memberof MemoryLogger + */ + public async dispose(): Promise {} + /** * @private * @param {*} level diff --git a/packages/core-kernel/src/services/log/drivers/null.ts b/packages/core-kernel/src/services/log/drivers/null.ts index 82ad41db03..9b45ea2ae0 100644 --- a/packages/core-kernel/src/services/log/drivers/null.ts +++ b/packages/core-kernel/src/services/log/drivers/null.ts @@ -83,4 +83,14 @@ export class NullLogger implements Logger { public suppressConsoleOutput(suppress: boolean): void { // } + + /** + * Dispose logger. + * + * @returns {Promise} + * @memberof NullLogger + */ + public async dispose(): Promise { + // + } } diff --git a/packages/core-kernel/src/services/search/pagination-service.ts b/packages/core-kernel/src/services/search/pagination-service.ts index 13fd1a1fdd..e50ec372b4 100644 --- a/packages/core-kernel/src/services/search/pagination-service.ts +++ b/packages/core-kernel/src/services/search/pagination-service.ts @@ -1,24 +1,23 @@ import { Utils } from "@arkecosystem/crypto"; +import createTree from "functional-red-black-tree"; import { Pagination, ResultsPage, Sorting } from "../../contracts/search"; import { injectable } from "../../ioc"; import { get } from "../../utils"; -import createTree from "functional-red-black-tree"; - @injectable() export class PaginationService { public getEmptyPage(): ResultsPage { return { results: [], totalCount: 0, meta: { totalCountIsEstimate: false } }; } - public getPage(pagination: Pagination, sorting: Sorting, items: Iterable): ResultsPage { + public async getPage(pagination: Pagination, sorting: Sorting, items: Iterable): Promise> { const all = Array.from(items); const results = sorting.length === 0 ? all.slice(pagination.offset, pagination.offset + pagination.limit) - : this.getTop(sorting, pagination.offset + pagination.limit, all).slice(pagination.offset); + : (await this.getTop(sorting, pagination.offset + pagination.limit, all)).slice(pagination.offset); return { results, @@ -27,7 +26,7 @@ export class PaginationService { }; } - public getTop(sorting: Sorting, count: number, items: Iterable): T[] { + public async getTop(sorting: Sorting, count: number, items: Iterable): Promise { if (count < 0) { throw new RangeError(`Count should be greater or equal than zero.`); } @@ -36,13 +35,24 @@ export class PaginationService { return []; } - let tree = createTree((a, b) => { + let tree = createTree<{ index: number; item: T }, undefined>((a, b) => { return this.compare(a, b, sorting); }); + let i = 0; for (const item of items) { - if (tree.length < count || this.compare(item, tree.end.key, sorting) === -1) { - tree = tree.insert(item, undefined); + if (i % 1000 === 0) { + await new Promise((resolve) => { + setImmediate(() => resolve()); + }); + } + + const key = { + index: i++, + item: item, + }; + if (tree.length < count || this.compare(key, tree.end.key!, sorting) === -1) { + tree = tree.insert(key, undefined); } if (tree.length > count) { @@ -50,19 +60,19 @@ export class PaginationService { } } - return tree.keys; + return tree.keys.map((key) => key.item); } - public compare(a: T, b: T, sorting: Sorting): number { + private compare(a: { index: number; item: T }, b: { index: number; item: T }, sorting: Sorting): number { for (const { property, direction } of sorting) { - let valueA = get(a, property); - let valueB = get(b, property); + let valueA = get(a.item, property); + let valueB = get(b.item, property); // undefined and null are always at the end regardless of direction - if (typeof valueA === "undefined" && typeof valueB === "undefined") return 0; + if (typeof valueA === "undefined" && typeof valueB === "undefined") continue; if (typeof valueA === "undefined" && typeof valueB !== "undefined") return 1; if (typeof valueA !== "undefined" && typeof valueB === "undefined") return -1; - if (valueA === null && valueB === null) return 0; + if (valueA === null && valueB === null) continue; if (valueA === null && valueB !== null) return 1; if (valueA !== null && valueB === null) return -1; @@ -94,6 +104,9 @@ export class PaginationService { } } + if (a.index < b.index) return -1; + if (a.index > b.index) return 1; + return 0; } } diff --git a/packages/core-kernel/src/services/triggers/action.ts b/packages/core-kernel/src/services/triggers/action.ts index 85f08a22a4..9648f90ff0 100644 --- a/packages/core-kernel/src/services/triggers/action.ts +++ b/packages/core-kernel/src/services/triggers/action.ts @@ -69,6 +69,6 @@ export abstract class Action { * @returns {T} * @memberof Action */ - public abstract async execute(args: ActionArguments): Promise; - public abstract async execute(args: ActionArguments): Promise; + public abstract execute(args: ActionArguments): Promise; + public abstract execute(args: ActionArguments): Promise; } diff --git a/packages/core-kernel/src/types/index.ts b/packages/core-kernel/src/types/index.ts index 4da62b1c4e..23df2cd63b 100644 --- a/packages/core-kernel/src/types/index.ts +++ b/packages/core-kernel/src/types/index.ts @@ -1,6 +1,6 @@ import { CacheStore, Pipeline, Queue } from "../contracts/kernel"; -export * from "type-fest"; +export type { Class, JsonObject, PackageJson, Primitive } from "type-fest"; export type KeyValuePair = Record; diff --git a/packages/core-logger-pino/package.json b/packages/core-logger-pino/package.json index 4b20e72a11..1832cf9446 100644 --- a/packages/core-logger-pino/package.json +++ b/packages/core-logger-pino/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-logger-pino", - "version": "3.0.6", + "version": "3.12.0", "description": "Webhooks for ARK Core", "license": "MIT", "contributors": [ @@ -20,15 +20,15 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", + "@arkecosystem/core-kernel": "3.12.0", "chalk": "4.1.2", - "joi": "17.4.2", - "pino": "6.13.2", - "pino-pretty": "4.8.0", + "joi": "17.12.1", + "pino": "8.7.0", + "pino-pretty": "9.1.1", "pump": "3.0.0", - "readable-stream": "3.6.0", - "rotating-file-stream": "2.1.5", - "split2": "3.2.2" + "pumpify": "2.0.1", + "rotating-file-stream": "3.2.1", + "split2": "4.2.0" }, "engines": { "node": ">=10.x" @@ -37,9 +37,8 @@ "access": "public" }, "devDependencies": { - "@types/pino": "6.3.11", - "@types/pump": "1.1.1", - "@types/readable-stream": "2.3.11", - "@types/split2": "2.1.6" + "@types/pump": "1.1.3", + "@types/pumpify": "1.4.4", + "@types/split2": "3.2.1" } } diff --git a/packages/core-logger-pino/src/driver.ts b/packages/core-logger-pino/src/driver.ts index 5d9ac7b8bb..388d5d295e 100644 --- a/packages/core-logger-pino/src/driver.ts +++ b/packages/core-logger-pino/src/driver.ts @@ -1,13 +1,13 @@ import { Container, Contracts, Utils } from "@arkecosystem/core-kernel"; import chalk, { Chalk } from "chalk"; import * as console from "console"; -import pino, { PrettyOptions } from "pino"; -import PinoPretty from "pino-pretty"; +import pino from "pino"; +import { prettyFactory, PrettyOptions } from "pino-pretty"; import pump from "pump"; -import { Transform } from "readable-stream"; +import Pumpify from "pumpify"; import { createStream } from "rotating-file-stream"; import split from "split2"; -import { PassThrough, Writable } from "stream"; +import { PassThrough, Transform, Writable } from "stream"; import { inspect } from "util"; /** @@ -44,12 +44,19 @@ export class PinoLogger implements Contracts.Kernel.Logger { debug: chalk.magenta, }; + /** + * @private + * @type {PassThrough} + * @memberof PinoLogger + */ + private stream!: PassThrough; + /** * @private * @type {Writable} * @memberof PinoLogger */ - private fileStream!: Writable; + private combinedFileStream?: Pumpify; /** * @private @@ -71,7 +78,7 @@ export class PinoLogger implements Contracts.Kernel.Logger { * @memberof PinoLogger */ public async make(options?: any): Promise { - const stream = new PassThrough(); + this.stream = new PassThrough(); this.logger = pino( { base: null, @@ -95,16 +102,13 @@ export class PinoLogger implements Contracts.Kernel.Logger { useOnlyCustomLevels: true, safe: true, }, - stream, + this.stream, ); - this.fileStream = this.getFileStream(options.fileRotator); - if (this.isValidLevel(options.levels.console)) { pump( - stream, + this.stream, split(), - // @ts-ignore - Object literal may only specify known properties, and 'colorize' does not exist in type 'PrettyOptions'. this.createPrettyTransport(options.levels.console, { colorize: true }), process.stdout, /* istanbul ignore next */ @@ -115,16 +119,17 @@ export class PinoLogger implements Contracts.Kernel.Logger { } if (this.isValidLevel(options.levels.file)) { - pump( - stream, + this.combinedFileStream = new Pumpify( split(), - // @ts-ignore - Object literal may only specify known properties, and 'colorize' does not exist in type 'PrettyOptions'. this.createPrettyTransport(options.levels.file, { colorize: false }), - this.fileStream, - (err) => { - console.error("File stream closed due to an error:", err); - }, + this.getFileStream(options.fileRotator), ); + + this.combinedFileStream.on("error", (err) => { + console.error("File stream closed due to an error:", err); + }); + + this.stream.pipe(this.combinedFileStream); } return this; @@ -202,6 +207,22 @@ export class PinoLogger implements Contracts.Kernel.Logger { this.silentConsole = suppress; } + public async dispose(): Promise { + if (this.combinedFileStream) { + this.stream.unpipe(this.combinedFileStream); + + if (!this.combinedFileStream.destroyed) { + this.combinedFileStream.end(); + + return new Promise((resolve) => { + this.combinedFileStream!.on("finish", () => { + resolve(); + }); + }); + } + } + } + /** * @param {string} level * @param {*} message @@ -227,12 +248,12 @@ export class PinoLogger implements Contracts.Kernel.Logger { /** * @private * @param {string} level - * @param {PrettyOptions} [prettyOptions] + * @param {any} [prettyOptions] * @returns {Transform} * @memberof PinoLogger */ private createPrettyTransport(level: string, prettyOptions?: PrettyOptions): Transform { - const pinoPretty = PinoPretty({ + const pinoPretty = prettyFactory({ ...{ levelFirst: false, translateTime: "yyyy-mm-dd HH:MM:ss.l", diff --git a/packages/core-logger-pino/src/service-provider.ts b/packages/core-logger-pino/src/service-provider.ts index 658c70bac0..41524c05bb 100644 --- a/packages/core-logger-pino/src/service-provider.ts +++ b/packages/core-logger-pino/src/service-provider.ts @@ -17,8 +17,7 @@ export class ServiceProvider extends Providers.ServiceProvider { } public async dispose(): Promise { - // todo: destroy console stream - // todo: destroy file stream + await this.app.get(Container.Identifiers.LogService).dispose(); } public configSchema(): object { diff --git a/packages/core-magistrate-api/package.json b/packages/core-magistrate-api/package.json index cf3109e548..d3e6a71acd 100644 --- a/packages/core-magistrate-api/package.json +++ b/packages/core-magistrate-api/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-magistrate-api", - "version": "3.0.6", + "version": "3.12.0", "description": "Magistrate API for ARK Core", "license": "MIT", "contributors": [ @@ -22,18 +22,17 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-api": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-magistrate-crypto": "3.0.6", - "@arkecosystem/core-magistrate-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6", + "@arkecosystem/core-api": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-magistrate-crypto": "3.12.0", + "@arkecosystem/core-magistrate-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0", "@hapi/boom": "9.1.4", "@hapi/hapi": "20.1.5", - "joi": "17.4.2" + "joi": "17.12.1" }, "devDependencies": { - "@types/hapi__boom": "7.4.1", - "@types/hapi__joi": "17.1.7" + "@types/hapi__boom": "7.4.1" }, "engines": { "node": ">=10.x" diff --git a/packages/core-magistrate-api/src/controllers/entities.ts b/packages/core-magistrate-api/src/controllers/entities.ts index 95e2bfedc2..e753a0d467 100644 --- a/packages/core-magistrate-api/src/controllers/entities.ts +++ b/packages/core-magistrate-api/src/controllers/entities.ts @@ -12,7 +12,7 @@ export class EntityController extends Controller { @Container.inject(Identifiers.EntitySearchService) private readonly entitySearchService!: EntitySearchService; - public index(request: Hapi.Request): Contracts.Search.ResultsPage { + public async index(request: Hapi.Request): Promise> { const pagination = this.getQueryPagination(request.query); const sorting = request.query.orderBy as Contracts.Search.Sorting; const criteria = this.getQueryCriteria(request.query, entityCriteriaSchemaObject) as EntityCriteria; diff --git a/packages/core-magistrate-api/src/services/entity-search-service.ts b/packages/core-magistrate-api/src/services/entity-search-service.ts index 6afaa3a248..281fc22274 100644 --- a/packages/core-magistrate-api/src/services/entity-search-service.ts +++ b/packages/core-magistrate-api/src/services/entity-search-service.ts @@ -24,11 +24,11 @@ export class EntitySearchService { } } - public getEntitiesPage( + public async getEntitiesPage( pagination: Contracts.Search.Pagination, sorting: Contracts.Search.Sorting, ...criterias: EntityCriteria[] - ): Contracts.Search.ResultsPage { + ): Promise> { sorting = [...sorting, { property: "data.name", direction: "asc" }]; return this.paginationService.getPage(pagination, sorting, this.getEntities(...criterias)); diff --git a/packages/core-magistrate-crypto/package.json b/packages/core-magistrate-crypto/package.json index 466076070d..3b120ba2aa 100644 --- a/packages/core-magistrate-crypto/package.json +++ b/packages/core-magistrate-crypto/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-magistrate-crypto", - "version": "3.0.6", + "version": "3.12.0", "description": "ARK transactions for businesses and bridgechains", "license": "MIT", "contributors": [ @@ -21,8 +21,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "bytebuffer": "5.0.1" + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/crypto": "3.12.0" } } diff --git a/packages/core-magistrate-crypto/src/transactions/bridgechain-registration.ts b/packages/core-magistrate-crypto/src/transactions/bridgechain-registration.ts index 2ef1a452f6..e263a5bd8d 100644 --- a/packages/core-magistrate-crypto/src/transactions/bridgechain-registration.ts +++ b/packages/core-magistrate-crypto/src/transactions/bridgechain-registration.ts @@ -1,6 +1,5 @@ import { Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { MagistrateTransactionGroup, MagistrateTransactionStaticFees, MagistrateTransactionType } from "../enums"; import { IBridgechainPorts, IBridgechainRegistrationAsset } from "../interfaces"; @@ -56,7 +55,7 @@ export class BridgechainRegistrationTransaction extends Transactions.Transaction }); } - public serialize(): ByteBuffer { + public serialize(): Utils.ByteBuffer { const { data } = this; AppUtils.assert.defined(data.asset?.bridgechainRegistration); @@ -111,79 +110,81 @@ export class BridgechainRegistrationTransaction extends Transactions.Transaction portsBuffersLength += portsLength; - const buffer: ByteBuffer = new ByteBuffer( - bridgechainNameBufferLength + - seedNodesBuffersLength + - bridgechainGenesisHash.length + - bridgechainRepositoryBufferLength + - bridgechainAssetRepositoryBufferLength + - portsBuffersLength, - true, + const buffer = new Utils.ByteBuffer( + Buffer.alloc( + 1 + + bridgechainNameBufferLength + + seedNodesBuffersLength + + bridgechainGenesisHash.length + + 1 + + bridgechainRepositoryBufferLength + + bridgechainAssetRepositoryBufferLength + + portsBuffersLength, + ), ); - buffer.writeUint8(bridgechainNameBufferLength); - buffer.append(bridgechainNameBuffer); + buffer.writeUInt8(bridgechainNameBufferLength); + buffer.writeBuffer(bridgechainNameBuffer); - buffer.writeUint8(seedNodesBuffers.length); + buffer.writeUInt8(seedNodesBuffers.length); for (const seedBuffer of seedNodesBuffers) { - buffer.writeUint8(seedBuffer.length); - buffer.append(seedBuffer); + buffer.writeUInt8(seedBuffer.length); + buffer.writeBuffer(seedBuffer); } - buffer.append(bridgechainGenesisHash); + buffer.writeBuffer(bridgechainGenesisHash); - buffer.writeUint8(bridgechainRepositoryBufferLength); - buffer.append(bridgechainRepositoryBuffer); + buffer.writeUInt8(bridgechainRepositoryBufferLength); + buffer.writeBuffer(bridgechainRepositoryBuffer); if (bridgechainAssetRepositoryBuffer) { - buffer.writeUint8(bridgechainAssetRepositoryBuffer.length); - buffer.append(bridgechainAssetRepositoryBuffer); + buffer.writeUInt8(bridgechainAssetRepositoryBuffer.length); + buffer.writeBuffer(bridgechainAssetRepositoryBuffer); } else { - buffer.writeUint8(0); + buffer.writeUInt8(0); } - buffer.writeUint8(portsLength); + buffer.writeUInt8(portsLength); for (const [i, nameBuffer] of portNamesBuffers.entries()) { - buffer.writeUint8(nameBuffer.length); - buffer.append(nameBuffer); - buffer.writeUint16(portNumbers[i]); + buffer.writeUInt8(nameBuffer.length); + buffer.writeBuffer(nameBuffer); + buffer.writeUInt16LE(portNumbers[i]); } return buffer; } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { const { data } = this; const seedNodes: string[] = []; - const nameLength: number = buf.readUint8(); - const name: string = buf.readString(nameLength); + const nameLength: number = buf.readUInt8(); + const name: string = buf.readBuffer(nameLength).toString("utf8"); - const seedNodesLength: number = buf.readUint8(); + const seedNodesLength: number = buf.readUInt8(); for (let i = 0; i < seedNodesLength; i++) { - const ipLength: number = buf.readUint8(); - const ip: string = buf.readString(ipLength); + const ipLength: number = buf.readUInt8(); + const ip: string = buf.readBuffer(ipLength).toString("utf8"); seedNodes.push(ip); } - const genesisHash: string = buf.readBytes(32).toString("hex"); - const repositoryLength: number = buf.readUint8(); - const bridgechainRepository: string = buf.readString(repositoryLength); + const genesisHash: string = buf.readBuffer(32).toString("hex"); + const repositoryLength: number = buf.readUInt8(); + const bridgechainRepository: string = buf.readBuffer(repositoryLength).toString("utf8"); let bridgechainAssetRepository: string | undefined = undefined; - const bridgechainAssetRepositoryLength: number = buf.readUint8(); + const bridgechainAssetRepositoryLength: number = buf.readUInt8(); if (bridgechainAssetRepositoryLength) { - bridgechainAssetRepository = buf.readString(bridgechainAssetRepositoryLength); + bridgechainAssetRepository = buf.readBuffer(bridgechainAssetRepositoryLength).toString("utf8"); } const ports: IBridgechainPorts = {}; - const portsLength: number = buf.readUint8(); + const portsLength: number = buf.readUInt8(); for (let i = 0; i < portsLength; i++) { - const nameLength: number = buf.readUint8(); - const name: string = buf.readString(nameLength); - const port: number = buf.readUint16(); - ports[name] = port; + const nameLength: number = buf.readUInt8(); + const name: string = buf.readBuffer(nameLength).toString("utf8"); + ports[name] = buf.readUInt16LE(); } data.asset = { diff --git a/packages/core-magistrate-crypto/src/transactions/bridgechain-resignation.ts b/packages/core-magistrate-crypto/src/transactions/bridgechain-resignation.ts index 278972e303..e5af9a19ac 100644 --- a/packages/core-magistrate-crypto/src/transactions/bridgechain-resignation.ts +++ b/packages/core-magistrate-crypto/src/transactions/bridgechain-resignation.ts @@ -1,6 +1,5 @@ import { Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { MagistrateTransactionGroup, MagistrateTransactionStaticFees, MagistrateTransactionType } from "../enums"; import { IBridgechainResignationAsset } from "../interfaces"; @@ -44,23 +43,23 @@ export class BridgechainResignationTransaction extends Transactions.Transaction }); } - public serialize(): ByteBuffer { + public serialize(): Utils.ByteBuffer { const { data } = this; AppUtils.assert.defined(data.asset?.bridgechainResignation); - const buffer: ByteBuffer = new ByteBuffer(32, true); - buffer.append(data.asset.bridgechainResignation.bridgechainId, "hex"); + const buffer = new Utils.ByteBuffer(Buffer.alloc(32)); + buffer.writeBuffer(Buffer.from(data.asset.bridgechainResignation.bridgechainId, "hex")); return buffer; } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { const { data } = this; data.asset = { bridgechainResignation: { - bridgechainId: buf.readBytes(32).toString("hex"), + bridgechainId: buf.readBuffer(32).toString("hex"), }, }; } diff --git a/packages/core-magistrate-crypto/src/transactions/bridgechain-update.ts b/packages/core-magistrate-crypto/src/transactions/bridgechain-update.ts index 1f639432e3..66534ebc5d 100644 --- a/packages/core-magistrate-crypto/src/transactions/bridgechain-update.ts +++ b/packages/core-magistrate-crypto/src/transactions/bridgechain-update.ts @@ -1,6 +1,5 @@ import { Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { MagistrateTransactionGroup, MagistrateTransactionStaticFees, MagistrateTransactionType } from "../enums"; import { IBridgechainPorts, IBridgechainUpdateAsset } from "../interfaces"; @@ -65,7 +64,7 @@ export class BridgechainUpdateTransaction extends Transactions.Transaction { }); } - public serialize(): ByteBuffer { + public serialize(): Utils.ByteBuffer { const { data } = this; AppUtils.assert.defined(data.asset?.bridgechainUpdate); @@ -124,90 +123,92 @@ export class BridgechainUpdateTransaction extends Transactions.Transaction { bridgechainAssetRepositoryBufferLength += bridgechainAssetRepositoryBuffer.length; } - const buffer: ByteBuffer = new ByteBuffer( - 32 + // bridgechain id - seedNodesBuffersLength + - portsBuffersLength + - bridgechainRepositoryBufferLength + - bridgechainAssetRepositoryBufferLength, - true, + const buffer = new Utils.ByteBuffer( + Buffer.alloc( + 32 + // bridgechain id + seedNodesBuffersLength + + portsBuffersLength + + bridgechainRepositoryBufferLength + + bridgechainAssetRepositoryBufferLength, + ), ); - buffer.append(bridgechainUpdateAsset.bridgechainId, "hex"); - buffer.writeUint8(seedNodesBuffers.length); + buffer.writeBuffer(Buffer.from(bridgechainUpdateAsset.bridgechainId, "hex")); + buffer.writeUInt8(seedNodesBuffers.length); for (const seedBuf of seedNodesBuffers) { - buffer.writeUint8(seedBuf.length); - buffer.append(seedBuf); + buffer.writeUInt8(seedBuf.length); + buffer.writeBuffer(seedBuf); } - buffer.writeUint8(portsLength); + buffer.writeUInt8(portsLength); for (const [i, nameBuffer] of portNamesBuffers.entries()) { - buffer.writeUint8(nameBuffer.length); - buffer.append(nameBuffer); - buffer.writeUint16(portNumbers[i]); + buffer.writeUInt8(nameBuffer.length); + buffer.writeBuffer(nameBuffer); + buffer.writeUInt16LE(portNumbers[i]); } if (bridgechainRepositoryBuffer) { - buffer.writeUint8(bridgechainRepositoryBuffer.length); - buffer.append(bridgechainRepositoryBuffer); + buffer.writeUInt8(bridgechainRepositoryBuffer.length); + buffer.writeBuffer(bridgechainRepositoryBuffer); } else { - buffer.writeUint8(0); + buffer.writeUInt8(0); } if (bridgechainAssetRepositoryBuffer) { - buffer.writeUint8(bridgechainAssetRepositoryBuffer.length); - buffer.append(bridgechainAssetRepositoryBuffer); + buffer.writeUInt8(bridgechainAssetRepositoryBuffer.length); + buffer.writeBuffer(bridgechainAssetRepositoryBuffer); } else { - buffer.writeUint8(0); + buffer.writeUInt8(0); } return buffer; } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { const { data } = this; - const bridgechainId: string = buf.readBytes(32).toString("hex"); + const bridgechainId: string = buf.readBuffer(32).toString("hex"); const bridgechainUpdate: IBridgechainUpdateAsset = { bridgechainId, }; - const seedNodesLength: number = buf.readUint8(); + const seedNodesLength: number = buf.readUInt8(); if (seedNodesLength) { const seedNodes: string[] = []; for (let i = 0; i < seedNodesLength; i++) { - const ipLength = buf.readUint8(); - const ip = buf.readString(ipLength); + const ipLength = buf.readUInt8(); + const ip = buf.readBuffer(ipLength).toString("utf8"); seedNodes.push(ip); } bridgechainUpdate.seedNodes = seedNodes; } - const portsLength: number = buf.readUint8(); + const portsLength: number = buf.readUInt8(); if (portsLength) { const ports: IBridgechainPorts = {}; for (let i = 0; i < portsLength; i++) { - const nameLength: number = buf.readUint8(); - const name: string = buf.readString(nameLength); - const port: number = buf.readUint16(); - ports[name] = port; + const nameLength: number = buf.readUInt8(); + const name: string = buf.readBuffer(nameLength).toString("utf8"); + ports[name] = buf.readUInt16LE(); } bridgechainUpdate.ports = ports; } - const bridgechainRepositoryLength: number = buf.readUint8(); + const bridgechainRepositoryLength: number = buf.readUInt8(); if (bridgechainRepositoryLength) { - bridgechainUpdate.bridgechainRepository = buf.readString(bridgechainRepositoryLength); + bridgechainUpdate.bridgechainRepository = buf.readBuffer(bridgechainRepositoryLength).toString("utf8"); } - const bridgechainAssetRepositoryLength: number = buf.readUint8(); + const bridgechainAssetRepositoryLength: number = buf.readUInt8(); if (bridgechainAssetRepositoryLength) { - bridgechainUpdate.bridgechainAssetRepository = buf.readString(bridgechainAssetRepositoryLength); + bridgechainUpdate.bridgechainAssetRepository = buf + .readBuffer(bridgechainAssetRepositoryLength) + .toString("utf8"); } data.asset = { diff --git a/packages/core-magistrate-crypto/src/transactions/business-registration.ts b/packages/core-magistrate-crypto/src/transactions/business-registration.ts index a2f0c13806..b6e15c9472 100644 --- a/packages/core-magistrate-crypto/src/transactions/business-registration.ts +++ b/packages/core-magistrate-crypto/src/transactions/business-registration.ts @@ -1,6 +1,5 @@ import { Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { MagistrateTransactionGroup, MagistrateTransactionStaticFees, MagistrateTransactionType } from "../enums"; import { IBusinessRegistrationAsset } from "../interfaces"; @@ -41,7 +40,7 @@ export class BusinessRegistrationTransaction extends Transactions.Transaction { }); } - public serialize(): ByteBuffer { + public serialize(): Utils.ByteBuffer { const { data } = this; AppUtils.assert.defined(data.asset?.businessRegistration); @@ -64,56 +63,55 @@ export class BusinessRegistrationTransaction extends Transactions.Transaction { businessRepoLength = businessRepo.length; } - const buffer: ByteBuffer = new ByteBuffer( - businessName.length + businessWebsite.length + businessVatLength + businessRepoLength + 4, - true, + const buffer = new Utils.ByteBuffer( + Buffer.alloc(businessName.length + businessWebsite.length + businessVatLength + businessRepoLength + 4), ); - buffer.writeByte(businessName.length); - buffer.append(businessName, "hex"); + buffer.writeUInt8(businessName.length); + buffer.writeBuffer(businessName); - buffer.writeByte(businessWebsite.length); - buffer.append(businessWebsite, "hex"); + buffer.writeUInt8(businessWebsite.length); + buffer.writeBuffer(businessWebsite); if (businessVat) { - buffer.writeByte(businessVat.length); - buffer.append(businessVat, "hex"); + buffer.writeUInt8(businessVat.length); + buffer.writeBuffer(businessVat); } else { - buffer.writeByte(0); + buffer.writeUInt8(0); } if (businessRepo) { - buffer.writeByte(businessRepo.length); - buffer.append(businessRepo, "hex"); + buffer.writeUInt8(businessRepo.length); + buffer.writeBuffer(businessRepo); } else { - buffer.writeByte(0); + buffer.writeUInt8(0); } return buffer; } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { const { data } = this; - const nameLength: number = buf.readUint8(); - const name: string = buf.readString(nameLength); + const nameLength: number = buf.readUInt8(); + const name: string = buf.readBuffer(nameLength).toString("utf8"); - const websiteLength: number = buf.readUint8(); - const website: string = buf.readString(websiteLength); + const websiteLength: number = buf.readUInt8(); + const website: string = buf.readBuffer(websiteLength).toString("utf8"); const businessRegistration: IBusinessRegistrationAsset = { name, website, }; - const vatLength = buf.readUint8(); + const vatLength = buf.readUInt8(); if (vatLength > 0) { - businessRegistration.vat = buf.readString(vatLength); + businessRegistration.vat = buf.readBuffer(vatLength).toString("utf8"); } - const repositoryLength: number = buf.readUint8(); + const repositoryLength: number = buf.readUInt8(); if (repositoryLength > 0) { - businessRegistration.repository = buf.readString(repositoryLength); + businessRegistration.repository = buf.readBuffer(repositoryLength).toString("utf8"); } data.asset = { diff --git a/packages/core-magistrate-crypto/src/transactions/business-resignation.ts b/packages/core-magistrate-crypto/src/transactions/business-resignation.ts index e2f9c557e8..0356060014 100644 --- a/packages/core-magistrate-crypto/src/transactions/business-resignation.ts +++ b/packages/core-magistrate-crypto/src/transactions/business-resignation.ts @@ -1,5 +1,4 @@ import { Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { MagistrateTransactionGroup, MagistrateTransactionStaticFees, MagistrateTransactionType } from "../enums"; @@ -24,11 +23,11 @@ export class BusinessResignationTransaction extends Transactions.Transaction { }, }); } - public serialize(): ByteBuffer { - return new ByteBuffer(0); + public serialize(): Utils.ByteBuffer { + return new Utils.ByteBuffer(Buffer.alloc(0)); } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { return; } } diff --git a/packages/core-magistrate-crypto/src/transactions/business-update.ts b/packages/core-magistrate-crypto/src/transactions/business-update.ts index 4e7e6a5fe5..c05d929952 100644 --- a/packages/core-magistrate-crypto/src/transactions/business-update.ts +++ b/packages/core-magistrate-crypto/src/transactions/business-update.ts @@ -1,6 +1,5 @@ import { Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { MagistrateTransactionGroup, MagistrateTransactionStaticFees, MagistrateTransactionType } from "../enums"; import { IBusinessUpdateAsset } from "../interfaces"; @@ -55,7 +54,7 @@ export class BusinessUpdateTransaction extends Transactions.Transaction { }); } - public serialize(): ByteBuffer { + public serialize(): Utils.ByteBuffer { const { data } = this; AppUtils.assert.defined(data.asset?.businessUpdate); @@ -94,57 +93,56 @@ export class BusinessUpdateTransaction extends Transactions.Transaction { businessRepositoryLength = businessRepository.length; } - const buffer: ByteBuffer = new ByteBuffer( - businessNameLength + businessWebsiteLength + businessVatLength + businessRepositoryLength + 4, - true, + const buffer = new Utils.ByteBuffer( + Buffer.alloc(businessNameLength + businessWebsiteLength + businessVatLength + businessRepositoryLength + 4), ); - buffer.writeByte(businessNameLength); + buffer.writeUInt8(businessNameLength); if (businessName && businessNameLength !== 0) { - buffer.append(businessName); + buffer.writeBuffer(businessName); } - buffer.writeByte(businessWebsiteLength); + buffer.writeUInt8(businessWebsiteLength); if (businessWebsite && businessWebsiteLength !== 0) { - buffer.append(businessWebsite); + buffer.writeBuffer(businessWebsite); } - buffer.writeByte(businessVatLength); + buffer.writeUInt8(businessVatLength); if (businessVat && businessVatLength !== 0) { - buffer.append(businessVat); + buffer.writeBuffer(businessVat); } - buffer.writeByte(businessRepositoryLength); + buffer.writeUInt8(businessRepositoryLength); if (businessRepository && businessRepositoryLength !== 0) { - buffer.append(businessRepository); + buffer.writeBuffer(businessRepository); } return buffer; } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { const { data } = this; const businessUpdate: IBusinessUpdateAsset = {}; - const nameLength: number = buf.readUint8(); + const nameLength: number = buf.readUInt8(); if (nameLength !== 0) { - businessUpdate.name = buf.readString(nameLength); + businessUpdate.name = buf.readBuffer(nameLength).toString("utf8"); } - const websiteLength: number = buf.readUint8(); + const websiteLength: number = buf.readUInt8(); if (websiteLength !== 0) { - businessUpdate.website = buf.readString(websiteLength); + businessUpdate.website = buf.readBuffer(websiteLength).toString("utf8"); } - const vatLength: number = buf.readUint8(); + const vatLength: number = buf.readUInt8(); if (vatLength !== 0) { - businessUpdate.vat = buf.readString(vatLength); + businessUpdate.vat = buf.readBuffer(vatLength).toString("utf8"); } - const repositoryLength: number = buf.readUint8(); + const repositoryLength: number = buf.readUInt8(); if (repositoryLength !== 0) { - businessUpdate.repository = buf.readString(repositoryLength); + businessUpdate.repository = buf.readBuffer(repositoryLength).toString("utf8"); } data.asset = { diff --git a/packages/core-magistrate-crypto/src/transactions/entity.ts b/packages/core-magistrate-crypto/src/transactions/entity.ts index 84cfd49d1d..5ac743092f 100644 --- a/packages/core-magistrate-crypto/src/transactions/entity.ts +++ b/packages/core-magistrate-crypto/src/transactions/entity.ts @@ -1,6 +1,5 @@ import { Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Interfaces, Transactions, Utils } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; import { EntityAction, @@ -82,57 +81,68 @@ export class EntityTransaction extends Transactions.Transaction { return feeContext?.data?.asset ? this.staticFeeByAction[feeContext.data.asset.action] : this.defaultStaticFee; } - public serialize(): ByteBuffer { + public serialize(): Utils.ByteBuffer { const { data } = this; AppUtils.assert.defined(data.asset); const asset: IEntityAsset = data.asset; - const buffer: ByteBuffer = new ByteBuffer(); + const registrationIdBuffer = Buffer.from(asset.registrationId || "", "hex"); + const nameBuffer = Buffer.from(asset.data.name || ""); + const ipfsDataBuffer = Buffer.from(asset.data.ipfsData || ""); - buffer.writeUint8(asset.type); - buffer.writeUint8(asset.subType); - buffer.writeUint8(asset.action); + const buffer = new Utils.ByteBuffer( + Buffer.alloc( + 3 + // Type, SubType, Action + 1 + // RegistrationId Length + registrationIdBuffer.length + + 1 + // Name Length + nameBuffer.length + + 1 + // IPFSData Length + ipfsDataBuffer.length, + ), + ); - const registrationIdBuffer = Buffer.from(asset.registrationId || "", "hex"); - buffer.writeUint8(registrationIdBuffer.length); - buffer.append(registrationIdBuffer, "hex"); + buffer.writeUInt8(asset.type); + buffer.writeUInt8(asset.subType); + buffer.writeUInt8(asset.action); - const nameBuffer = Buffer.from(asset.data.name || ""); - buffer.writeUint8(nameBuffer.length); - buffer.append(nameBuffer); + buffer.writeUInt8(registrationIdBuffer.length); + buffer.writeBuffer(registrationIdBuffer); - const ipfsDataBuffer = Buffer.from(asset.data.ipfsData || ""); - buffer.writeUint8(ipfsDataBuffer.length); - buffer.append(ipfsDataBuffer); + buffer.writeUInt8(nameBuffer.length); + buffer.writeBuffer(nameBuffer); + + buffer.writeUInt8(ipfsDataBuffer.length); + buffer.writeBuffer(ipfsDataBuffer); return buffer; } - public deserialize(buf: ByteBuffer): void { + public deserialize(buf: Utils.ByteBuffer): void { const { data } = this; data.asset = {}; - data.asset.type = buf.readUint8(); - data.asset.subType = buf.readUint8(); - data.asset.action = buf.readUint8(); + data.asset.type = buf.readUInt8(); + data.asset.subType = buf.readUInt8(); + data.asset.action = buf.readUInt8(); - const registrationIdBufferLength: number = buf.readUint8(); + const registrationIdBufferLength: number = buf.readUInt8(); if (registrationIdBufferLength > 0) { - data.asset.registrationId = buf.readBytes(registrationIdBufferLength).toString("hex"); + data.asset.registrationId = buf.readBuffer(registrationIdBufferLength).toString("hex"); } data.asset.data = {}; - const nameBufferLength: number = buf.readUint8(); + const nameBufferLength: number = buf.readUInt8(); if (nameBufferLength > 0) { - data.asset.data.name = buf.readString(nameBufferLength); + data.asset.data.name = buf.readBuffer(nameBufferLength).toString("utf8"); } - const ipfsDataBufferLength: number = buf.readUint8(); + const ipfsDataBufferLength: number = buf.readUInt8(); if (ipfsDataBufferLength > 0) { - data.asset.data.ipfsData = buf.readString(ipfsDataBufferLength); + data.asset.data.ipfsData = buf.readBuffer(ipfsDataBufferLength).toString("utf8"); } } } diff --git a/packages/core-magistrate-transactions/package.json b/packages/core-magistrate-transactions/package.json index 00b2d7a8ae..aad919f4f8 100644 --- a/packages/core-magistrate-transactions/package.json +++ b/packages/core-magistrate-transactions/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-magistrate-transactions", - "version": "3.0.6", + "version": "3.12.0", "description": "ARK transactions for businesses and bridgechains", "license": "MIT", "contributors": [ @@ -21,10 +21,10 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-magistrate-crypto": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6" + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-magistrate-crypto": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0" }, "publishConfig": { "access": "public" diff --git a/packages/core-magistrate-transactions/src/enums.ts b/packages/core-magistrate-transactions/src/enums.ts new file mode 100644 index 0000000000..5ac51f0d82 --- /dev/null +++ b/packages/core-magistrate-transactions/src/enums.ts @@ -0,0 +1,3 @@ +export enum MempoolIndexes { + EntityName = "entity-name", +} diff --git a/packages/core-magistrate-transactions/src/handlers/bridgechain-registration.ts b/packages/core-magistrate-transactions/src/handlers/bridgechain-registration.ts index c5e395a375..243926e5ab 100644 --- a/packages/core-magistrate-transactions/src/handlers/bridgechain-registration.ts +++ b/packages/core-magistrate-transactions/src/handlers/bridgechain-registration.ts @@ -22,6 +22,7 @@ import { packageNameRegex } from "./utils"; @Container.injectable() export class BridgechainRegistrationTransactionHandler extends MagistrateTransactionHandler { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -49,9 +50,8 @@ export class BridgechainRegistrationTransactionHandler extends MagistrateTransac ); const wallet: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.senderPublicKey); - const businessAttributes: IBusinessWalletAttributes = wallet.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + wallet.getAttribute("business"); if (!businessAttributes.bridgechains) { businessAttributes.bridgechains = {}; } @@ -84,9 +84,8 @@ export class BridgechainRegistrationTransactionHandler extends MagistrateTransac const { data }: Interfaces.ITransaction = transaction; if (wallet.hasAttribute("business.bridgechains")) { - const bridgechains: Record = wallet.getAttribute( - "business.bridgechains", - ); + const bridgechains: Record = + wallet.getAttribute("business.bridgechains"); if ( Object.values(bridgechains).some( @@ -126,9 +125,8 @@ export class BridgechainRegistrationTransactionHandler extends MagistrateTransac const sender: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.data.senderPublicKey); - const businessAttributes: IBusinessWalletAttributes = sender.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + sender.getAttribute("business"); if (!businessAttributes.bridgechains) { businessAttributes.bridgechains = {}; @@ -154,9 +152,8 @@ export class BridgechainRegistrationTransactionHandler extends MagistrateTransac const sender: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.data.senderPublicKey); - const businessAttributes: IBusinessWalletAttributes = sender.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + sender.getAttribute("business"); AppUtils.assert.defined>(businessAttributes.bridgechains); diff --git a/packages/core-magistrate-transactions/src/handlers/bridgechain-resignation.ts b/packages/core-magistrate-transactions/src/handlers/bridgechain-resignation.ts index 6602e58dfe..783f423a17 100644 --- a/packages/core-magistrate-transactions/src/handlers/bridgechain-resignation.ts +++ b/packages/core-magistrate-transactions/src/handlers/bridgechain-resignation.ts @@ -21,6 +21,7 @@ export class BridgechainResignationTransactionHandler extends MagistrateTransact private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -48,13 +49,11 @@ export class BridgechainResignationTransactionHandler extends MagistrateTransact ); const wallet: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.senderPublicKey); - const businessAttributes: IBusinessWalletAttributes = wallet.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + wallet.getAttribute("business"); - const bridgechainAsset = businessAttributes.bridgechains![ - transaction.asset.bridgechainResignation.bridgechainId - ]; + const bridgechainAsset = + businessAttributes.bridgechains![transaction.asset.bridgechainResignation.bridgechainId]; bridgechainAsset.resigned = true; wallet.setAttribute("business", businessAttributes); @@ -70,9 +69,8 @@ export class BridgechainResignationTransactionHandler extends MagistrateTransact throw new WalletIsNotBusinessError(); } - const businessAttributes: IBusinessWalletAttributes = wallet.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + wallet.getAttribute("business"); if (businessAttributes.resigned) { throw new BusinessIsResignedError(); @@ -139,8 +137,8 @@ export class BridgechainResignationTransactionHandler extends MagistrateTransact // transaction.data.asset?.bridgechainResignation, // ); - const bridgechainResignation: MagistrateInterfaces.IBridgechainResignationAsset = transaction.data.asset! - .bridgechainResignation; + const bridgechainResignation: MagistrateInterfaces.IBridgechainResignationAsset = + transaction.data.asset!.bridgechainResignation; AppUtils.assert.defined>(businessAttributes.bridgechains); diff --git a/packages/core-magistrate-transactions/src/handlers/bridgechain-update.ts b/packages/core-magistrate-transactions/src/handlers/bridgechain-update.ts index d7cfd3efd8..af99abaf28 100644 --- a/packages/core-magistrate-transactions/src/handlers/bridgechain-update.ts +++ b/packages/core-magistrate-transactions/src/handlers/bridgechain-update.ts @@ -26,6 +26,7 @@ export class BridgechainUpdateTransactionHandler extends MagistrateTransactionHa private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -51,12 +52,12 @@ export class BridgechainUpdateTransactionHandler extends MagistrateTransactionHa AppUtils.assert.defined(transaction.asset?.bridgechainUpdate); const wallet: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.senderPublicKey); - const businessAttributes: IBusinessWalletAttributes = wallet.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + wallet.getAttribute("business"); const shallowCloneBridgechainUpdate = { ...transaction.asset.bridgechainUpdate }; const bridgechainId = shallowCloneBridgechainUpdate.bridgechainId; + // @ts-ignore delete shallowCloneBridgechainUpdate.bridgechainId; // we don't want id in wallet bridgechain asset businessAttributes.bridgechains![bridgechainId].bridgechainAsset = { @@ -84,9 +85,8 @@ export class BridgechainUpdateTransactionHandler extends MagistrateTransactionHa transaction.data.asset?.bridgechainUpdate, ); - const businessAttributes: IBusinessWalletAttributes = wallet.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + wallet.getAttribute("business"); if (!businessAttributes.bridgechains) { throw new BridgechainIsNotRegisteredByWalletError(); @@ -146,12 +146,11 @@ export class BridgechainUpdateTransactionHandler extends MagistrateTransactionHa const wallet: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.data.senderPublicKey); - const businessAttributes: IBusinessWalletAttributes = wallet.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + wallet.getAttribute("business"); - const bridgechainUpdate: MagistrateInterfaces.IBridgechainUpdateAsset = transaction.data.asset! // Assertion check inside super.applyToSender - .bridgechainUpdate; + const bridgechainUpdate: MagistrateInterfaces.IBridgechainUpdateAsset = + transaction.data.asset!.bridgechainUpdate; // Assertion check inside super.applyToSender AppUtils.assert.defined>(businessAttributes.bridgechains); @@ -159,6 +158,7 @@ export class BridgechainUpdateTransactionHandler extends MagistrateTransactionHa businessAttributes.bridgechains[bridgechainUpdate.bridgechainId]; const shallowCloneBridgechainUpdate = { ...bridgechainUpdate }; + // @ts-ignore delete shallowCloneBridgechainUpdate.bridgechainId; // we don't want id in wallet bridgechain asset bridgechainAttributes.bridgechainAsset = { ...bridgechainAttributes.bridgechainAsset, @@ -180,9 +180,8 @@ export class BridgechainUpdateTransactionHandler extends MagistrateTransactionHa const sender: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.data.senderPublicKey); AppUtils.assert.defined(sender.getPublicKey()); - const businessAttributes: IBusinessWalletAttributes = sender.getAttribute( - "business", - ); + const businessAttributes: IBusinessWalletAttributes = + sender.getAttribute("business"); const bridgechainId: string = transaction.data.asset.bridgechainUpdate.bridgechainId; const bridgechainTransactions = await this.transactionHistoryService.findManyByCriteria([ diff --git a/packages/core-magistrate-transactions/src/handlers/business-registration.ts b/packages/core-magistrate-transactions/src/handlers/business-registration.ts index 64a2b68f9b..8ab95d3ff4 100644 --- a/packages/core-magistrate-transactions/src/handlers/business-registration.ts +++ b/packages/core-magistrate-transactions/src/handlers/business-registration.ts @@ -17,6 +17,7 @@ export class BusinessRegistrationTransactionHandler extends MagistrateTransactio private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { diff --git a/packages/core-magistrate-transactions/src/handlers/business-resignation.ts b/packages/core-magistrate-transactions/src/handlers/business-resignation.ts index 43bd248879..a2b4963cd0 100644 --- a/packages/core-magistrate-transactions/src/handlers/business-resignation.ts +++ b/packages/core-magistrate-transactions/src/handlers/business-resignation.ts @@ -15,6 +15,7 @@ export class BusinessResignationTransactionHandler extends MagistrateTransaction private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { diff --git a/packages/core-magistrate-transactions/src/handlers/business-update.ts b/packages/core-magistrate-transactions/src/handlers/business-update.ts index 50dd140abd..2601081941 100644 --- a/packages/core-magistrate-transactions/src/handlers/business-update.ts +++ b/packages/core-magistrate-transactions/src/handlers/business-update.ts @@ -19,6 +19,7 @@ export class BusinessUpdateTransactionHandler extends MagistrateTransactionHandl private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -45,9 +46,8 @@ export class BusinessUpdateTransactionHandler extends MagistrateTransactionHandl const wallet: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.senderPublicKey); - const businessWalletAsset: MagistrateInterfaces.IBusinessRegistrationAsset = wallet.getAttribute< - IBusinessWalletAttributes - >("business").businessAsset; + const businessWalletAsset: MagistrateInterfaces.IBusinessRegistrationAsset = + wallet.getAttribute("business").businessAsset; const businessUpdate: MagistrateInterfaces.IBusinessUpdateAsset = transaction.asset.businessUpdate; wallet.setAttribute("business.businessAsset", { @@ -96,9 +96,8 @@ export class BusinessUpdateTransactionHandler extends MagistrateTransactionHandl const sender: Contracts.State.Wallet = this.walletRepository.findByPublicKey(transaction.data.senderPublicKey); - const businessWalletAsset: MagistrateInterfaces.IBusinessRegistrationAsset = sender.getAttribute< - IBusinessWalletAttributes - >("business").businessAsset; + const businessWalletAsset: MagistrateInterfaces.IBusinessRegistrationAsset = + sender.getAttribute("business").businessAsset; AppUtils.assert.defined(transaction.data.asset?.businessUpdate); diff --git a/packages/core-magistrate-transactions/src/handlers/entity.ts b/packages/core-magistrate-transactions/src/handlers/entity.ts index 5ba719903b..c313c2b17d 100644 --- a/packages/core-magistrate-transactions/src/handlers/entity.ts +++ b/packages/core-magistrate-transactions/src/handlers/entity.ts @@ -7,6 +7,7 @@ import { import { Handlers } from "@arkecosystem/core-transactions"; import { Interfaces as CryptoInterfaces, Interfaces, Managers, Transactions, Utils } from "@arkecosystem/crypto"; +import { MempoolIndexes } from "../enums"; import { EntityAlreadyRegisteredError, EntityAlreadyResignedError, @@ -23,10 +24,11 @@ import { MagistrateIndex } from "../wallet-indexes"; @Container.injectable() export class EntityTransactionHandler extends Handlers.TransactionHandler { - @Container.inject(Container.Identifiers.TransactionPoolQuery) - private readonly poolQuery!: Contracts.TransactionPool.Query; + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -63,20 +65,13 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { } public async throwIfCannotEnterPool(transaction: Interfaces.ITransaction): Promise { - KernelUtils.assert.defined(transaction.data.asset); + KernelUtils.assert.defined(transaction.data.asset); if (transaction.data.asset.action === Enums.EntityAction.Register) { - KernelUtils.assert.defined(transaction.data.asset.data.name); + KernelUtils.assert.defined(transaction.data.asset.data.name); const name = transaction.data.asset.data.name; - const hasName: boolean = this.poolQuery - .getAll() - .whereKind(transaction) - .wherePredicate((t) => t.data.asset?.type === transaction.data.asset!.type) - .wherePredicate((t) => t.data.asset?.data.name.toLowerCase() === name.toLowerCase()) - .has(); - - if (hasName) { + if (this.mempoolIndexRegistry.get(MempoolIndexes.EntityName).has(name.toLowerCase())) { throw new Contracts.TransactionPool.PoolError( `Entity registration for "${name}" already in the pool`, "ERR_PENDING", @@ -85,6 +80,47 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { } } + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise { + KernelUtils.assert.defined(transaction.data.asset); + + if (transaction.data.asset.action === Enums.EntityAction.Register) { + KernelUtils.assert.defined(transaction.data.asset.data.name); + + this.mempoolIndexRegistry + .get(MempoolIndexes.EntityName) + .set(transaction.data.asset.data.name.toLowerCase(), transaction); + } + } + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise { + KernelUtils.assert.defined(transaction.data.asset); + + if (transaction.data.asset.action === Enums.EntityAction.Register) { + KernelUtils.assert.defined(transaction.data.asset.data.name); + + this.mempoolIndexRegistry + .get(MempoolIndexes.EntityName) + .forget(transaction.data.asset.data.name.toLowerCase()); + } + } + + public async getInvalidPoolTransactions( + transaction: CryptoInterfaces.ITransaction, + ): Promise { + KernelUtils.assert.defined(transaction.data.asset); + + if (transaction.data.asset.action === Enums.EntityAction.Register) { + KernelUtils.assert.defined(transaction.data.asset.data.name); + + const entityNameIndex = this.mempoolIndexRegistry.get(MempoolIndexes.EntityName); + const name = transaction.data.asset.data.name.toLowerCase(); + + return entityNameIndex.has(name) ? [entityNameIndex.get(name)] : []; + } + + return []; + } + public async throwIfCannotBeApplied( transaction: CryptoInterfaces.ITransaction, wallet: Contracts.State.Wallet, @@ -100,7 +136,7 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { await super.throwIfCannotBeApplied(transaction, wallet); - KernelUtils.assert.defined(transaction.data.asset); + KernelUtils.assert.defined(transaction.data.asset); const walletEntities = wallet.getAttribute("entities", {}); if (transaction.data.asset.action === Enums.EntityAction.Register) { @@ -127,6 +163,7 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { } } } else { + KernelUtils.assert.defined(transaction.data.asset.registrationId); // Resign or update share the same checks if (!walletEntities[transaction.data.asset.registrationId]) { throw new EntityNotRegisteredError(); @@ -156,7 +193,7 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { } public async revertForSender(transaction: Interfaces.ITransaction): Promise { - KernelUtils.assert.defined(transaction.data.asset); + KernelUtils.assert.defined(transaction.data.asset); await super.revertForSender(transaction); @@ -177,7 +214,8 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { case Enums.EntityAction.Update: return this.revertForSenderUpdate(transaction, this.walletRepository); case Enums.EntityAction.Resign: - delete entities[transaction.data.asset!.registrationId].resigned; + KernelUtils.assert.defined(transaction.data.asset.registrationId); + delete entities[transaction.data.asset.registrationId].resigned; break; } @@ -199,7 +237,8 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { walletRepository: Contracts.State.WalletRepository, ): Promise { KernelUtils.assert.defined(transaction.data.senderPublicKey); - KernelUtils.assert.defined(transaction.data.asset); + KernelUtils.assert.defined(transaction.data.asset); + KernelUtils.assert.defined(transaction.data.asset.registrationId); // Here we have to "replay" entity registration and update transactions associated with the registration id // (except the current one being reverted) to rebuild previous wallet state. @@ -253,7 +292,7 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { ): void { const entities: IEntitiesWallet = wallet.getAttribute("entities", {}); - KernelUtils.assert.defined(transaction.asset); + KernelUtils.assert.defined(transaction.asset); switch (transaction.asset!.action) { case Enums.EntityAction.Register: @@ -271,15 +310,17 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { this.walletRepository.setOnIndex(MagistrateIndex.Entities, transaction.id!, wallet); break; case Enums.EntityAction.Update: - entities[transaction.asset!.registrationId] = { - type: entities[transaction.asset!.registrationId].type, - subType: entities[transaction.asset!.registrationId].subType, - data: { ...entities[transaction.asset!.registrationId].data, ...transaction.asset!.data }, + KernelUtils.assert.defined(transaction.asset.registrationId); + entities[transaction.asset.registrationId] = { + type: entities[transaction.asset.registrationId].type, + subType: entities[transaction.asset.registrationId].subType, + data: { ...entities[transaction.asset.registrationId].data, ...transaction.asset.data }, }; break; case Enums.EntityAction.Resign: - entities[transaction.asset!.registrationId] = { - ...entities[transaction.asset!.registrationId], + KernelUtils.assert.defined(transaction.asset.registrationId); + entities[transaction.asset.registrationId] = { + ...entities[transaction.asset.registrationId], resigned: true, }; break; diff --git a/packages/core-magistrate-transactions/src/service-provider.ts b/packages/core-magistrate-transactions/src/service-provider.ts index 6d38975092..7ce13f8296 100644 --- a/packages/core-magistrate-transactions/src/service-provider.ts +++ b/packages/core-magistrate-transactions/src/service-provider.ts @@ -1,5 +1,6 @@ import { Container, Contracts, Providers } from "@arkecosystem/core-kernel"; +import { MempoolIndexes } from "./enums"; import { BridgechainRegistrationTransactionHandler, BridgechainResignationTransactionHandler, @@ -15,6 +16,8 @@ export class ServiceProvider extends Providers.ServiceProvider { public async register(): Promise { this.registerIndexers(); + this.app.bind(Container.Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.EntityName); + this.app.bind(Container.Identifiers.TransactionHandler).to(BusinessRegistrationTransactionHandler); this.app.bind(Container.Identifiers.TransactionHandler).to(BusinessResignationTransactionHandler); this.app.bind(Container.Identifiers.TransactionHandler).to(BusinessUpdateTransactionHandler); diff --git a/packages/core-p2p/package.json b/packages/core-p2p/package.json index 7ba52ec5e7..bee448587b 100644 --- a/packages/core-p2p/package.json +++ b/packages/core-p2p/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-p2p", - "version": "3.0.6", + "version": "3.12.0", "description": "P2P API for ARK Core", "license": "MIT", "contributors": [ @@ -27,34 +27,34 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-state": "3.0.6", - "@arkecosystem/crypto": "3.0.6", + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-state": "3.12.0", + "@arkecosystem/crypto": "3.12.0", "@hapi/boom": "9.0.0", "@hapi/bounce": "2.0.0", "@hapi/hapi": "20.1.5", "@hapi/hoek": "9.2.0", "@hapi/sntp": "4.0.0", "@hapi/teamwork": "5.1.0", - "dayjs": "1.10.7", + "dayjs": "1.11.10", "delay": "4.4.1", - "ip": "1.1.5", - "ipaddr.js": "2.0.1", - "joi": "17.4.2", + "ip": "2.0.1", + "ipaddr.js": "2.1.0", + "joi": "17.12.1", "pluralize": "8.0.0", "pretty-ms": "7.0.1", - "protobufjs": "6.10.2", - "rate-limiter-flexible": "1.3.2", - "semver": "6.3.0", - "ws": "7.5.5" + "protobufjs": "7.2.6", + "rate-limiter-flexible": "4.0.1", + "semver": "7.5.4", + "ws": "7.5.10" }, "devDependencies": { - "@types/better-sqlite3": "5.4.3", "@types/fs-extra": "8.1.2", "@types/hapi__sntp": "3.1.2", - "@types/ip": "1.1.0", - "@types/semver": "6.2.3" + "@types/ip": "1.1.3", + "@types/semver": "7.5.6", + "protobufjs-cli": "1.1.2" }, "engines": { "node": ">=10.x" diff --git a/packages/core-p2p/src/actions/validate-and-accept-peer.ts b/packages/core-p2p/src/actions/validate-and-accept-peer.ts index d29adc3f90..1a280c0e5f 100644 --- a/packages/core-p2p/src/actions/validate-and-accept-peer.ts +++ b/packages/core-p2p/src/actions/validate-and-accept-peer.ts @@ -11,8 +11,11 @@ export class ValidateAndAcceptPeerAction extends Services.Triggers.Action { public async execute(args: Types.ActionArguments): Promise { const peer: Contracts.P2P.Peer = args.peer; + const headers: Contracts.P2P.Headers = args.headers; const options: Contracts.P2P.AcceptNewPeerOptions = args.options; - return this.app.get(Container.Identifiers.PeerProcessor).validateAndAcceptPeer(peer, options); + return this.app + .get(Container.Identifiers.PeerProcessor) + .validateAndAcceptPeer(peer, headers, options); } } diff --git a/packages/core-p2p/src/defaults.ts b/packages/core-p2p/src/defaults.ts index 32b79007db..cae9cf47cf 100644 --- a/packages/core-p2p/src/defaults.ts +++ b/packages/core-p2p/src/defaults.ts @@ -7,7 +7,7 @@ export const defaults = { /** * The minimum peer version we expect */ - minimumVersions: ["^3.0", "^3.0.0-next.0", "^3.0.0-alpha.0"], + minimumVersions: ["^3.0", "^3.0.0-next.0", "^4.0.0-next.0"], /** * The number of peers we expect to be available to start a relay */ diff --git a/packages/core-p2p/src/hapi-nes/client.ts b/packages/core-p2p/src/hapi-nes/client.ts index 26bd5e027b..80b566a6d6 100755 --- a/packages/core-p2p/src/hapi-nes/client.ts +++ b/packages/core-p2p/src/hapi-nes/client.ts @@ -155,7 +155,7 @@ export class Client { this._reconnection = null; } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this._connect(options, true, (err) => { if (err) { return reject(err); diff --git a/packages/core-p2p/src/network-monitor.ts b/packages/core-p2p/src/network-monitor.ts index 07d85e7fc6..af0c06eb57 100644 --- a/packages/core-p2p/src/network-monitor.ts +++ b/packages/core-p2p/src/network-monitor.ts @@ -130,7 +130,7 @@ export class NetworkMonitor implements Contracts.P2P.NetworkMonitor { // we use Promise.race to cut loose in case some communicator.ping() does not resolve within the delay // in that case we want to keep on with our program execution while ping promises can finish in the background - await new Promise((resolve) => { + await new Promise((resolve) => { let isResolved = false; // Simulates Promise.race, but doesn't cause "multipleResolvers" process error @@ -144,7 +144,7 @@ export class NetworkMonitor implements Contracts.P2P.NetworkMonitor { Promise.all( peers.map(async (peer) => { try { - await this.communicator.ping(peer, pingDelay, forcePing); + await this.communicator.ping(peer, pingDelay, forcePing, fast); } catch (error) { unresponsivePeers++; @@ -285,7 +285,7 @@ export class NetworkMonitor implements Contracts.P2P.NetworkMonitor { ); const forkHeights: number[] = forkVerificationResults - .map((verificationResult: Contracts.P2P.PeerVerificationResult) => verificationResult.highestCommonHeight) + .map((verificationResult) => verificationResult.highestCommonHeight!) .filter((forkHeight, i, arr) => arr.indexOf(forkHeight) === i) // unique .sort() .reverse(); @@ -437,12 +437,13 @@ export class NetworkMonitor implements Contracts.P2P.NetworkMonitor { this.logger.debug(`Downloading blocks in chunks: ${chunksHumanReadable}`); let firstFailureMessage!: string; - try { - // Convert the array of AsyncFunction to an array of Promise by calling the functions. + // Convert the array of AsyncFunction to an array of Promise by calling the functions. + // @ts-ignore + const result = await Promise.allSettled(downloadJobs.map((f) => f())); + const failure = result.find((value) => value.status === "rejected"); + if (failure) { // @ts-ignore - await Promise.all(downloadJobs.map((f) => f())); - } catch (error) { - firstFailureMessage = error.message; + firstFailureMessage = failure.reason; } let downloadedBlocks: Interfaces.IBlockData[] = []; diff --git a/packages/core-p2p/src/network-state.ts b/packages/core-p2p/src/network-state.ts index b3e92b10c3..dc9cf24652 100644 --- a/packages/core-p2p/src/network-state.ts +++ b/packages/core-p2p/src/network-state.ts @@ -173,7 +173,7 @@ export class NetworkState implements Contracts.P2P.NetworkState { this.quorumDetails.peersOverHeight++; this.quorumDetails.peersOverHeightBlockHeaders[peer.state.header.id] = peer.state.header; } else { - if (peer.isForked()) { + if (peer.fastVerificationResult?.forked) { this.quorumDetails.peersNoQuorum++; this.quorumDetails.peersForked++; } else { diff --git a/packages/core-p2p/src/peer-communicator.ts b/packages/core-p2p/src/peer-communicator.ts index fd2f766df1..e4b063d86b 100644 --- a/packages/core-p2p/src/peer-communicator.ts +++ b/packages/core-p2p/src/peer-communicator.ts @@ -97,7 +97,7 @@ export class PeerCommunicator implements Contracts.P2P.PeerCommunicator { // ! do not rely on parameter timeoutMsec as guarantee that ping method will resolve within it ! // ! peerVerifier.checkState can take more time ! // TODO refactor ? - public async ping(peer: Contracts.P2P.Peer, timeoutMsec: number, force = false): Promise { + public async ping(peer: Contracts.P2P.Peer, timeoutMsec: number, force = false, fast = false): Promise { const deadline = new Date().getTime() + timeoutMsec; if (peer.recentlyPinged() && !force) { @@ -127,10 +127,18 @@ export class PeerCommunicator implements Contracts.P2P.PeerCommunicator { throw new PeerPingTimeoutError(timeoutMsec); } - peer.verificationResult = await peerVerifier.checkState(pingResponse.state, deadline); + if (fast) { + peer.fastVerificationResult = await peerVerifier.checkStateFast(pingResponse.state, deadline); - if (!peer.isVerified()) { - throw new PeerVerificationFailedError(); + if (!peer.fastVerificationResult) { + throw new PeerVerificationFailedError(); + } + } else { + peer.verificationResult = await peerVerifier.checkState(pingResponse.state, deadline); + + if (!peer.isVerified()) { + throw new PeerVerificationFailedError(); + } } } diff --git a/packages/core-p2p/src/peer-processor.ts b/packages/core-p2p/src/peer-processor.ts index 573845c086..2fb60b5fc4 100644 --- a/packages/core-p2p/src/peer-processor.ts +++ b/packages/core-p2p/src/peer-processor.ts @@ -43,11 +43,12 @@ export class PeerProcessor implements Contracts.P2P.PeerProcessor { public async validateAndAcceptPeer( peer: Contracts.P2P.Peer, + headers: Contracts.P2P.Headers = {}, options: Contracts.P2P.AcceptNewPeerOptions = {}, ): Promise { /* istanbul ignore else */ if (this.validatePeerIp(peer, options)) { - await this.acceptNewPeer(peer, options); + await this.acceptNewPeer(peer, headers, options); } } @@ -88,8 +89,15 @@ export class PeerProcessor implements Contracts.P2P.PeerProcessor { return true; } - private async acceptNewPeer(peer, options: Contracts.P2P.AcceptNewPeerOptions): Promise { + private async acceptNewPeer( + peer, + headers: Contracts.P2P.Headers, + options: Contracts.P2P.AcceptNewPeerOptions, + ): Promise { if (this.repository.hasPeer(peer.ip)) { + if (headers.version) { + this.repository.getPeer(peer.ip).version = headers.version; + } return; } diff --git a/packages/core-p2p/src/peer-verifier.ts b/packages/core-p2p/src/peer-verifier.ts index c2ebe9e734..6dd1e8531f 100644 --- a/packages/core-p2p/src/peer-verifier.ts +++ b/packages/core-p2p/src/peer-verifier.ts @@ -19,6 +19,22 @@ export class PeerVerificationResult { } } +export class FastPeerVerificationResult { + public constructor( + public readonly myHeight: number, + public readonly hisHeight: number, + public readonly highestCommonHeight?: number, + ) {} + + public get forked(): boolean { + if (this.highestCommonHeight) { + return this.highestCommonHeight !== this.myHeight && this.highestCommonHeight !== this.hisHeight; + } + + return true; + } +} + // todo: review the implementation @Container.injectable() export class PeerVerifier implements Contracts.P2P.PeerVerifier { @@ -122,6 +138,31 @@ export class PeerVerifier implements Contracts.P2P.PeerVerifier { return new PeerVerificationResult(ourHeight, claimedHeight, highestCommonBlockHeight); } + public async checkStateFast( + claimedState: Contracts.P2P.PeerState, + deadline: number, + ): Promise { + if (!(await this.checkStateHeader(claimedState))) { + return undefined; + } + + const claimedHeight = Number(claimedState.header.height); + const ourHeight: number = this.ourHeight(); + if (await this.weHavePeersHighestBlock(claimedState, ourHeight)) { + // Case3 and Case5 -> peersQuorum++; + return new FastPeerVerificationResult(ourHeight, claimedHeight, claimedHeight); + } + + /* Case 1 -> peersNoQuorum++ + * Case 2 -> peersNoQuorum++ + * Case 4 -> peersNoQuorum++; peersForked++; + * Case 6 -> peersNoQuorum++; peersForked++; + * + * All those cases will report PeerVerificationResult.forked === true. That is ok, because we use fast check only for quorum validation. + */ + return new FastPeerVerificationResult(ourHeight, claimedHeight); + } + private async checkStateHeader(claimedState: Contracts.P2P.PeerState): Promise { const blockHeader: Interfaces.IBlockData = claimedState.header as Interfaces.IBlockData; const claimedHeight = Number(blockHeader.height); diff --git a/packages/core-p2p/src/peer.ts b/packages/core-p2p/src/peer.ts index 8a5440b392..457ab5f69f 100644 --- a/packages/core-p2p/src/peer.ts +++ b/packages/core-p2p/src/peer.ts @@ -43,7 +43,13 @@ export class Peer implements Contracts.P2P.Peer { * @type {(PeerVerificationResult | undefined)} * @memberof Peer */ - public verificationResult: PeerVerificationResult | undefined; + public verificationResult: Contracts.P2P.PeerVerificationResult | undefined; + + /** + * @type {(PeerVerificationResult | undefined)} + * @memberof Peer + */ + public fastVerificationResult: Contracts.P2P.FastPeerVerificationResult | undefined; /** * @type {Contracts.P2P.PeerState} diff --git a/packages/core-p2p/src/socket-server/codecs/proto/protos.d.ts b/packages/core-p2p/src/socket-server/codecs/proto/protos.d.ts index 28dceae7b8..69bdfa2978 100644 --- a/packages/core-p2p/src/socket-server/codecs/proto/protos.d.ts +++ b/packages/core-p2p/src/socket-server/codecs/proto/protos.d.ts @@ -1,4 +1,5 @@ import * as $protobuf from "protobufjs"; +import Long = require("long"); /** Namespace blocks. */ export namespace blocks { @@ -96,6 +97,13 @@ export namespace blocks { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for PostBlockRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a PostBlockResponse. */ @@ -192,6 +200,13 @@ export namespace blocks { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for PostBlockResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a GetBlocksRequest. */ @@ -306,6 +321,13 @@ export namespace blocks { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetBlocksRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a GetBlocksResponse. */ @@ -396,6 +418,13 @@ export namespace blocks { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetBlocksResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace GetBlocksResponse { @@ -578,6 +607,13 @@ export namespace blocks { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for BlockHeader + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } } @@ -673,6 +709,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetPeersRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a GetPeersResponse. */ @@ -763,6 +806,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetPeersResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace GetPeersResponse { @@ -861,6 +911,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Peer + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } @@ -958,6 +1015,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetCommonBlocksRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a GetCommonBlocksResponse. */ @@ -1048,6 +1112,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetCommonBlocksResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace GetCommonBlocksResponse { @@ -1146,6 +1217,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Common + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } @@ -1237,6 +1315,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetStatusRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a GetStatusResponse. */ @@ -1333,6 +1418,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetStatusResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace GetStatusResponse { @@ -1443,6 +1535,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for State + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace State { @@ -1619,6 +1718,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for BlockHeader + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } @@ -1722,6 +1828,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Config + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace Config { @@ -1838,6 +1951,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Network + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } namespace Network { @@ -1936,6 +2056,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Token + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } @@ -2039,6 +2166,13 @@ export namespace peer { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Plugin + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } } @@ -2135,6 +2269,13 @@ export namespace shared { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Headers + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } @@ -2235,6 +2376,13 @@ export namespace transactions { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for PostTransactionsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } /** Properties of a PostTransactionsResponse. */ @@ -2325,5 +2473,12 @@ export namespace transactions { * @returns JSON object */ public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for PostTransactionsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; } } diff --git a/packages/core-p2p/src/socket-server/codecs/proto/protos.js b/packages/core-p2p/src/socket-server/codecs/proto/protos.js index fa117ec886..b2fa43ef55 100644 --- a/packages/core-p2p/src/socket-server/codecs/proto/protos.js +++ b/packages/core-p2p/src/socket-server/codecs/proto/protos.js @@ -121,12 +121,14 @@ $root.blocks = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.block = reader.bytes(); - break; - case 2: - message.headers = $root.shared.Headers.decode(reader, reader.uint32()); - break; + case 1: { + message.block = reader.bytes(); + break; + } + case 2: { + message.headers = $root.shared.Headers.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -188,7 +190,7 @@ $root.blocks = (function() { if (object.block != null) if (typeof object.block === "string") $util.base64.decode(object.block, message.block = $util.newBuffer($util.base64.length(object.block)), 0); - else if (object.block.length) + else if (object.block.length >= 0) message.block = object.block; if (object.headers != null) { if (typeof object.headers !== "object") @@ -239,6 +241,21 @@ $root.blocks = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for PostBlockRequest + * @function getTypeUrl + * @memberof blocks.PostBlockRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PostBlockRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/blocks.PostBlockRequest"; + }; + return PostBlockRequest; })(); @@ -345,12 +362,14 @@ $root.blocks = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.status = reader.bool(); - break; - case 2: - message.height = reader.uint32(); - break; + case 1: { + message.status = reader.bool(); + break; + } + case 2: { + message.height = reader.uint32(); + break; + } default: reader.skipType(tag & 7); break; @@ -449,6 +468,21 @@ $root.blocks = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for PostBlockResponse + * @function getTypeUrl + * @memberof blocks.PostBlockResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PostBlockResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/blocks.PostBlockResponse"; + }; + return PostBlockResponse; })(); @@ -588,21 +622,26 @@ $root.blocks = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.lastBlockHeight = reader.uint32(); - break; - case 2: - message.blockLimit = reader.uint32(); - break; - case 3: - message.headersOnly = reader.bool(); - break; - case 4: - message.serialized = reader.bool(); - break; - case 5: - message.headers = $root.shared.Headers.decode(reader, reader.uint32()); - break; + case 1: { + message.lastBlockHeight = reader.uint32(); + break; + } + case 2: { + message.blockLimit = reader.uint32(); + break; + } + case 3: { + message.headersOnly = reader.bool(); + break; + } + case 4: { + message.serialized = reader.bool(); + break; + } + case 5: { + message.headers = $root.shared.Headers.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -730,6 +769,21 @@ $root.blocks = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetBlocksRequest + * @function getTypeUrl + * @memberof blocks.GetBlocksRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetBlocksRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/blocks.GetBlocksRequest"; + }; + return GetBlocksRequest; })(); @@ -825,9 +879,10 @@ $root.blocks = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.blocks = reader.bytes(); - break; + case 1: { + message.blocks = reader.bytes(); + break; + } default: reader.skipType(tag & 7); break; @@ -884,7 +939,7 @@ $root.blocks = (function() { if (object.blocks != null) if (typeof object.blocks === "string") $util.base64.decode(object.blocks, message.blocks = $util.newBuffer($util.base64.length(object.blocks)), 0); - else if (object.blocks.length) + else if (object.blocks.length >= 0) message.blocks = object.blocks; return message; }; @@ -926,6 +981,21 @@ $root.blocks = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetBlocksResponse + * @function getTypeUrl + * @memberof blocks.GetBlocksResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetBlocksResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/blocks.GetBlocksResponse"; + }; + GetBlocksResponse.BlockHeader = (function() { /** @@ -1183,54 +1253,70 @@ $root.blocks = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.id = reader.string(); - break; - case 2: - message.idHex = reader.string(); - break; - case 3: - message.version = reader.uint32(); - break; - case 4: - message.timestamp = reader.uint32(); - break; - case 5: - message.previousBlock = reader.string(); - break; - case 6: - message.previousBlockHex = reader.string(); - break; - case 7: - message.height = reader.uint32(); - break; - case 8: - message.numberOfTransactions = reader.uint32(); - break; - case 9: - message.totalAmount = reader.string(); - break; - case 10: - message.totalFee = reader.string(); - break; - case 11: - message.reward = reader.string(); - break; - case 12: - message.payloadLength = reader.uint32(); - break; - case 13: - message.payloadHash = reader.string(); - break; - case 14: - message.generatorPublicKey = reader.string(); - break; - case 15: - message.blockSignature = reader.string(); - break; - case 16: - message.transactions = reader.bytes(); - break; + case 1: { + message.id = reader.string(); + break; + } + case 2: { + message.idHex = reader.string(); + break; + } + case 3: { + message.version = reader.uint32(); + break; + } + case 4: { + message.timestamp = reader.uint32(); + break; + } + case 5: { + message.previousBlock = reader.string(); + break; + } + case 6: { + message.previousBlockHex = reader.string(); + break; + } + case 7: { + message.height = reader.uint32(); + break; + } + case 8: { + message.numberOfTransactions = reader.uint32(); + break; + } + case 9: { + message.totalAmount = reader.string(); + break; + } + case 10: { + message.totalFee = reader.string(); + break; + } + case 11: { + message.reward = reader.string(); + break; + } + case 12: { + message.payloadLength = reader.uint32(); + break; + } + case 13: { + message.payloadHash = reader.string(); + break; + } + case 14: { + message.generatorPublicKey = reader.string(); + break; + } + case 15: { + message.blockSignature = reader.string(); + break; + } + case 16: { + message.transactions = reader.bytes(); + break; + } default: reader.skipType(tag & 7); break; @@ -1362,7 +1448,7 @@ $root.blocks = (function() { if (object.transactions != null) if (typeof object.transactions === "string") $util.base64.decode(object.transactions, message.transactions = $util.newBuffer($util.base64.length(object.transactions)), 0); - else if (object.transactions.length) + else if (object.transactions.length >= 0) message.transactions = object.transactions; return message; }; @@ -1450,6 +1536,21 @@ $root.blocks = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for BlockHeader + * @function getTypeUrl + * @memberof blocks.GetBlocksResponse.BlockHeader + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + BlockHeader.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/blocks.GetBlocksResponse.BlockHeader"; + }; + return BlockHeader; })(); @@ -1560,9 +1661,10 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.headers = $root.shared.Headers.decode(reader, reader.uint32()); - break; + case 1: { + message.headers = $root.shared.Headers.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -1657,6 +1759,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetPeersRequest + * @function getTypeUrl + * @memberof peer.GetPeersRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetPeersRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetPeersRequest"; + }; + return GetPeersRequest; })(); @@ -1754,11 +1871,12 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (!(message.peers && message.peers.length)) - message.peers = []; - message.peers.push($root.peer.GetPeersResponse.Peer.decode(reader, reader.uint32())); - break; + case 1: { + if (!(message.peers && message.peers.length)) + message.peers = []; + message.peers.push($root.peer.GetPeersResponse.Peer.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -1865,6 +1983,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetPeersResponse + * @function getTypeUrl + * @memberof peer.GetPeersResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetPeersResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetPeersResponse"; + }; + GetPeersResponse.Peer = (function() { /** @@ -1968,12 +2101,14 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.ip = reader.string(); - break; - case 2: - message.port = reader.uint32(); - break; + case 1: { + message.ip = reader.string(); + break; + } + case 2: { + message.port = reader.uint32(); + break; + } default: reader.skipType(tag & 7); break; @@ -2072,6 +2207,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Peer + * @function getTypeUrl + * @memberof peer.GetPeersResponse.Peer + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Peer.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetPeersResponse.Peer"; + }; + return Peer; })(); @@ -2183,14 +2333,16 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (!(message.ids && message.ids.length)) - message.ids = []; - message.ids.push(reader.string()); - break; - case 2: - message.headers = $root.shared.Headers.decode(reader, reader.uint32()); - break; + case 1: { + if (!(message.ids && message.ids.length)) + message.ids = []; + message.ids.push(reader.string()); + break; + } + case 2: { + message.headers = $root.shared.Headers.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -2306,6 +2458,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetCommonBlocksRequest + * @function getTypeUrl + * @memberof peer.GetCommonBlocksRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetCommonBlocksRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetCommonBlocksRequest"; + }; + return GetCommonBlocksRequest; })(); @@ -2401,9 +2568,10 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.common = $root.peer.GetCommonBlocksResponse.Common.decode(reader, reader.uint32()); - break; + case 1: { + message.common = $root.peer.GetCommonBlocksResponse.Common.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -2498,6 +2666,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetCommonBlocksResponse + * @function getTypeUrl + * @memberof peer.GetCommonBlocksResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetCommonBlocksResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetCommonBlocksResponse"; + }; + GetCommonBlocksResponse.Common = (function() { /** @@ -2601,12 +2784,14 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.height = reader.uint32(); - break; - case 2: - message.id = reader.string(); - break; + case 1: { + message.height = reader.uint32(); + break; + } + case 2: { + message.id = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -2705,6 +2890,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Common + * @function getTypeUrl + * @memberof peer.GetCommonBlocksResponse.Common + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Common.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetCommonBlocksResponse.Common"; + }; + return Common; })(); @@ -2803,9 +3003,10 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.headers = $root.shared.Headers.decode(reader, reader.uint32()); - break; + case 1: { + message.headers = $root.shared.Headers.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -2900,6 +3101,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetStatusRequest + * @function getTypeUrl + * @memberof peer.GetStatusRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetStatusRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusRequest"; + }; + return GetStatusRequest; })(); @@ -3006,12 +3222,14 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.state = $root.peer.GetStatusResponse.State.decode(reader, reader.uint32()); - break; - case 2: - message.config = $root.peer.GetStatusResponse.Config.decode(reader, reader.uint32()); - break; + case 1: { + message.state = $root.peer.GetStatusResponse.State.decode(reader, reader.uint32()); + break; + } + case 2: { + message.config = $root.peer.GetStatusResponse.Config.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -3120,6 +3338,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for GetStatusResponse + * @function getTypeUrl + * @memberof peer.GetStatusResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetStatusResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse"; + }; + GetStatusResponse.State = (function() { /** @@ -3245,18 +3478,22 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.height = reader.uint32(); - break; - case 2: - message.forgingAllowed = reader.bool(); - break; - case 3: - message.currentSlot = reader.uint32(); - break; - case 4: - message.header = $root.peer.GetStatusResponse.State.BlockHeader.decode(reader, reader.uint32()); - break; + case 1: { + message.height = reader.uint32(); + break; + } + case 2: { + message.forgingAllowed = reader.bool(); + break; + } + case 3: { + message.currentSlot = reader.uint32(); + break; + } + case 4: { + message.header = $root.peer.GetStatusResponse.State.BlockHeader.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -3376,6 +3613,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for State + * @function getTypeUrl + * @memberof peer.GetStatusResponse.State + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + State.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse.State"; + }; + State.BlockHeader = (function() { /** @@ -3622,51 +3874,66 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.id = reader.string(); - break; - case 2: - message.idHex = reader.string(); - break; - case 3: - message.version = reader.uint32(); - break; - case 4: - message.timestamp = reader.uint32(); - break; - case 5: - message.previousBlock = reader.string(); - break; - case 6: - message.previousBlockHex = reader.string(); - break; - case 7: - message.height = reader.uint32(); - break; - case 8: - message.numberOfTransactions = reader.uint32(); - break; - case 9: - message.totalAmount = reader.string(); - break; - case 10: - message.totalFee = reader.string(); - break; - case 11: - message.reward = reader.string(); - break; - case 12: - message.payloadLength = reader.uint32(); - break; - case 13: - message.payloadHash = reader.string(); - break; - case 14: - message.generatorPublicKey = reader.string(); - break; - case 15: - message.blockSignature = reader.string(); - break; + case 1: { + message.id = reader.string(); + break; + } + case 2: { + message.idHex = reader.string(); + break; + } + case 3: { + message.version = reader.uint32(); + break; + } + case 4: { + message.timestamp = reader.uint32(); + break; + } + case 5: { + message.previousBlock = reader.string(); + break; + } + case 6: { + message.previousBlockHex = reader.string(); + break; + } + case 7: { + message.height = reader.uint32(); + break; + } + case 8: { + message.numberOfTransactions = reader.uint32(); + break; + } + case 9: { + message.totalAmount = reader.string(); + break; + } + case 10: { + message.totalFee = reader.string(); + break; + } + case 11: { + message.reward = reader.string(); + break; + } + case 12: { + message.payloadLength = reader.uint32(); + break; + } + case 13: { + message.payloadHash = reader.string(); + break; + } + case 14: { + message.generatorPublicKey = reader.string(); + break; + } + case 15: { + message.blockSignature = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -3869,6 +4136,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for BlockHeader + * @function getTypeUrl + * @memberof peer.GetStatusResponse.State.BlockHeader + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + BlockHeader.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse.State.BlockHeader"; + }; + return BlockHeader; })(); @@ -3993,34 +4275,37 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.version = reader.string(); - break; - case 2: - message.network = $root.peer.GetStatusResponse.Config.Network.decode(reader, reader.uint32()); - break; - case 3: - if (message.plugins === $util.emptyObject) - message.plugins = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.peer.GetStatusResponse.Config.Plugin.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; + case 1: { + message.version = reader.string(); + break; + } + case 2: { + message.network = $root.peer.GetStatusResponse.Config.Network.decode(reader, reader.uint32()); + break; + } + case 3: { + if (message.plugins === $util.emptyObject) + message.plugins = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.peer.GetStatusResponse.Config.Plugin.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } } + message.plugins[key] = value; + break; } - message.plugins[key] = value; - break; default: reader.skipType(tag & 7); break; @@ -4152,6 +4437,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Config + * @function getTypeUrl + * @memberof peer.GetStatusResponse.Config + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Config.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse.Config"; + }; + Config.Network = (function() { /** @@ -4288,21 +4588,26 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.name = reader.string(); - break; - case 2: - message.nethash = reader.string(); - break; - case 3: - message.explorer = reader.string(); - break; - case 4: - message.token = $root.peer.GetStatusResponse.Config.Network.Token.decode(reader, reader.uint32()); - break; - case 5: - message.version = reader.uint32(); - break; + case 1: { + message.name = reader.string(); + break; + } + case 2: { + message.nethash = reader.string(); + break; + } + case 3: { + message.explorer = reader.string(); + break; + } + case 4: { + message.token = $root.peer.GetStatusResponse.Config.Network.Token.decode(reader, reader.uint32()); + break; + } + case 5: { + message.version = reader.uint32(); + break; + } default: reader.skipType(tag & 7); break; @@ -4430,6 +4735,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Network + * @function getTypeUrl + * @memberof peer.GetStatusResponse.Config.Network + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Network.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse.Config.Network"; + }; + Network.Token = (function() { /** @@ -4533,12 +4853,14 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.name = reader.string(); - break; - case 2: - message.symbol = reader.string(); - break; + case 1: { + message.name = reader.string(); + break; + } + case 2: { + message.symbol = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -4637,6 +4959,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Token + * @function getTypeUrl + * @memberof peer.GetStatusResponse.Config.Network.Token + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Token.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse.Config.Network.Token"; + }; + return Token; })(); @@ -4757,15 +5094,18 @@ $root.peer = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.port = reader.uint32(); - break; - case 2: - message.enabled = reader.bool(); - break; - case 3: - message.estimateTotalCount = reader.bool(); - break; + case 1: { + message.port = reader.uint32(); + break; + } + case 2: { + message.enabled = reader.bool(); + break; + } + case 3: { + message.estimateTotalCount = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -4872,6 +5212,21 @@ $root.peer = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Plugin + * @function getTypeUrl + * @memberof peer.GetStatusResponse.Config.Plugin + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Plugin.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/peer.GetStatusResponse.Config.Plugin"; + }; + return Plugin; })(); @@ -4985,9 +5340,10 @@ $root.shared = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.version = reader.string(); - break; + case 1: { + message.version = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -5077,6 +5433,21 @@ $root.shared = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for Headers + * @function getTypeUrl + * @memberof shared.Headers + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Headers.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/shared.Headers"; + }; + return Headers; })(); @@ -5195,12 +5566,14 @@ $root.transactions = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - message.transactions = reader.bytes(); - break; - case 2: - message.headers = $root.shared.Headers.decode(reader, reader.uint32()); - break; + case 1: { + message.transactions = reader.bytes(); + break; + } + case 2: { + message.headers = $root.shared.Headers.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -5262,7 +5635,7 @@ $root.transactions = (function() { if (object.transactions != null) if (typeof object.transactions === "string") $util.base64.decode(object.transactions, message.transactions = $util.newBuffer($util.base64.length(object.transactions)), 0); - else if (object.transactions.length) + else if (object.transactions.length >= 0) message.transactions = object.transactions; if (object.headers != null) { if (typeof object.headers !== "object") @@ -5313,6 +5686,21 @@ $root.transactions = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for PostTransactionsRequest + * @function getTypeUrl + * @memberof transactions.PostTransactionsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PostTransactionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/transactions.PostTransactionsRequest"; + }; + return PostTransactionsRequest; })(); @@ -5410,11 +5798,12 @@ $root.transactions = (function() { while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { - case 1: - if (!(message.accept && message.accept.length)) - message.accept = []; - message.accept.push(reader.string()); - break; + case 1: { + if (!(message.accept && message.accept.length)) + message.accept = []; + message.accept.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -5516,6 +5905,21 @@ $root.transactions = (function() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; + /** + * Gets the default type url for PostTransactionsResponse + * @function getTypeUrl + * @memberof transactions.PostTransactionsResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PostTransactionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/transactions.PostTransactionsResponse"; + }; + return PostTransactionsResponse; })(); diff --git a/packages/core-p2p/src/socket-server/controllers/internal.ts b/packages/core-p2p/src/socket-server/controllers/internal.ts index f5ee19632f..8e6dfa2049 100644 --- a/packages/core-p2p/src/socket-server/controllers/internal.ts +++ b/packages/core-p2p/src/socket-server/controllers/internal.ts @@ -28,9 +28,12 @@ export class InternalController extends Controller { private readonly collator!: Contracts.TransactionPool.Collator; public async acceptNewPeer(request: Hapi.Request, h: Hapi.ResponseToolkit): Promise { - return this.peerProcessor.validateAndAcceptPeer({ - ip: (request.payload as any).ip, - } as Contracts.P2P.Peer); + return this.peerProcessor.validateAndAcceptPeer( + { + ip: (request.payload as any).ip, + } as Contracts.P2P.Peer, + {}, + ); } public emitEvent(request: Hapi.Request, h: Hapi.ResponseToolkit): boolean { diff --git a/packages/core-p2p/src/socket-server/plugins/accept-peer.ts b/packages/core-p2p/src/socket-server/plugins/accept-peer.ts index 9d538cf8f0..b6350c7541 100644 --- a/packages/core-p2p/src/socket-server/plugins/accept-peer.ts +++ b/packages/core-p2p/src/socket-server/plugins/accept-peer.ts @@ -26,10 +26,14 @@ export class AcceptPeerPlugin { type: "onPreHandler", async method(request, h) { if (routesConfigByPath[request.path]) { + const headers = request.payload?.headers || {}; const peerIp = request.socket ? getPeerIp(request.socket) : request.info.remoteAddress; - peerProcessor.validateAndAcceptPeer({ - ip: peerIp, - } as Contracts.P2P.Peer); + peerProcessor.validateAndAcceptPeer( + { + ip: peerIp, + } as Contracts.P2P.Peer, + headers, + ); } return h.continue; }, diff --git a/packages/core-p2p/src/socket-server/plugins/await-block.ts b/packages/core-p2p/src/socket-server/plugins/await-block.ts index 217c9e5f5a..a568aa3329 100644 --- a/packages/core-p2p/src/socket-server/plugins/await-block.ts +++ b/packages/core-p2p/src/socket-server/plugins/await-block.ts @@ -33,7 +33,7 @@ export class AwaitBlockPlugin { return h.continue; } - await new Promise((resolve) => { + await new Promise((resolve) => { queue.once("drain", () => { resolve(); }); diff --git a/packages/core-p2p/src/socket-server/plugins/close-connection.ts b/packages/core-p2p/src/socket-server/plugins/close-connection.ts new file mode 100644 index 0000000000..02aaa794ff --- /dev/null +++ b/packages/core-p2p/src/socket-server/plugins/close-connection.ts @@ -0,0 +1,26 @@ +import { isBoom } from "@hapi/boom"; +import { Container, Contracts } from "@arkecosystem/core-kernel"; + +@Container.injectable() +export class CloseConnectionPlugin { + @Container.inject(Container.Identifiers.PeerProcessor) + private readonly peerProcessor!: Contracts.P2P.PeerProcessor; + + public register(server) { + const peerProcessor = this.peerProcessor; + + server.ext({ + type: "onPreResponse", + async method(request, h) { + const isWhitelisted: boolean = peerProcessor.isWhitelisted({ + ip: request.info.remoteAddress, + } as Contracts.P2P.Peer); + + if (!isWhitelisted && isBoom(request.response)) { + return h.response().header("connection", "close").code(request.response.output.statusCode); + } + return h.continue; + }, + }); + } +} diff --git a/packages/core-p2p/src/socket-server/server.ts b/packages/core-p2p/src/socket-server/server.ts index 04dd542841..7d59975954 100644 --- a/packages/core-p2p/src/socket-server/server.ts +++ b/packages/core-p2p/src/socket-server/server.ts @@ -5,6 +5,7 @@ import { plugin as hapiNesPlugin } from "../hapi-nes"; import { AcceptPeerPlugin } from "./plugins/accept-peer"; import { AwaitBlockPlugin } from "./plugins/await-block"; import { CodecPlugin } from "./plugins/codec"; +import { CloseConnectionPlugin } from "./plugins/close-connection"; import { IsAppReadyPlugin } from "./plugins/is-app-ready"; import { RateLimitPlugin } from "./plugins/rate-limit"; import { ValidatePlugin } from "./plugins/validate"; @@ -85,6 +86,9 @@ export class Server { // onPreHandler this.app.resolve(AcceptPeerPlugin).register(this.server); + + // onPreResponse + this.app.resolve(CloseConnectionPlugin).register(this.server); } /** diff --git a/packages/core-p2p/src/utils/is-valid-version.ts b/packages/core-p2p/src/utils/is-valid-version.ts index e6db866ee9..cd0316216f 100644 --- a/packages/core-p2p/src/utils/is-valid-version.ts +++ b/packages/core-p2p/src/utils/is-valid-version.ts @@ -2,7 +2,6 @@ import { Container, Contracts, Providers } from "@arkecosystem/core-kernel"; import { Managers } from "@arkecosystem/crypto"; import semver from "semver"; -// todo: review the implementation export const isValidVersion = (app: Contracts.Kernel.Application, peer: Contracts.P2P.Peer): boolean => { if (!peer.version) { return false; @@ -12,25 +11,44 @@ export const isValidVersion = (app: Contracts.Kernel.Application, peer: Contract return false; } - let minimumVersions: string[]; - const milestones: Record = Managers.configManager.getMilestone(); + const includePrerelease: boolean = Managers.configManager.get("network.name") !== "mainnet"; + + return ( + isValidConfigVersion(app, peer.version, includePrerelease) && + isValidMilestoneVersion(peer.version, includePrerelease) + ); +}; + +const isValidConfigVersion = ( + app: Contracts.Kernel.Application, + version: string, + includePrerelease: boolean, +): boolean => { + const configuration = app.getTagged( + Container.Identifiers.PluginConfiguration, + "plugin", + "@arkecosystem/core-p2p", + ); + + const minimumVersions = configuration.getOptional("minimumVersions", []); - const { p2p } = milestones; + if (minimumVersions.length > 0) { + return minimumVersions.some((minimumVersion: string) => + semver.satisfies(version, minimumVersion, { includePrerelease }), + ); + } + + return true; +}; + +const isValidMilestoneVersion = (version: string, includePrerelease: boolean): boolean => { + const { p2p } = Managers.configManager.getMilestone(); if (p2p && Array.isArray(p2p.minimumVersions) && p2p.minimumVersions.length > 0) { - minimumVersions = p2p.minimumVersions; - } else { - const configuration = app.getTagged( - Container.Identifiers.PluginConfiguration, - "plugin", - "@arkecosystem/core-p2p", + return p2p.minimumVersions.some((minimumVersion: string) => + semver.satisfies(version, minimumVersion, { includePrerelease }), ); - minimumVersions = configuration.getOptional("minimumVersions", []); } - const includePrerelease: boolean = Managers.configManager.get("network.name") !== "mainnet"; - return minimumVersions.some((minimumVersion: string) => - // @ts-ignore - check why the peer.version errors even though we exit early - semver.satisfies(peer.version, minimumVersion, { includePrerelease }), - ); + return true; }; diff --git a/packages/core-snapshots/package.json b/packages/core-snapshots/package.json index 4822586073..036c37f2a9 100644 --- a/packages/core-snapshots/package.json +++ b/packages/core-snapshots/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-snapshots", - "version": "3.0.6", + "version": "3.12.0", "description": "Provides live local streamed snapshots functionality for ARK Core", "license": "MIT", "contributors": [ @@ -20,12 +20,12 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/crypto": "3.0.6", + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/crypto": "3.12.0", "bytebuffer": "5.0.1", "fs-extra": "8.1.0", - "joi": "17.4.2", + "joi": "17.12.1", "msgpack-lite": "0.1.26", "ora": "4.1.1", "pg-query-stream": "3.4.2", diff --git a/packages/core-snapshots/src/database-service.ts b/packages/core-snapshots/src/database-service.ts index 9bafe944dd..136f1b2d97 100644 --- a/packages/core-snapshots/src/database-service.ts +++ b/packages/core-snapshots/src/database-service.ts @@ -240,7 +240,7 @@ export class SnapshotDatabaseService implements Database.DatabaseService { } await Promise.all([ - new Promise((resolve) => { + new Promise((resolve) => { if (!transactionsQueue.isRunning()) { resolve(); } else { @@ -249,7 +249,7 @@ export class SnapshotDatabaseService implements Database.DatabaseService { }); } }), - new Promise((resolve) => { + new Promise((resolve) => { if (!roundsQueue.isRunning()) { resolve(); } else { diff --git a/packages/core-snapshots/src/workers/actions/abstract-worker-action.ts b/packages/core-snapshots/src/workers/actions/abstract-worker-action.ts index 8d596ca919..2686a3d102 100644 --- a/packages/core-snapshots/src/workers/actions/abstract-worker-action.ts +++ b/packages/core-snapshots/src/workers/actions/abstract-worker-action.ts @@ -81,7 +81,7 @@ export abstract class AbstractWorkerAction implements Worker.WorkerAction { } } - public abstract async start(): Promise; + public abstract start(): Promise; public abstract sync(data: Worker.WorkerSyncData): void; } diff --git a/packages/core-snapshots/src/workers/actions/test-worker-action.ts b/packages/core-snapshots/src/workers/actions/test-worker-action.ts index 42d1e0366c..d70744407c 100644 --- a/packages/core-snapshots/src/workers/actions/test-worker-action.ts +++ b/packages/core-snapshots/src/workers/actions/test-worker-action.ts @@ -34,12 +34,12 @@ export class TestWorkerAction implements Worker.WorkerAction { action: "started", }); - await new Promise((resolve) => { + await new Promise((resolve) => { this.resume = () => { resolve(); }; }); - await new Promise((resolve) => { + await new Promise((resolve) => { this.resume = () => { resolve(); }; diff --git a/packages/core-snapshots/src/workers/worker-wrapper.ts b/packages/core-snapshots/src/workers/worker-wrapper.ts index d8f8283ac1..44cbfe1ff7 100644 --- a/packages/core-snapshots/src/workers/worker-wrapper.ts +++ b/packages/core-snapshots/src/workers/worker-wrapper.ts @@ -44,7 +44,7 @@ export class WorkerWrapper extends EventEmitter { } public sync(data: WorkerSyncData): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { if (this.isDone) { resolve(); return; diff --git a/packages/core-state/package.json b/packages/core-state/package.json index 2f879ecc24..5ee520cabf 100644 --- a/packages/core-state/package.json +++ b/packages/core-state/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-state", - "version": "3.0.6", + "version": "3.12.0", "description": "State Management for ARK Core", "license": "MIT", "contributors": [ @@ -22,12 +22,12 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "immutable": "4.0.0-rc.14", - "joi": "17.4.2" + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "immutable": "5.0.0-beta.5", + "joi": "17.12.1" }, "engines": { "node": ">=10.x" diff --git a/packages/core-state/src/block-state.ts b/packages/core-state/src/block-state.ts index 10641193ae..b185f41b31 100644 --- a/packages/core-state/src/block-state.ts +++ b/packages/core-state/src/block-state.ts @@ -24,14 +24,7 @@ export class BlockState implements Contracts.State.BlockState { const previousBlock = this.state.getLastBlock(); const forgerWallet = this.walletRepository.findByPublicKey(block.data.generatorPublicKey); - /** - * TODO: side-effect of findByPublicKey is that it creates a wallet if one isn't found - is that correct? - * If so, this code can be deleted. - */ - // if (!forgerWallet) { - // const msg = `Failed to lookup forger '${block.data.generatorPublicKey}' of block '${block.data.id}'.`; - // this.app.terminate(msg); - // } + const appliedTransactions: Interfaces.ITransaction[] = []; try { for (const transaction of block.transactions) { @@ -56,14 +49,6 @@ export class BlockState implements Contracts.State.BlockState { public async revertBlock(block: Interfaces.IBlock): Promise { const forgerWallet = this.walletRepository.findByPublicKey(block.data.generatorPublicKey); - /** - * TODO: side-effect of findByPublicKey is that it creates a wallet if one isn't found - is that correct? - * If so, this code can be deleted. - */ - // if (!forgerWallet) { - // const msg = `Failed to lookup forger '${block.data.generatorPublicKey}' of block '${block.data.id}'.`; - // this.app.terminate(msg); - // } const revertedTransactions: Interfaces.ITransaction[] = []; try { diff --git a/packages/core-state/src/state-builder.ts b/packages/core-state/src/state-builder.ts index c5974cccf4..1c478f39db 100644 --- a/packages/core-state/src/state-builder.ts +++ b/packages/core-state/src/state-builder.ts @@ -10,9 +10,11 @@ export class StateBuilder { private readonly app!: Application; @Container.inject(Container.Identifiers.DatabaseBlockRepository) + @Container.tagged("connection", "default") private blockRepository!: Repositories.BlockRepository; @Container.inject(Container.Identifiers.DatabaseTransactionRepository) + @Container.tagged("connection", "default") private transactionRepository!: Repositories.TransactionRepository; @Container.inject(Container.Identifiers.WalletRepository) diff --git a/packages/core-state/src/wallets/wallet-repository-copy-on-write.ts b/packages/core-state/src/wallets/wallet-repository-copy-on-write.ts index b7e2ab53cd..ce4dfe6a4e 100644 --- a/packages/core-state/src/wallets/wallet-repository-copy-on-write.ts +++ b/packages/core-state/src/wallets/wallet-repository-copy-on-write.ts @@ -14,7 +14,14 @@ export class WalletRepositoryCopyOnWrite extends WalletRepository { public findByAddress(address: string): Contracts.State.Wallet { if (address && !this.hasByAddress(address)) { - this.cloneWallet(this.blockchainWalletRepository, this.blockchainWalletRepository.findByAddress(address)); + if (this.blockchainWalletRepository.hasByAddress(address)) { + this.cloneWallet( + this.blockchainWalletRepository, + this.blockchainWalletRepository.findByAddress(address), + ); + } else { + super.findByAddress(address); + } } return this.findByIndex(Contracts.State.WalletIndexes.Addresses, address)!; } diff --git a/packages/core-test-framework/package.json b/packages/core-test-framework/package.json index fc110ca153..6807fa5cd6 100644 --- a/packages/core-test-framework/package.json +++ b/packages/core-test-framework/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-test-framework", - "version": "3.0.6", + "version": "3.12.0", "description": "Test Framework for ARK Core", "license": "MIT", "contributors": [ @@ -21,25 +21,25 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core": "3.0.6", - "@arkecosystem/core-api": "3.0.6", - "@arkecosystem/core-blockchain": "3.0.6", - "@arkecosystem/core-cli": "3.0.6", - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-forger": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-magistrate-crypto": "3.0.6", - "@arkecosystem/core-p2p": "3.0.6", - "@arkecosystem/core-state": "3.0.6", - "@arkecosystem/crypto": "3.0.6", + "@arkecosystem/core": "3.12.0", + "@arkecosystem/core-api": "3.12.0", + "@arkecosystem/core-blockchain": "3.12.0", + "@arkecosystem/core-cli": "3.12.0", + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-forger": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-magistrate-crypto": "3.12.0", + "@arkecosystem/core-p2p": "3.12.0", + "@arkecosystem/core-state": "3.12.0", + "@arkecosystem/crypto": "3.12.0", "bip39": "3.0.4", "bs58": "4.0.1", "bytebuffer": "5.0.1", - "chance": "1.1.8", + "chance": "1.1.11", "env-paths": "2.2.0", "fast-memoize": "2.5.2", "fs-extra": "8.1.0", - "got": "11.8.2", + "got": "11.8.5", "jest-extended": "0.11.5", "lodash.clonedeep": "4.5.0", "tmp": "0.2.1", diff --git a/packages/core-test-framework/src/app/generators/crypto.ts b/packages/core-test-framework/src/app/generators/crypto.ts index a51219a3d2..a51477bd63 100644 --- a/packages/core-test-framework/src/app/generators/crypto.ts +++ b/packages/core-test-framework/src/app/generators/crypto.ts @@ -125,6 +125,11 @@ export class CryptoGenerator extends Generator { aip11: true, aip37: true, htlcEnabled: true, + blockBurnAddress: true, + blsPublicKeyRegistrationEnabled: true, + multiSignatureRegistrationEnabled: true, + multiSignatureSendingEnabled: true, + multiSignatureReceivingEnabled: true, }, { height: rewardHeight, @@ -224,7 +229,7 @@ export class CryptoGenerator extends Generator { private formatGenesisTransaction(transaction, wallet: Wallet) { Object.assign(transaction, { - fee: "0", + fee: Utils.BigNumber.make("0"), timestamp: 0, }); diff --git a/packages/core-transaction-pool/package.json b/packages/core-transaction-pool/package.json index 85d0345f70..8f285614ea 100644 --- a/packages/core-transaction-pool/package.json +++ b/packages/core-transaction-pool/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-transaction-pool", - "version": "3.0.6", + "version": "3.12.0", "description": "Transaction Pool Manager for ARK Core", "license": "MIT", "contributors": [ @@ -25,16 +25,15 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "better-sqlite3": "7.4.3", - "bytebuffer": "5.0.1", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "better-sqlite3": "9.3.0", "fs-extra": "8.1.0", - "joi": "17.4.2" + "joi": "17.12.1" }, "devDependencies": { - "@types/better-sqlite3": "5.4.3", + "@types/better-sqlite3": "7.6.9", "@types/fs-extra": "8.1.2" }, "engines": { diff --git a/packages/core-transaction-pool/src/actions/index.ts b/packages/core-transaction-pool/src/actions/index.ts index 70494847b6..ef1bdd7762 100644 --- a/packages/core-transaction-pool/src/actions/index.ts +++ b/packages/core-transaction-pool/src/actions/index.ts @@ -2,3 +2,5 @@ export { ApplyTransactionAction } from "./apply-transaction"; export { RevertTransactionAction } from "./revert-transaction"; export { ThrowIfCannotEnterPoolAction } from "./throw-if-cannot-enter-pool"; export { VerifyTransactionAction } from "./verify-transaction"; +export { OnPoolEnterAction } from "./on-pool-enter"; +export { OnPoolLeaveAction } from "./on-pool-leave"; diff --git a/packages/core-transaction-pool/src/actions/on-pool-enter.ts b/packages/core-transaction-pool/src/actions/on-pool-enter.ts new file mode 100644 index 0000000000..80f2eccc42 --- /dev/null +++ b/packages/core-transaction-pool/src/actions/on-pool-enter.ts @@ -0,0 +1,12 @@ +import { Services, Types } from "@arkecosystem/core-kernel"; +import { Handlers } from "@arkecosystem/core-transactions"; +import { Interfaces } from "@arkecosystem/crypto"; + +export class OnPoolEnterAction extends Services.Triggers.Action { + public async execute(args: Types.ActionArguments): Promise { + const handler: Handlers.TransactionHandler = args.handler; + const transaction: Interfaces.ITransaction = args.transaction; + + handler.onPoolEnter(transaction); + } +} diff --git a/packages/core-transaction-pool/src/actions/on-pool-leave.ts b/packages/core-transaction-pool/src/actions/on-pool-leave.ts new file mode 100644 index 0000000000..1c461b800e --- /dev/null +++ b/packages/core-transaction-pool/src/actions/on-pool-leave.ts @@ -0,0 +1,12 @@ +import { Services, Types } from "@arkecosystem/core-kernel"; +import { Handlers } from "@arkecosystem/core-transactions"; +import { Interfaces } from "@arkecosystem/crypto"; + +export class OnPoolLeaveAction extends Services.Triggers.Action { + public async execute(args: Types.ActionArguments): Promise { + const handler: Handlers.TransactionHandler = args.handler; + const transaction: Interfaces.ITransaction = args.transaction; + + handler.onPoolLeave(transaction); + } +} diff --git a/packages/core-transaction-pool/src/mempool-index-registry.ts b/packages/core-transaction-pool/src/mempool-index-registry.ts new file mode 100644 index 0000000000..7025a53679 --- /dev/null +++ b/packages/core-transaction-pool/src/mempool-index-registry.ts @@ -0,0 +1,33 @@ +import { Container, Contracts } from "@arkecosystem/core-kernel"; + +import { MempoolIndex } from "./mempool-index"; + +@Container.injectable() +export class MempoolIndexRegistry implements Contracts.TransactionPool.MempoolIndexRegistry { + @Container.multiInject(Container.Identifiers.TransactionPoolMempoolIndex) + @Container.optional() + private readonly indexNames?: string[]; + + private readonly indexes: Map = new Map(); + + @Container.postConstruct() + public initialize(): void { + for (const indexName of this.indexNames || []) { + this.indexes.set(indexName, new MempoolIndex()); + } + } + + public get(indexName: string): MempoolIndex { + if (this.indexes.has(indexName)) { + return this.indexes.get(indexName)!; + } + + throw new Error(`Index ${indexName} does not exists`); + } + + public clear(): void { + for (const index of this.indexes.values()) { + index.clear(); + } + } +} diff --git a/packages/core-transaction-pool/src/mempool-index.ts b/packages/core-transaction-pool/src/mempool-index.ts new file mode 100644 index 0000000000..7e2858863f --- /dev/null +++ b/packages/core-transaction-pool/src/mempool-index.ts @@ -0,0 +1,29 @@ +import { Contracts, Utils } from "@arkecosystem/core-kernel"; +import { Interfaces } from "@arkecosystem/crypto"; + +export class MempoolIndex implements Contracts.TransactionPool.MempoolIndex { + private keyToTransaction: Map = new Map(); + + public set(key: string, transaction: Interfaces.ITransaction): void { + this.keyToTransaction.set(key, transaction); + } + + public has(key: string): boolean { + return this.keyToTransaction.has(key); + } + + public get(key: string): Interfaces.ITransaction { + const transaction = this.keyToTransaction.get(key); + Utils.assert.defined(transaction); + + return transaction; + } + + public forget(key: string): void { + this.keyToTransaction.delete(key); + } + + public clear(): void { + this.keyToTransaction.clear(); + } +} diff --git a/packages/core-transaction-pool/src/mempool.ts b/packages/core-transaction-pool/src/mempool.ts index 392344e671..5e4d172b12 100644 --- a/packages/core-transaction-pool/src/mempool.ts +++ b/packages/core-transaction-pool/src/mempool.ts @@ -1,8 +1,15 @@ import { Container, Contracts, Utils as AppUtils } from "@arkecosystem/core-kernel"; +import { Handlers } from "@arkecosystem/core-transactions"; import { Identities, Interfaces } from "@arkecosystem/crypto"; @Container.injectable() export class Mempool implements Contracts.TransactionPool.Mempool { + @Container.inject(Container.Identifiers.Application) + private readonly app!: Contracts.Kernel.Application; + + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; + @Container.inject(Container.Identifiers.LogService) private readonly logger!: Contracts.Kernel.Logger; @@ -44,12 +51,7 @@ export class Mempool implements Contracts.TransactionPool.Mempool { try { await senderMempool.addTransaction(transaction); } finally { - if (senderMempool.isDisposable()) { - this.senderMempools.delete(transaction.data.senderPublicKey); - this.logger.debug( - `${Identities.Address.fromPublicKey(transaction.data.senderPublicKey)} state disposed`, - ); - } + this.removeDisposableMempool(transaction.data.senderPublicKey); } } @@ -62,30 +64,94 @@ export class Mempool implements Contracts.TransactionPool.Mempool { try { return await senderMempool.removeTransaction(id); } finally { - if (senderMempool.isDisposable()) { - this.senderMempools.delete(senderPublicKey); - this.logger.debug(`${Identities.Address.fromPublicKey(senderPublicKey)} state disposed`); - } + this.removeDisposableMempool(senderPublicKey); } } - public async removeForgedTransaction(senderPublicKey: string, id: string): Promise { - const senderMempool = this.senderMempools.get(senderPublicKey); - if (!senderMempool) { - return []; + public async applyBlock(block: Interfaces.IBlock): Promise { + const sendersForReadd: Set = new Set(); + + const handlerRegistry = this.app.getTagged( + Container.Identifiers.TransactionHandlerRegistry, + "state", + "copy-on-write", + ); + + for (const transaction of block.transactions) { + AppUtils.assert.defined(transaction.id); + AppUtils.assert.defined(transaction.data.senderPublicKey); + + const handler: Handlers.TransactionHandler = await handlerRegistry.getActivatedHandlerForData( + transaction.data, + ); + + const senderMempool = this.senderMempools.get(transaction.data.senderPublicKey); + if (senderMempool) { + if (await senderMempool.removeForgedTransaction(transaction.id)) { + await handler.onPoolLeave(transaction); + this.logger.debug(`Removed forged ${transaction}`); + this.removeDisposableMempool(transaction.data.senderPublicKey); + } else { + sendersForReadd.add(transaction.data.senderPublicKey); + } + } + + for (const invalidTransaction of await handler.getInvalidPoolTransactions(transaction)) { + AppUtils.assert.defined(invalidTransaction.data.senderPublicKey); + sendersForReadd.add(invalidTransaction.data.senderPublicKey); + } } - try { - return await senderMempool.removeForgedTransaction(id); - } finally { - if (senderMempool.isDisposable()) { - this.senderMempools.delete(senderPublicKey); - this.logger.debug(`${Identities.Address.fromPublicKey(senderPublicKey)} state disposed`); + const removedTransactions: Interfaces.ITransaction[] = []; + + for (const senderPublicKey of sendersForReadd.keys()) { + const senderMempool = this.getSenderMempool(senderPublicKey); + + for (const transaction of senderMempool.getFromLatest()) { + const handler: Handlers.TransactionHandler = await handlerRegistry.getActivatedHandlerForData( + transaction.data, + ); + await handler.onPoolLeave(transaction); + } + + const newSenderMempool = this.createSenderMempool(); + + const transactionsForReadd = [...senderMempool.getFromEarliest()]; + + for (let i = 0; i < transactionsForReadd.length; i++) { + const transaction = transactionsForReadd[i]; + + try { + await newSenderMempool.addTransaction(transaction); + } catch { + transactionsForReadd.slice(i).map((tx) => { + removedTransactions.push(tx); + this.logger.debug(`Removed invalid ${transaction}`); + }); + break; + } + } + + this.senderMempools.delete(senderPublicKey); + if (newSenderMempool.getSize()) { + this.senderMempools.set(senderPublicKey, newSenderMempool); } } + + return removedTransactions; } public flush(): void { this.senderMempools.clear(); + this.mempoolIndexRegistry.clear(); + } + + private removeDisposableMempool(senderPublicKey: string): void { + const senderMempool = this.senderMempools.get(senderPublicKey); + + if (senderMempool && senderMempool.isDisposable()) { + this.senderMempools.delete(senderPublicKey); + this.logger.debug(`${Identities.Address.fromPublicKey(senderPublicKey)} state disposed`); + } } } diff --git a/packages/core-transaction-pool/src/processor.ts b/packages/core-transaction-pool/src/processor.ts index 68e55c7516..888651ae30 100644 --- a/packages/core-transaction-pool/src/processor.ts +++ b/packages/core-transaction-pool/src/processor.ts @@ -1,6 +1,5 @@ import { Container, Contracts } from "@arkecosystem/core-kernel"; -import { Enums, Interfaces, Transactions } from "@arkecosystem/crypto"; -import ByteBuffer from "bytebuffer"; +import { Enums, Interfaces, Transactions, Utils } from "@arkecosystem/crypto"; import { InvalidTransactionDataError } from "./errors"; @@ -90,7 +89,7 @@ export class Processor implements Contracts.TransactionPool.Processor { private async getTransactionFromBuffer(transactionData: Buffer): Promise { try { const transactionCommon = {} as Interfaces.ITransactionData; - const txByteBuffer = ByteBuffer.wrap(transactionData); + const txByteBuffer = new Utils.ByteBuffer(transactionData); Transactions.Deserializer.deserializeCommon(transactionCommon, txByteBuffer); if (this.workerPool.isTypeGroupSupported(transactionCommon.typeGroup || Enums.TransactionTypeGroup.Core)) { diff --git a/packages/core-transaction-pool/src/sender-mempool.ts b/packages/core-transaction-pool/src/sender-mempool.ts index 2972569a7b..f281a594f4 100644 --- a/packages/core-transaction-pool/src/sender-mempool.ts +++ b/packages/core-transaction-pool/src/sender-mempool.ts @@ -88,17 +88,20 @@ export class SenderMempool implements Contracts.TransactionPool.SenderMempool { } } - public async removeForgedTransaction(id: string): Promise { + public async removeForgedTransaction(id: string): Promise { try { this.concurrency++; - const index: number = this.transactions.findIndex((t) => t.id === id); + if (!this.transactions.length) { + throw new Error("No transactions in sender mempool"); + } - if (index !== -1) { - return this.transactions.splice(0, index + 1); - } else { - return []; // TODO: implement this.reboot(); + if (this.transactions[0].id === id) { + this.transactions.shift(); + return true; } + + return false; } finally { this.concurrency--; } diff --git a/packages/core-transaction-pool/src/sender-state.ts b/packages/core-transaction-pool/src/sender-state.ts index c41975b396..f6c2e8426b 100644 --- a/packages/core-transaction-pool/src/sender-state.ts +++ b/packages/core-transaction-pool/src/sender-state.ts @@ -68,6 +68,7 @@ export class SenderState implements Contracts.TransactionPool.SenderState { try { await this.triggers.call("throwIfCannotEnterPool", { handler, transaction }); await this.triggers.call("applyTransaction", { handler, transaction }); + await this.triggers.call("onPoolEnter", { handler, transaction }); } catch (error) { throw new TransactionFailedToApplyError(transaction, error); } @@ -83,6 +84,7 @@ export class SenderState implements Contracts.TransactionPool.SenderState { ); await this.triggers.call("revertTransaction", { handler, transaction }); + await this.triggers.call("onPoolLeave", { handler, transaction }); } catch (error) { this.corrupt = true; throw error; diff --git a/packages/core-transaction-pool/src/service-provider.ts b/packages/core-transaction-pool/src/service-provider.ts index 7da4b0df8b..8928055420 100644 --- a/packages/core-transaction-pool/src/service-provider.ts +++ b/packages/core-transaction-pool/src/service-provider.ts @@ -4,6 +4,8 @@ import Joi from "joi"; import { ApplyTransactionAction, + OnPoolEnterAction, + OnPoolLeaveAction, RevertTransactionAction, ThrowIfCannotEnterPoolAction, VerifyTransactionAction, @@ -12,6 +14,7 @@ import { Collator } from "./collator"; import { DynamicFeeMatcher } from "./dynamic-fee-matcher"; import { ExpirationService } from "./expiration-service"; import { Mempool } from "./mempool"; +import { MempoolIndexRegistry } from "./mempool-index-registry"; import { Processor } from "./processor"; import { Query } from "./query"; import { SenderMempool } from "./sender-mempool"; @@ -100,6 +103,10 @@ export class ServiceProvider extends Providers.ServiceProvider { this.app.bind(Container.Identifiers.TransactionPoolDynamicFeeMatcher).to(DynamicFeeMatcher); this.app.bind(Container.Identifiers.TransactionPoolExpirationService).to(ExpirationService); this.app.bind(Container.Identifiers.TransactionPoolMempool).to(Mempool).inSingletonScope(); + this.app + .bind(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + .to(MempoolIndexRegistry) + .inSingletonScope(); this.app.bind(Container.Identifiers.TransactionPoolProcessor).to(Processor); this.app .bind(Container.Identifiers.TransactionPoolProcessorFactory) @@ -144,5 +151,13 @@ export class ServiceProvider extends Providers.ServiceProvider { this.app .get(Container.Identifiers.TriggerService) .bind("verifyTransaction", new VerifyTransactionAction()); + + this.app + .get(Container.Identifiers.TriggerService) + .bind("onPoolEnter", new OnPoolEnterAction()); + + this.app + .get(Container.Identifiers.TriggerService) + .bind("onPoolLeave", new OnPoolLeaveAction()); } } diff --git a/packages/core-transaction-pool/src/service.ts b/packages/core-transaction-pool/src/service.ts index 6159af5dab..fe243637e7 100644 --- a/packages/core-transaction-pool/src/service.ts +++ b/packages/core-transaction-pool/src/service.ts @@ -27,6 +27,14 @@ export class Service implements Contracts.TransactionPool.Service { @Container.inject(Container.Identifiers.TransactionPoolExpirationService) private readonly expirationService!: Contracts.TransactionPool.ExpirationService; + @Container.inject(Container.Identifiers.TransactionSecondSignatureVerification) + @Container.tagged("state", "copy-on-write") + private readonly secondSignatureVerification!: Contracts.Transactions.SecondSignatureVerification; + + @Container.inject(Container.Identifiers.TransactionMultiSignatureVerification) + @Container.tagged("state", "copy-on-write") + private readonly multiSignatureVerification!: Contracts.Transactions.MultiSignatureVerification; + @Container.inject(Container.Identifiers.EventDispatcherService) private readonly events!: Contracts.Kernel.EventDispatcher; @@ -38,9 +46,7 @@ export class Service implements Contracts.TransactionPool.Service { private disposed = false; public async boot(): Promise { - this.events.listen(Enums.StateEvent.BuilderFinished, this); this.events.listen(Enums.CryptoEvent.MilestoneChanged, this); - this.events.listen(Enums.BlockEvent.Applied, this); if (process.env.CORE_RESET_DATABASE || process.env.CORE_RESET_POOL) { await this.flush(); @@ -49,25 +55,13 @@ export class Service implements Contracts.TransactionPool.Service { public dispose(): void { this.events.forget(Enums.CryptoEvent.MilestoneChanged, this); - this.events.forget(Enums.StateEvent.BuilderFinished, this); - this.events.forget(Enums.BlockEvent.Applied, this); this.disposed = true; } public async handle({ name }): Promise { try { - switch (name) { - case Enums.StateEvent.BuilderFinished: - await this.readdTransactions(); - break; - case Enums.CryptoEvent.MilestoneChanged: - await this.readdTransactions(); - break; - case Enums.BlockEvent.Applied: - await this.cleanUp(); - break; - } + await this.readdTransactions(); } catch (error) { this.logger.critical(error.stack); throw error; @@ -105,6 +99,7 @@ export class Service implements Contracts.TransactionPool.Service { this.events.dispatch(Enums.TransactionEvent.AddedToPool, transaction.data); } catch (error) { this.storage.removeTransaction(transaction.id); + this.clearCache(transaction.id); this.logger.warning(`${transaction} failed to enter pool: ${error.message}`); this.events.dispatch(Enums.TransactionEvent.RejectedByPool, transaction.data); @@ -151,6 +146,7 @@ export class Service implements Contracts.TransactionPool.Service { previouslyForgedSuccesses++; } catch (error) { + this.clearCache(id!); this.logger.debug(`Failed to re-add previously forged transaction ${id}: ${error.message}`); previouslyForgedFailures++; } @@ -172,11 +168,13 @@ export class Service implements Contracts.TransactionPool.Service { previouslyStoredSuccesses++; } catch (error) { this.storage.removeTransaction(id); + this.clearCache(id); this.logger.debug(`Failed to re-add previously stored transaction ${id}: ${error.message}`); previouslyStoredFailures++; } } else { this.storage.removeTransaction(id); + this.clearCache(id); this.logger.debug(`Not re-adding previously stored expired transaction ${id}`); previouslyStoredExpirations++; } @@ -222,45 +220,39 @@ export class Service implements Contracts.TransactionPool.Service { for (const removedTransaction of removedTransactions) { AppUtils.assert.defined(removedTransaction.id); this.storage.removeTransaction(removedTransaction.id); + this.clearCache(removedTransaction.id); this.logger.debug(`Removed ${removedTransaction}`); this.events.dispatch(Enums.TransactionEvent.RemovedFromPool, removedTransaction.data); } if (!removedTransactions.find((t) => t.id === transaction.id)) { this.storage.removeTransaction(transaction.id); + this.clearCache(transaction.id); this.logger.error(`Removed ${transaction} from storage`); this.events.dispatch(Enums.TransactionEvent.RemovedFromPool, transaction.data); } }); } - public async removeForgedTransaction(transaction: Interfaces.ITransaction): Promise { - await this.lock.runNonExclusive(async () => { - if (this.disposed) { - return; - } - - AppUtils.assert.defined(transaction.id); - AppUtils.assert.defined(transaction.data.senderPublicKey); + public async applyBlock(block: Interfaces.IBlock): Promise { + await this.lock.runExclusive(async () => { + const removedTransactions = await this.mempool.applyBlock(block); - if (this.storage.hasTransaction(transaction.id) === false) { - return; + if (removedTransactions.length >= 1) { + this.logger.warning(`${removedTransactions.length} previously stored transactions failed re-adding`); } - const removedTransactions = await this.mempool.removeForgedTransaction( - transaction.data.senderPublicKey, - transaction.id, - ); - for (const removedTransaction of removedTransactions) { AppUtils.assert.defined(removedTransaction.id); this.storage.removeTransaction(removedTransaction.id); - this.logger.debug(`Removed forged ${removedTransaction}`); + this.clearCache(removedTransaction.id); + this.events.dispatch(Enums.TransactionEvent.RemovedFromPool, removedTransaction.data); } - if (!removedTransactions.find((t) => t.id === transaction.id)) { + for (const transaction of block.transactions) { + AppUtils.assert.defined(transaction.id); this.storage.removeTransaction(transaction.id); - this.logger.error(`Removed forged ${transaction} from storage`); + this.clearCache(transaction.id); } }); } @@ -299,6 +291,7 @@ export class Service implements Contracts.TransactionPool.Service { for (const removedTransaction of removedTransactions) { AppUtils.assert.defined(removedTransaction.id); this.storage.removeTransaction(removedTransaction.id); + this.clearCache(removedTransaction.id); this.logger.info(`Removed old ${removedTransaction}`); this.events.dispatch(Enums.TransactionEvent.Expired, removedTransaction.data); } @@ -319,6 +312,7 @@ export class Service implements Contracts.TransactionPool.Service { for (const removedTransaction of removedTransactions) { AppUtils.assert.defined(removedTransaction.id); this.storage.removeTransaction(removedTransaction.id); + this.clearCache(removedTransaction.id); this.logger.info(`Removed expired ${removedTransaction}`); this.events.dispatch(Enums.TransactionEvent.Expired, removedTransaction.data); } @@ -344,6 +338,7 @@ export class Service implements Contracts.TransactionPool.Service { for (const removedTransaction of removedTransactions) { AppUtils.assert.defined(removedTransaction.id); this.storage.removeTransaction(removedTransaction.id); + this.clearCache(removedTransaction.id); this.logger.info(`Removed lowest priority ${removedTransaction}`); this.events.dispatch(Enums.TransactionEvent.RemovedFromPool, removedTransaction.data); } @@ -379,4 +374,9 @@ export class Service implements Contracts.TransactionPool.Service { await this.mempool.addTransaction(transaction); } + + private clearCache(transactionId: string): void { + this.secondSignatureVerification.clear(transactionId); + this.multiSignatureVerification.clear(transactionId); + } } diff --git a/packages/core-transaction-pool/src/storage.ts b/packages/core-transaction-pool/src/storage.ts index 4bce76c160..2e70f09dfb 100644 --- a/packages/core-transaction-pool/src/storage.ts +++ b/packages/core-transaction-pool/src/storage.ts @@ -72,11 +72,11 @@ export class Storage implements Contracts.TransactionPool.Storage { } public getAllTransactions(): Iterable { - return this.getAllTransactionsStmt.all(); + return this.getAllTransactionsStmt.all() as Contracts.TransactionPool.StoredTransaction[]; } public getOldTransactions(height: number): Iterable { - return this.getOldTransactionsStmt.all({ height }); + return this.getOldTransactionsStmt.all({ height }) as Contracts.TransactionPool.StoredTransaction[]; } public removeTransaction(id: string): void { diff --git a/packages/core-transaction-pool/src/worker-script-handler.ts b/packages/core-transaction-pool/src/worker-script-handler.ts index ceae210e19..37a9210cb4 100644 --- a/packages/core-transaction-pool/src/worker-script-handler.ts +++ b/packages/core-transaction-pool/src/worker-script-handler.ts @@ -18,11 +18,11 @@ export class WorkerScriptHandler implements Contracts.TransactionPool.WorkerScri } public async getTransactionFromData( - transactionData: Interfaces.ITransactionData | Buffer, + transactionData: Interfaces.ITransactionData | string, ): Promise { const tx = - transactionData instanceof Buffer - ? Transactions.TransactionFactory.fromBytes(transactionData) + typeof transactionData === "string" + ? Transactions.TransactionFactory.fromBytes(Buffer.from(transactionData, "hex")) : Transactions.TransactionFactory.fromData(transactionData); return { id: tx.id!, serialized: tx.serialized.toString("hex"), isVerified: tx.isVerified }; } diff --git a/packages/core-transaction-pool/src/worker.ts b/packages/core-transaction-pool/src/worker.ts index 8df4bad656..8b0f39079a 100644 --- a/packages/core-transaction-pool/src/worker.ts +++ b/packages/core-transaction-pool/src/worker.ts @@ -32,7 +32,10 @@ export class Worker implements Contracts.TransactionPool.Worker { this.ipcSubprocess.sendAction("setHeight", currentHeight); } - const { id, serialized, isVerified } = await this.ipcSubprocess.sendRequest("getTransactionFromData", transactionData); + const { id, serialized, isVerified } = await this.ipcSubprocess.sendRequest( + "getTransactionFromData", + transactionData instanceof Buffer ? transactionData.toString("hex") : transactionData, + ); const transaction = Transactions.TransactionFactory.fromBytesUnsafe(Buffer.from(serialized, "hex"), id); transaction.isVerified = isVerified; diff --git a/packages/core-transactions/package.json b/packages/core-transactions/package.json index db2df82cc5..9571d9d484 100644 --- a/packages/core-transactions/package.json +++ b/packages/core-transactions/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-transactions", - "version": "3.0.6", + "version": "3.12.0", "description": "Transaction Services for ARK Core", "license": "MIT", "contributors": [ @@ -20,9 +20,10 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/crypto": "3.0.6" + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "joi": "17.12.1" }, "engines": { "node": ">=10.x" diff --git a/packages/core-transactions/src/defaults.ts b/packages/core-transactions/src/defaults.ts new file mode 100644 index 0000000000..70d1184cc1 --- /dev/null +++ b/packages/core-transactions/src/defaults.ts @@ -0,0 +1,3 @@ +export const defaults = { + memoizerCacheSize: process.env.CORE_TRANSACTIONS_MEMOIZER_CACHE_SIZE || 20000, +}; diff --git a/packages/core-transactions/src/enums.ts b/packages/core-transactions/src/enums.ts new file mode 100644 index 0000000000..ffde7c131d --- /dev/null +++ b/packages/core-transactions/src/enums.ts @@ -0,0 +1,7 @@ +export enum MempoolIndexes { + DelegateUsername = "delegate-username", + HtlcClaimTransactionId = "htlc-claim-transaction-id", + HtlcRefundTransactionId = "htlc-refund-transaction-id", + Ipfs = "ipfs", + MultiSignatureAddress = "multi-signature-address", +} diff --git a/packages/core-transactions/src/errors.ts b/packages/core-transactions/src/errors.ts index 8014943e23..edd7bea1a4 100644 --- a/packages/core-transactions/src/errors.ts +++ b/packages/core-transactions/src/errors.ts @@ -95,6 +95,19 @@ export class UnsupportedMultiSignatureTransactionError extends TransactionError } } +export class DisabledMultiSignatureSending extends TransactionError { + public constructor() { + super(`Failed to apply transaction, because sending from multi signature wallets is disabled.`); + } +} + +export class DisabledMultiSignatureReceiving extends TransactionError { + public constructor() { + super(`Failed to apply transaction, because receiving on multi signature wallets is disabled.`); + } +} + + export class InvalidSecondSignatureError extends TransactionError { public constructor() { super(`Failed to apply transaction, because the second signature could not be verified.`); diff --git a/packages/core-transactions/src/handlers/one/delegate-registration.ts b/packages/core-transactions/src/handlers/one/delegate-registration.ts index e62d338cb6..bb7fa487a3 100644 --- a/packages/core-transactions/src/handlers/one/delegate-registration.ts +++ b/packages/core-transactions/src/handlers/one/delegate-registration.ts @@ -1,6 +1,7 @@ import { Container, Contracts, Enums as AppEnums, Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Enums, Interfaces, Transactions, Utils } from "@arkecosystem/crypto"; +import { MempoolIndexes } from "../../enums"; import { NotSupportedForMultiSignatureWalletError, WalletIsAlreadyDelegateError, @@ -15,6 +16,9 @@ export class DelegateRegistrationTransactionHandler extends TransactionHandler { @Container.inject(Container.Identifiers.TransactionPoolQuery) private readonly poolQuery!: Contracts.TransactionPool.Query; + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; + public dependencies(): ReadonlyArray { return []; } @@ -95,13 +99,10 @@ export class DelegateRegistrationTransactionHandler extends TransactionHandler { AppUtils.assert.defined(transaction.data.asset?.delegate?.username); const username: string = transaction.data.asset.delegate.username; - const hasUsername: boolean = this.poolQuery - .getAll() - .whereKind(transaction) - .wherePredicate(/* istanbul ignore next */ (t) => t.data.asset?.delegate?.username === username) - .has(); - if (hasUsername) { + if ( + this.mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername).has(transaction.data.asset.delegate.username) + ) { throw new Contracts.TransactionPool.PoolError( `Delegate registration for "${username}" already in the pool`, "ERR_PENDING", @@ -109,6 +110,31 @@ export class DelegateRegistrationTransactionHandler extends TransactionHandler { } } + public async getInvalidPoolTransactions(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.senderPublicKey); + AppUtils.assert.defined(transaction.data.asset?.delegate?.username); + + const delegateUsernameIndex = this.mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername); + + return delegateUsernameIndex.has(transaction.data.asset.delegate.username) + ? [delegateUsernameIndex.get(transaction.data.asset.delegate.username)] + : []; + } + + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.delegate?.username); + + this.mempoolIndexRegistry + .get(MempoolIndexes.DelegateUsername) + .set(transaction.data.asset.delegate.username, transaction); + } + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.delegate?.username); + + this.mempoolIndexRegistry.get(MempoolIndexes.DelegateUsername).forget(transaction.data.asset.delegate.username); + } + public async applyToSender(transaction: Interfaces.ITransaction): Promise { await super.applyToSender(transaction); diff --git a/packages/core-transactions/src/handlers/one/multi-signature-registration.ts b/packages/core-transactions/src/handlers/one/multi-signature-registration.ts index 121519fbae..15a4dbc8f6 100644 --- a/packages/core-transactions/src/handlers/one/multi-signature-registration.ts +++ b/packages/core-transactions/src/handlers/one/multi-signature-registration.ts @@ -9,6 +9,7 @@ import { TransactionHandler, TransactionHandlerConstructor } from "../transactio @Container.injectable() export class MultiSignatureRegistrationTransactionHandler extends TransactionHandler { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -48,7 +49,8 @@ export class MultiSignatureRegistrationTransactionHandler extends TransactionHan } public async isActivated(): Promise { - return !Managers.configManager.getMilestone().aip11; + const milestone = Managers.configManager.getMilestone(); + return !milestone.aip11 && milestone.multiSignatureRegistrationEnabled; } public async throwIfCannotBeApplied( diff --git a/packages/core-transactions/src/handlers/one/transfer.ts b/packages/core-transactions/src/handlers/one/transfer.ts index 894aa60943..c6e11ce531 100644 --- a/packages/core-transactions/src/handlers/one/transfer.ts +++ b/packages/core-transactions/src/handlers/one/transfer.ts @@ -3,6 +3,9 @@ import { Interfaces, Managers, Transactions } from "@arkecosystem/crypto"; import { isRecipientOnActiveNetwork } from "../../utils"; import { TransactionHandler, TransactionHandlerConstructor } from "../transaction"; +import { + DisabledMultiSignatureReceiving, +} from "../../errors"; // todo: revisit the implementation, container usage and arguments after core-database rework // todo: replace unnecessary function arguments with dependency injection to avoid passing around references @@ -30,6 +33,16 @@ export class TransferTransactionHandler extends TransactionHandler { transaction: Interfaces.ITransaction, sender: Contracts.State.Wallet, ): Promise { + Utils.assert.defined(transaction.data.recipientId); + const recipient: Contracts.State.Wallet = this.walletRepository.findByAddress(transaction.data.recipientId); + + if (recipient.hasMultiSignature()) { + const milestone = Managers.configManager.getMilestone(); + if (milestone.multiSignatureReceivingEnabled !== true) { + throw new DisabledMultiSignatureReceiving(); + } + } + return super.throwIfCannotBeApplied(transaction, sender); } diff --git a/packages/core-transactions/src/handlers/transaction.ts b/packages/core-transactions/src/handlers/transaction.ts index 1e384daa40..2f7adf2f58 100644 --- a/packages/core-transactions/src/handlers/transaction.ts +++ b/packages/core-transactions/src/handlers/transaction.ts @@ -5,6 +5,7 @@ import assert from "assert"; import { ColdWalletError, + DisabledMultiSignatureSending, InsufficientBalanceError, InvalidMultiSignaturesError, InvalidSecondSignatureError, @@ -24,9 +25,11 @@ export abstract class TransactionHandler { protected readonly app!: Contracts.Kernel.Application; @Container.inject(Container.Identifiers.DatabaseBlockRepository) + @Container.tagged("connection", "default") protected readonly blockRepository!: Repositories.BlockRepository; @Container.inject(Container.Identifiers.DatabaseTransactionRepository) + @Container.tagged("connection", "default") protected readonly transactionRepository!: Repositories.TransactionRepository; @Container.inject(Container.Identifiers.WalletRepository) @@ -35,6 +38,12 @@ export abstract class TransactionHandler { @Container.inject(Container.Identifiers.LogService) protected readonly logger!: Contracts.Kernel.Logger; + @Container.inject(Container.Identifiers.TransactionSecondSignatureVerification) + protected readonly secondSignatureVerification!: Contracts.Transactions.SecondSignatureVerification; + + @Container.inject(Container.Identifiers.TransactionMultiSignatureVerification) + protected readonly multiSignatureVerification!: Contracts.Transactions.MultiSignatureVerification; + public async verify(transaction: Interfaces.ITransaction): Promise { AppUtils.assert.defined(transaction.data.senderPublicKey); @@ -70,6 +79,13 @@ export abstract class TransactionHandler { ): Promise { const senderWallet: Contracts.State.Wallet = this.walletRepository.findByAddress(sender.getAddress()); + if (senderWallet.hasMultiSignature()) { + const milestone = Managers.configManager.getMilestone(); + if (milestone.multiSignatureSendingEnabled !== true) { + throw new DisabledMultiSignatureSending(); + } + } + AppUtils.assert.defined(sender.getPublicKey()); if (!this.walletRepository.hasByPublicKey(sender.getPublicKey()!) && senderWallet.getBalance().isZero()) { @@ -163,6 +179,14 @@ export abstract class TransactionHandler { */ public async throwIfCannotEnterPool(transaction: Interfaces.ITransaction): Promise {} + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise {} + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise {} + + public async getInvalidPoolTransactions(transaction: Interfaces.ITransaction): Promise { + return []; + } + /** * @param {Contracts.State.Wallet} wallet * @param {Interfaces.ITransactionData} transaction @@ -175,7 +199,7 @@ export abstract class TransactionHandler { transaction: Interfaces.ITransactionData, multiSignature?: Interfaces.IMultiSignatureAsset, ): boolean { - return Transactions.Verifier.verifySignatures( + return this.multiSignatureVerification.verifySignatures( transaction, multiSignature || wallet.getAttribute("multiSignature"), ); @@ -211,7 +235,9 @@ export abstract class TransactionHandler { throw new UnexpectedSecondSignatureError(); } - if (!Transactions.Verifier.verifySecondSignature(data, dbSender.getAttribute("secondPublicKey"))) { + if ( + !this.secondSignatureVerification.verifySecondSignature(data, dbSender.getAttribute("secondPublicKey")) + ) { throw new InvalidSecondSignatureError(); } } else if (data.secondSignature || data.signSignature) { @@ -300,11 +326,11 @@ export abstract class TransactionHandler { * Wallet logic */ - public abstract async bootstrap(): Promise; + public abstract bootstrap(): Promise; - public abstract async applyToRecipient(transaction: Interfaces.ITransaction): Promise; + public abstract applyToRecipient(transaction: Interfaces.ITransaction): Promise; - public abstract async revertForRecipient(transaction: Interfaces.ITransaction): Promise; + public abstract revertForRecipient(transaction: Interfaces.ITransaction): Promise; } export type TransactionHandlerConstructor = new () => TransactionHandler; diff --git a/packages/core-transactions/src/handlers/two/delegate-registration.ts b/packages/core-transactions/src/handlers/two/delegate-registration.ts index 50c306faff..b0d5cf016b 100644 --- a/packages/core-transactions/src/handlers/two/delegate-registration.ts +++ b/packages/core-transactions/src/handlers/two/delegate-registration.ts @@ -7,6 +7,7 @@ import { One } from "../index"; @Container.injectable() export class DelegateRegistrationTransactionHandler extends One.DelegateRegistrationTransactionHandler { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public getConstructor(): Transactions.TransactionConstructor { diff --git a/packages/core-transactions/src/handlers/two/delegate-resignation.ts b/packages/core-transactions/src/handlers/two/delegate-resignation.ts index 0f1a4afd88..9730f3093a 100644 --- a/packages/core-transactions/src/handlers/two/delegate-resignation.ts +++ b/packages/core-transactions/src/handlers/two/delegate-resignation.ts @@ -13,6 +13,7 @@ export class DelegateResignationTransactionHandler extends TransactionHandler { private readonly poolQuery!: Contracts.TransactionPool.Query; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { diff --git a/packages/core-transactions/src/handlers/two/htlc-claim.ts b/packages/core-transactions/src/handlers/two/htlc-claim.ts index 145b66728d..a6da67ea3d 100644 --- a/packages/core-transactions/src/handlers/two/htlc-claim.ts +++ b/packages/core-transactions/src/handlers/two/htlc-claim.ts @@ -2,14 +2,15 @@ import { Container, Contracts, Utils as AppUtils } from "@arkecosystem/core-kern import { Crypto, Interfaces, Managers, Transactions, Utils } from "@arkecosystem/crypto"; import { strict } from "assert"; +import { MempoolIndexes } from "../../enums"; import { HtlcLockExpiredError, HtlcLockTransactionNotFoundError, HtlcSecretHashMismatchError } from "../../errors"; import { TransactionHandler, TransactionHandlerConstructor } from "../transaction"; import { HtlcLockTransactionHandler } from "./htlc-lock"; @Container.injectable() export class HtlcClaimTransactionHandler extends TransactionHandler { - @Container.inject(Container.Identifiers.TransactionPoolQuery) - private readonly poolQuery!: Contracts.TransactionPool.Query; + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; public dependencies(): ReadonlyArray { return [HtlcLockTransactionHandler]; @@ -93,13 +94,11 @@ export class HtlcClaimTransactionHandler extends TransactionHandler { ); } - const hasClaim: boolean = this.poolQuery - .getAll() - .whereKind(transaction) - .wherePredicate(/* istanbul ignore next */ (t) => t.data.asset?.claim?.lockTransactionId === lockId) - .has(); - - if (hasClaim) { + if ( + this.mempoolIndexRegistry + .get(MempoolIndexes.HtlcClaimTransactionId) + .has(transaction.data.asset.claim.lockTransactionId) + ) { throw new Contracts.TransactionPool.PoolError( `HtlcClaim for "${lockId}" already in the pool`, "ERR_PENDING", @@ -107,6 +106,32 @@ export class HtlcClaimTransactionHandler extends TransactionHandler { } } + public async getInvalidPoolTransactions(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.claim?.lockTransactionId); + + const htlcClaimTransactionIdIndex = this.mempoolIndexRegistry.get(MempoolIndexes.HtlcClaimTransactionId); + + return htlcClaimTransactionIdIndex.has(transaction.data.asset.claim.lockTransactionId) + ? [htlcClaimTransactionIdIndex.get(transaction.data.asset.claim.lockTransactionId)] + : []; + } + + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.claim?.lockTransactionId); + + this.mempoolIndexRegistry + .get(MempoolIndexes.HtlcClaimTransactionId) + .set(transaction.data.asset.claim.lockTransactionId, transaction); + } + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.claim?.lockTransactionId); + + this.mempoolIndexRegistry + .get(MempoolIndexes.HtlcClaimTransactionId) + .forget(transaction.data.asset.claim.lockTransactionId); + } + public async applyToSender(transaction: Interfaces.ITransaction): Promise { AppUtils.assert.defined(transaction.data.senderPublicKey); diff --git a/packages/core-transactions/src/handlers/two/htlc-refund.ts b/packages/core-transactions/src/handlers/two/htlc-refund.ts index 1a24dcdc5a..cb242d9d68 100644 --- a/packages/core-transactions/src/handlers/two/htlc-refund.ts +++ b/packages/core-transactions/src/handlers/two/htlc-refund.ts @@ -2,14 +2,15 @@ import { Container, Contracts, Utils as AppUtils } from "@arkecosystem/core-kern import { Interfaces, Managers, Transactions, Utils } from "@arkecosystem/crypto"; import assert from "assert"; +import { MempoolIndexes } from "../../enums"; import { HtlcLockNotExpiredError, HtlcLockTransactionNotFoundError } from "../../errors"; import { TransactionHandler, TransactionHandlerConstructor } from "../transaction"; import { HtlcLockTransactionHandler } from "./htlc-lock"; @Container.injectable() export class HtlcRefundTransactionHandler extends TransactionHandler { - @Container.inject(Container.Identifiers.TransactionPoolQuery) - private readonly poolQuery!: Contracts.TransactionPool.Query; + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; public dependencies(): ReadonlyArray { return [HtlcLockTransactionHandler]; @@ -87,13 +88,11 @@ export class HtlcRefundTransactionHandler extends TransactionHandler { ); } - const hasRefund = this.poolQuery - .getAll() - .whereKind(transaction) - .wherePredicate(/* istanbul ignore next */ (t) => t.data.asset?.refund?.lockTransactionId === lockId) - .has(); - - if (hasRefund) { + if ( + this.mempoolIndexRegistry + .get(MempoolIndexes.HtlcRefundTransactionId) + .has(transaction.data.asset.refund.lockTransactionId) + ) { throw new Contracts.TransactionPool.PoolError( `HtlcRefund for "${lockId}" already in the pool`, "ERR_PENDING", @@ -101,6 +100,32 @@ export class HtlcRefundTransactionHandler extends TransactionHandler { } } + public async getInvalidPoolTransactions(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.refund?.lockTransactionId); + + const htlcRefundTransactionIdIndex = this.mempoolIndexRegistry.get(MempoolIndexes.HtlcRefundTransactionId); + + return htlcRefundTransactionIdIndex.has(transaction.data.asset.refund.lockTransactionId) + ? [htlcRefundTransactionIdIndex.get(transaction.data.asset.refund.lockTransactionId)] + : []; + } + + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.refund?.lockTransactionId); + + this.mempoolIndexRegistry + .get(MempoolIndexes.HtlcRefundTransactionId) + .set(transaction.data.asset.refund.lockTransactionId, transaction); + } + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.refund?.lockTransactionId); + + this.mempoolIndexRegistry + .get(MempoolIndexes.HtlcRefundTransactionId) + .forget(transaction.data.asset.refund.lockTransactionId); + } + public async applyToSender(transaction: Interfaces.ITransaction): Promise { AppUtils.assert.defined(transaction.data.senderPublicKey); diff --git a/packages/core-transactions/src/handlers/two/ipfs.ts b/packages/core-transactions/src/handlers/two/ipfs.ts index e4717cba4d..dcd834d2f9 100644 --- a/packages/core-transactions/src/handlers/two/ipfs.ts +++ b/packages/core-transactions/src/handlers/two/ipfs.ts @@ -1,6 +1,7 @@ import { Container, Contracts, Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Interfaces, Managers, Transactions, Utils } from "@arkecosystem/crypto"; +import { MempoolIndexes } from "../../enums"; import { IpfsHashAlreadyExists } from "../../errors"; import { TransactionHandler, TransactionHandlerConstructor } from "../transaction"; @@ -8,10 +9,11 @@ import { TransactionHandler, TransactionHandlerConstructor } from "../transactio // todo: replace unnecessary function arguments with dependency injection to avoid passing around references @Container.injectable() export class IpfsTransactionHandler extends TransactionHandler { - @Container.inject(Container.Identifiers.TransactionPoolQuery) - private readonly poolQuery!: Contracts.TransactionPool.Query; + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -54,13 +56,7 @@ export class IpfsTransactionHandler extends TransactionHandler { public async throwIfCannotEnterPool(transaction: Interfaces.ITransaction): Promise { AppUtils.assert.defined(transaction.data.asset?.ipfs); - const hasIPFS: boolean = this.poolQuery - .getAll() - .whereKind(transaction) - .wherePredicate((t) => t.data.asset!.ipfs === transaction.data.asset!.ipfs) - .has(); - - if (hasIPFS) { + if (this.mempoolIndexRegistry.get(MempoolIndexes.Ipfs).has(transaction.data.asset.ipfs)) { throw new Contracts.TransactionPool.PoolError( `IPFS transaction with IPFS address "${transaction.data.asset.ipfs}" already in the pool`, "ERR_PENDING", @@ -68,6 +64,26 @@ export class IpfsTransactionHandler extends TransactionHandler { } } + public async getInvalidPoolTransactions(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.ipfs); + + const ipfsIndex = this.mempoolIndexRegistry.get(MempoolIndexes.Ipfs); + + return ipfsIndex.has(transaction.data.asset.ipfs) ? [ipfsIndex.get(transaction.data.asset.ipfs)] : []; + } + + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.ipfs); + + this.mempoolIndexRegistry.get(MempoolIndexes.Ipfs).set(transaction.data.asset.ipfs, transaction); + } + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.ipfs); + + this.mempoolIndexRegistry.get(MempoolIndexes.Ipfs).forget(transaction.data.asset.ipfs); + } + public async throwIfCannotBeApplied( transaction: Interfaces.ITransaction, wallet: Contracts.State.Wallet, diff --git a/packages/core-transactions/src/handlers/two/multi-payment.ts b/packages/core-transactions/src/handlers/two/multi-payment.ts index 969b7f11aa..ff55aba44d 100644 --- a/packages/core-transactions/src/handlers/two/multi-payment.ts +++ b/packages/core-transactions/src/handlers/two/multi-payment.ts @@ -1,12 +1,13 @@ import { Container, Contracts, Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Interfaces, Managers, Transactions, Utils } from "@arkecosystem/crypto"; -import { InsufficientBalanceError } from "../../errors"; +import { InsufficientBalanceError, DisabledMultiSignatureReceiving } from "../../errors"; import { TransactionHandler, TransactionHandlerConstructor } from "../transaction"; @Container.injectable() export class MultiPaymentTransactionHandler extends TransactionHandler { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -57,6 +58,16 @@ export class MultiPaymentTransactionHandler extends TransactionHandler { throw new InsufficientBalanceError(); } + const milestone = Managers.configManager.getMilestone(); + if (milestone.multiSignatureReceivingEnabled !== true) { + for (const payment of payments) { + const recipient: Contracts.State.Wallet = this.walletRepository.findByAddress(payment.recipientId); + if (recipient.hasMultiSignature()) { + throw new DisabledMultiSignatureReceiving(); + } + } + } + return super.throwIfCannotBeApplied(transaction, wallet); } diff --git a/packages/core-transactions/src/handlers/two/multi-signature-registration.ts b/packages/core-transactions/src/handlers/two/multi-signature-registration.ts index 6f15013ef1..ad76fce7ee 100644 --- a/packages/core-transactions/src/handlers/two/multi-signature-registration.ts +++ b/packages/core-transactions/src/handlers/two/multi-signature-registration.ts @@ -1,6 +1,7 @@ import { Container, Contracts, Utils as AppUtils } from "@arkecosystem/core-kernel"; import { Enums, Identities, Interfaces, Managers, Transactions } from "@arkecosystem/crypto"; +import { MempoolIndexes } from "../../enums"; import { InvalidMultiSignatureError, MultiSignatureAlreadyRegisteredError, @@ -14,7 +15,11 @@ export class MultiSignatureRegistrationTransactionHandler extends TransactionHan @Container.inject(Container.Identifiers.TransactionPoolQuery) private readonly poolQuery!: Contracts.TransactionPool.Query; + @Container.inject(Container.Identifiers.TransactionPoolMempoolIndexRegistry) + private readonly mempoolIndexRegistry!: Contracts.TransactionPool.MempoolIndexRegistry; + @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { @@ -54,7 +59,8 @@ export class MultiSignatureRegistrationTransactionHandler extends TransactionHan } public async isActivated(): Promise { - return Managers.configManager.getMilestone().aip11 === true; + const milestone = Managers.configManager.getMilestone(); + return milestone.aip11 === true && milestone.multiSignatureRegistrationEnabled; } public async throwIfCannotBeApplied( @@ -109,18 +115,8 @@ export class MultiSignatureRegistrationTransactionHandler extends TransactionHan } const address = Identities.Address.fromMultiSignatureAsset(transaction.data.asset.multiSignature); - const hasAddress: boolean = this.poolQuery - .getAll() - .whereKind(transaction) - .wherePredicate( - (t) => - Identities.Address.fromMultiSignatureAsset( - t.data.asset!.multiSignature as Interfaces.IMultiSignatureAsset, - ) === address, - ) - .has(); - if (hasAddress) { + if (this.mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress).has(address)) { throw new Contracts.TransactionPool.PoolError( `MultiSignatureRegistration for address ${address} already in the pool`, "ERR_PENDING", @@ -128,6 +124,32 @@ export class MultiSignatureRegistrationTransactionHandler extends TransactionHan } } + public async getInvalidPoolTransactions(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.senderPublicKey); + AppUtils.assert.defined(transaction.data.asset?.multiSignature); + + const address = Identities.Address.fromMultiSignatureAsset(transaction.data.asset.multiSignature); + const multiSignatureAddressIndex = this.mempoolIndexRegistry.get(MempoolIndexes.MultiSignatureAddress); + + return multiSignatureAddressIndex.has(address) ? [multiSignatureAddressIndex.get(address)] : []; + } + + public async onPoolEnter(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.multiSignature); + + this.mempoolIndexRegistry + .get(MempoolIndexes.MultiSignatureAddress) + .set(Identities.Address.fromMultiSignatureAsset(transaction.data.asset.multiSignature), transaction); + } + + public async onPoolLeave(transaction: Interfaces.ITransaction): Promise { + AppUtils.assert.defined(transaction.data.asset?.multiSignature); + + this.mempoolIndexRegistry + .get(MempoolIndexes.MultiSignatureAddress) + .forget(Identities.Address.fromMultiSignatureAsset(transaction.data.asset.multiSignature)); + } + public async applyToSender(transaction: Interfaces.ITransaction): Promise { await super.applyToSender(transaction); } diff --git a/packages/core-transactions/src/handlers/two/second-signature-registration.ts b/packages/core-transactions/src/handlers/two/second-signature-registration.ts index 959df496a9..efa5a53f93 100644 --- a/packages/core-transactions/src/handlers/two/second-signature-registration.ts +++ b/packages/core-transactions/src/handlers/two/second-signature-registration.ts @@ -6,6 +6,7 @@ import { One } from "../index"; @Container.injectable() export class SecondSignatureRegistrationTransactionHandler extends One.SecondSignatureRegistrationTransactionHandler { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public getConstructor(): Transactions.TransactionConstructor { diff --git a/packages/core-transactions/src/handlers/two/vote.ts b/packages/core-transactions/src/handlers/two/vote.ts index 19b23d4dde..33b0d88f0f 100644 --- a/packages/core-transactions/src/handlers/two/vote.ts +++ b/packages/core-transactions/src/handlers/two/vote.ts @@ -8,6 +8,7 @@ import { DelegateRegistrationTransactionHandler } from "./delegate-registration" @Container.injectable() export class VoteTransactionHandler extends One.VoteTransactionHandler { @Container.inject(Container.Identifiers.TransactionHistoryService) + @Container.tagged("connection", "default") private readonly transactionHistoryService!: Contracts.Shared.TransactionHistoryService; public dependencies(): ReadonlyArray { diff --git a/packages/core-transactions/src/service-provider.ts b/packages/core-transactions/src/service-provider.ts index 066e8c8440..5a6229af51 100644 --- a/packages/core-transactions/src/service-provider.ts +++ b/packages/core-transactions/src/service-provider.ts @@ -1,8 +1,16 @@ import { Container, Providers, Services } from "@arkecosystem/core-kernel"; +import Joi from "joi"; -import { One, Two, TransactionHandlerConstructor } from "./handlers"; +import { MempoolIndexes } from "./enums"; +import { One, TransactionHandlerConstructor, Two } from "./handlers"; import { TransactionHandlerProvider } from "./handlers/handler-provider"; import { TransactionHandlerRegistry } from "./handlers/handler-registry"; +import { + MultiSignatureVerification, + MultiSignatureVerificationMemoized, + SecondSignatureVerification, + SecondSignatureVerificationMemoized, +} from "./verification"; export class ServiceProvider extends Providers.ServiceProvider { public static getTransactionHandlerConstructorsBinding(): ( @@ -50,6 +58,42 @@ export class ServiceProvider extends Providers.ServiceProvider { .toConstantValue(null) .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("state", "null")); + this.app + .bind(Container.Identifiers.TransactionSecondSignatureVerification) + .to(SecondSignatureVerificationMemoized) + .inSingletonScope() + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("state", "copy-on-write")); + + this.app + .bind(Container.Identifiers.TransactionSecondSignatureVerification) + .to(SecondSignatureVerification) + .inSingletonScope() + .when((req) => !Container.Selectors.anyAncestorOrTargetTaggedFirst("state", "copy-on-write")(req)); + + this.app + .bind(Container.Identifiers.TransactionMultiSignatureVerification) + .to(MultiSignatureVerificationMemoized) + .when(Container.Selectors.anyAncestorOrTargetTaggedFirst("state", "copy-on-write")); + + this.app + .bind(Container.Identifiers.TransactionMultiSignatureVerification) + .to(MultiSignatureVerification) + .when((req) => !Container.Selectors.anyAncestorOrTargetTaggedFirst("state", "copy-on-write")(req)); + + this.app + .bind(Container.Identifiers.TransactionPoolMempoolIndex) + .toConstantValue(MempoolIndexes.DelegateUsername); + this.app + .bind(Container.Identifiers.TransactionPoolMempoolIndex) + .toConstantValue(MempoolIndexes.HtlcClaimTransactionId); + this.app + .bind(Container.Identifiers.TransactionPoolMempoolIndex) + .toConstantValue(MempoolIndexes.HtlcRefundTransactionId); + this.app.bind(Container.Identifiers.TransactionPoolMempoolIndex).toConstantValue(MempoolIndexes.Ipfs); + this.app + .bind(Container.Identifiers.TransactionPoolMempoolIndex) + .toConstantValue(MempoolIndexes.MultiSignatureAddress); + this.app.bind(Container.Identifiers.TransactionHandler).to(One.TransferTransactionHandler); this.app.bind(Container.Identifiers.TransactionHandler).to(Two.TransferTransactionHandler); this.app.bind(Container.Identifiers.TransactionHandler).to(One.SecondSignatureRegistrationTransactionHandler); @@ -81,4 +125,12 @@ export class ServiceProvider extends Providers.ServiceProvider { public async required(): Promise { return true; } + + public configSchema(): object { + return Joi.object({ + memoizerCacheSize: Joi.number().integer().min(1).required(), + }) + .required() + .unknown(true); + } } diff --git a/packages/core-transactions/src/verification/cache.ts b/packages/core-transactions/src/verification/cache.ts new file mode 100644 index 0000000000..762a0169eb --- /dev/null +++ b/packages/core-transactions/src/verification/cache.ts @@ -0,0 +1,16 @@ +import { Container, Utils } from "@arkecosystem/core-kernel"; +import { Interfaces } from "@arkecosystem/crypto"; + +@Container.injectable() +export class Cache { + protected cache: Map = new Map(); + + public clear(transactionId: string): void { + this.cache.delete(transactionId); + } + + protected getKey(transaction: Interfaces.ITransactionData): string { + Utils.assert.defined(transaction.id); + return transaction.id; + } +} diff --git a/packages/core-transactions/src/verification/index.ts b/packages/core-transactions/src/verification/index.ts new file mode 100644 index 0000000000..ead7dea689 --- /dev/null +++ b/packages/core-transactions/src/verification/index.ts @@ -0,0 +1,4 @@ +export * from "./multi-signature-verification-memoized"; +export * from "./multi-signature-verification"; +export * from "./second-signature-verification-memoized"; +export * from "./second-signature-verification"; diff --git a/packages/core-transactions/src/verification/multi-signature-verification-memoized.ts b/packages/core-transactions/src/verification/multi-signature-verification-memoized.ts new file mode 100644 index 0000000000..af9a3230cb --- /dev/null +++ b/packages/core-transactions/src/verification/multi-signature-verification-memoized.ts @@ -0,0 +1,29 @@ +import { Container, Contracts, Utils } from "@arkecosystem/core-kernel"; +import { Interfaces, Transactions } from "@arkecosystem/crypto"; + +import { Cache } from "./cache"; + +@Container.injectable() +export class MultiSignatureVerificationMemoized + extends Cache<{ + multiSignatureAsset: Interfaces.IMultiSignatureAsset; + result: boolean; + }> + implements Contracts.Transactions.MultiSignatureVerification +{ + public verifySignatures( + transaction: Interfaces.ITransactionData, + multiSignatureAsset: Interfaces.IMultiSignatureAsset, + ): boolean { + const value = this.cache.get(this.getKey(transaction))!; + if (value && Utils.isEqual(value.multiSignatureAsset, multiSignatureAsset)) { + return value.result; + } + + const result = Transactions.Verifier.verifySignatures(transaction, multiSignatureAsset); + + this.cache.set(this.getKey(transaction), { multiSignatureAsset: Utils.cloneDeep(multiSignatureAsset), result }); + + return result; + } +} diff --git a/packages/core-transactions/src/verification/multi-signature-verification.ts b/packages/core-transactions/src/verification/multi-signature-verification.ts new file mode 100644 index 0000000000..1f086fa8b3 --- /dev/null +++ b/packages/core-transactions/src/verification/multi-signature-verification.ts @@ -0,0 +1,16 @@ +import { Container, Contracts, Exceptions } from "@arkecosystem/core-kernel"; +import { Interfaces, Transactions } from "@arkecosystem/crypto"; + +@Container.injectable() +export class MultiSignatureVerification implements Contracts.Transactions.MultiSignatureVerification { + public verifySignatures( + transaction: Interfaces.ITransactionData, + multiSignatureAsset: Interfaces.IMultiSignatureAsset, + ): boolean { + return Transactions.Verifier.verifySignatures(transaction, multiSignatureAsset); + } + + public clear(transactionId: string): void { + throw new Exceptions.Runtime.NotImplemented(this.constructor.name, "clear"); + } +} diff --git a/packages/core-transactions/src/verification/second-signature-verification-memoized.ts b/packages/core-transactions/src/verification/second-signature-verification-memoized.ts new file mode 100644 index 0000000000..6275afb513 --- /dev/null +++ b/packages/core-transactions/src/verification/second-signature-verification-memoized.ts @@ -0,0 +1,27 @@ +import { Container, Contracts } from "@arkecosystem/core-kernel"; +import { Interfaces, Transactions } from "@arkecosystem/crypto"; + +import { Cache } from "./cache"; + +@Container.injectable() +export class SecondSignatureVerificationMemoized + extends Cache<{ + publicKey: string; + result: boolean; + }> + implements Contracts.Transactions.SecondSignatureVerification +{ + public verifySecondSignature(transaction: Interfaces.ITransactionData, publicKey: string): boolean { + const value = this.cache.get(this.getKey(transaction))!; + + if (value && value.publicKey === publicKey) { + return value.result; + } + + const result = Transactions.Verifier.verifySecondSignature(transaction, publicKey); + + this.cache.set(this.getKey(transaction), { publicKey, result }); + + return result; + } +} diff --git a/packages/core-transactions/src/verification/second-signature-verification.ts b/packages/core-transactions/src/verification/second-signature-verification.ts new file mode 100644 index 0000000000..8a43485d3d --- /dev/null +++ b/packages/core-transactions/src/verification/second-signature-verification.ts @@ -0,0 +1,13 @@ +import { Container, Contracts, Exceptions } from "@arkecosystem/core-kernel"; +import { Interfaces, Transactions } from "@arkecosystem/crypto"; + +@Container.injectable() +export class SecondSignatureVerification implements Contracts.Transactions.SecondSignatureVerification { + public verifySecondSignature(transaction: Interfaces.ITransactionData, publicKey: string): boolean { + return Transactions.Verifier.verifySecondSignature(transaction, publicKey); + } + + public clear(transactionId: string): void { + throw new Exceptions.Runtime.NotImplemented(this.constructor.name, "clear"); + } +} diff --git a/packages/core-webhooks/package.json b/packages/core-webhooks/package.json index 2f0daae633..c65ab68c15 100644 --- a/packages/core-webhooks/package.json +++ b/packages/core-webhooks/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core-webhooks", - "version": "3.0.6", + "version": "3.12.0", "description": "Webhooks for ARK Core", "license": "MIT", "contributors": [ @@ -20,19 +20,18 @@ "pretest": "bash ../../scripts/pre-test.sh" }, "dependencies": { - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/crypto": "3.0.6", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/crypto": "3.12.0", "@hapi/boom": "9.0.0", "@hapi/hapi": "20.1.5", "fs-extra": "8.1.0", - "joi": "17.4.2", + "joi": "17.12.1", "lowdb": "1.0.0", - "uuid": "8.3.2" + "uuid": "9.0.1" }, "devDependencies": { "@types/fs-extra": "8.1.2", "@types/hapi__boom": "7.4.1", - "@types/hapi__joi": "17.1.7", "@types/uuid": "8.3.1" }, "engines": { diff --git a/packages/core-webhooks/src/listener.ts b/packages/core-webhooks/src/listener.ts index 69f62bccb0..adefd6cbe4 100644 --- a/packages/core-webhooks/src/listener.ts +++ b/packages/core-webhooks/src/listener.ts @@ -1,4 +1,4 @@ -import { Container, Contracts, Utils } from "@arkecosystem/core-kernel"; +import { Container, Contracts, Providers, Utils } from "@arkecosystem/core-kernel"; import { performance } from "perf_hooks"; import * as conditions from "./conditions"; @@ -37,6 +37,15 @@ export class Listener { @Container.inject(Container.Identifiers.LogService) private readonly logger!: Contracts.Kernel.Logger; + /** + * @private + * @type {Providers.PluginConfiguration} + * @memberof Listener + */ + @Container.inject(Container.Identifiers.PluginConfiguration) + @Container.tagged("plugin", "@arkecosystem/core-webhooks") + private readonly webhooksConfiguration!: Providers.PluginConfiguration; + /** * @param {string} event * @memberof Listener @@ -64,7 +73,7 @@ export class Listener { * @returns {Promise} * @memberof Broadcaster */ - public async broadcast(webhook: Webhook, payload: object, timeout: number = 1500): Promise { + public async broadcast(webhook: Webhook, payload: object): Promise { const start = performance.now(); try { @@ -77,7 +86,7 @@ export class Listener { headers: { Authorization: webhook.token, }, - timeout, + timeout: this.webhooksConfiguration.getRequired("timeout"), }); this.logger.debug( diff --git a/packages/core-webhooks/src/service-provider.ts b/packages/core-webhooks/src/service-provider.ts index a54d267d75..be57dedca2 100644 --- a/packages/core-webhooks/src/service-provider.ts +++ b/packages/core-webhooks/src/service-provider.ts @@ -28,7 +28,9 @@ export class ServiceProvider extends Providers.ServiceProvider { this.app.get(Identifiers.Server).register(this.config().get("server")!); // Setup Listeners... - this.startListeners(); + if (this.config().get("enabled") === true) { + this.startListeners(); + } } /** diff --git a/packages/core/bin/run b/packages/core/bin/run index 9dbfc5a550..423b087f9d 100755 --- a/packages/core/bin/run +++ b/packages/core/bin/run @@ -4,7 +4,7 @@ const child_process = require("child_process"); const jemallocPath = child_process .spawnSync( - `ls -d1H $(gcc -print-search-dirs | grep libraries: | awk '{print $2}' | sed -e 's/:/* /g' -e 's/$/*/' -e 's/^.//') | grep libjemalloc.so`, + `ls -d1H $(gcc -print-search-dirs | grep libraries: | awk '{print $2}' | sed -e 's/:/* /g' -e 's/$/*/' -e 's/^.//') | grep libjemalloc.so || ls -d1H /usr/lib/* | grep libjemalloc.so`, { shell: true }, ) .stdout.toString() diff --git a/packages/core/package.json b/packages/core/package.json index 4ec2ac64d5..b3325b80e8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@arkecosystem/core", - "version": "3.0.6", + "version": "3.12.0", "description": "Core of the ARK Blockchain", "license": "MIT", "contributors": [ @@ -41,37 +41,33 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@arkecosystem/core-api": "3.0.6", - "@arkecosystem/core-blockchain": "3.0.6", - "@arkecosystem/core-cli": "3.0.6", - "@arkecosystem/core-database": "3.0.6", - "@arkecosystem/core-forger": "3.0.6", - "@arkecosystem/core-kernel": "3.0.6", - "@arkecosystem/core-logger-pino": "3.0.6", - "@arkecosystem/core-magistrate-api": "3.0.6", - "@arkecosystem/core-magistrate-transactions": "3.0.6", - "@arkecosystem/core-p2p": "3.0.6", - "@arkecosystem/core-snapshots": "3.0.6", - "@arkecosystem/core-state": "3.0.6", - "@arkecosystem/core-transaction-pool": "3.0.6", - "@arkecosystem/core-transactions": "3.0.6", - "@arkecosystem/core-webhooks": "3.0.6", - "@arkecosystem/crypto": "3.0.6", - "@arkecosystem/utils": "1.3.0", - "argon2": "0.28.2", + "@arkecosystem/core-api": "3.12.0", + "@arkecosystem/core-blockchain": "3.12.0", + "@arkecosystem/core-cli": "3.12.0", + "@arkecosystem/core-database": "3.12.0", + "@arkecosystem/core-forger": "3.12.0", + "@arkecosystem/core-kernel": "3.12.0", + "@arkecosystem/core-logger-pino": "3.12.0", + "@arkecosystem/core-magistrate-api": "3.12.0", + "@arkecosystem/core-magistrate-transactions": "3.12.0", + "@arkecosystem/core-p2p": "3.12.0", + "@arkecosystem/core-snapshots": "3.12.0", + "@arkecosystem/core-state": "3.12.0", + "@arkecosystem/core-transaction-pool": "3.12.0", + "@arkecosystem/core-transactions": "3.12.0", + "@arkecosystem/core-webhooks": "3.12.0", + "@arkecosystem/crypto": "3.12.0", + "@arkecosystem/utils": "1.3.1", "bip39": "3.0.4", "boxen": "4.2.0", - "dayjs": "1.10.7", + "dayjs": "1.11.10", "env-paths": "2.2.1", "envfile": "5.2.0", - "execa": "3.4.0", "fs-extra": "8.1.0", - "got": "11.8.2", - "joi": "17.4.2", - "kleur": "4.1.4", - "ngrok": "3.4.1", + "joi": "17.12.1", + "kleur": "4.1.5", + "ngrok": "4.3.3", "prompts": "2.4.0", - "tar": "6.1.11", "type-fest": "0.21.3", "wif": "2.0.6" }, diff --git a/packages/core/src/cli.ts b/packages/core/src/cli.ts index 631e1be830..0202770012 100644 --- a/packages/core/src/cli.ts +++ b/packages/core/src/cli.ts @@ -1,12 +1,4 @@ -import { - ApplicationFactory, - Commands, - Container, - Contracts, - InputParser, - Plugins, - Services, -} from "@arkecosystem/core-cli"; +import { ApplicationFactory, Commands, Container, Contracts, InputParser, Plugins } from "@arkecosystem/core-cli"; import envPaths from "env-paths"; import { existsSync } from "fs-extra"; import { platform } from "os"; @@ -161,22 +153,18 @@ export class CommandLineInterface { const commandsDiscoverer = this.app.resolve(Commands.DiscoverCommands); const commands: Contracts.CommandList = commandsDiscoverer.within(resolve(dirname, "./commands")); - const pluginsDiscoverer = this.app.resolve(Commands.DiscoverPlugins); - const tempFlags = await this.detectNetworkAndToken(flags); - const path = join( - this.app - .get(Container.Identifiers.Environment) - .getPaths(tempFlags.token, tempFlags.network!).data, - "plugins", - ); - const pluginPaths = (await pluginsDiscoverer.discover(path)).map((plugin) => plugin.path); + if (tempFlags.network) { + const plugins = await this.app + .get(Container.Identifiers.PluginManager) + .list(tempFlags.token, tempFlags.network); - const commandsFromPlugins = commandsDiscoverer.from(pluginPaths); + const commandsFromPlugins = commandsDiscoverer.from(plugins.map((plugin) => plugin.path)); - for (const [key, value] of Object.entries(commandsFromPlugins)) { - commands[key] = value; + for (const [key, value] of Object.entries(commandsFromPlugins)) { + commands[key] = value; + } } this.app.bind(Container.Identifiers.Commands).toConstantValue(commands); diff --git a/packages/core/src/commands/config-cli.ts b/packages/core/src/commands/config-cli.ts index 66eb544552..0617d5bbbd 100644 --- a/packages/core/src/commands/config-cli.ts +++ b/packages/core/src/commands/config-cli.ts @@ -52,7 +52,7 @@ export class Command extends Commands.Command { .setFlag( "channel", "The NPM registry channel that should be used.", - Joi.string().valid(...["next", "latest"]), + Joi.string().valid(...["next", "latest", "rc"]), ); } diff --git a/packages/core/src/commands/config-forger.ts b/packages/core/src/commands/config-forger.ts index f167fe441c..84438d3a70 100644 --- a/packages/core/src/commands/config-forger.ts +++ b/packages/core/src/commands/config-forger.ts @@ -38,7 +38,6 @@ export class Command extends Commands.Command { this.definition .setFlag("token", "The name of the token.", Joi.string().default("ark")) .setFlag("network", "The name of the network.", Joi.string().valid(...Object.keys(Networks))) - .setFlag("bip38", "", Joi.string()) .setFlag("bip39", "A delegate plain text passphrase. Referred to as BIP39.", Joi.string()) .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()) .setFlag( diff --git a/packages/core/src/commands/core-run.ts b/packages/core/src/commands/core-run.ts index 5119b4d276..37ec301984 100644 --- a/packages/core/src/commands/core-run.ts +++ b/packages/core/src/commands/core-run.ts @@ -45,7 +45,8 @@ export class Command extends Commands.Command { .setFlag("launchMode", "The mode the relay will be launched in (seed only at the moment).", Joi.string()) .setFlag("bip38", "", Joi.string()) .setFlag("bip39", "A delegate plain text passphrase. Referred to as BIP39.", Joi.string()) - .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()); + .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()) + .setFlag("skipPrompts", "Skip prompts.", Joi.boolean().default(false)); } /** diff --git a/packages/core/src/commands/core-start.ts b/packages/core/src/commands/core-start.ts index 6241881a46..3ba5be55db 100644 --- a/packages/core/src/commands/core-start.ts +++ b/packages/core/src/commands/core-start.ts @@ -47,7 +47,8 @@ export class Command extends Commands.Command { .setFlag("bip38", "", Joi.string()) .setFlag("bip39", "A delegate plain text passphrase. Referred to as BIP39.", Joi.string()) .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()) - .setFlag("daemon", "Start the Core process as a daemon.", Joi.boolean().default(true)); + .setFlag("daemon", "Start the Core process as a daemon.", Joi.boolean().default(true)) + .setFlag("skipPrompts", "Skip prompts.", Joi.boolean().default(false)); } /** diff --git a/packages/core/src/commands/forger-run.ts b/packages/core/src/commands/forger-run.ts index 1b677c0497..2937b45544 100644 --- a/packages/core/src/commands/forger-run.ts +++ b/packages/core/src/commands/forger-run.ts @@ -40,7 +40,8 @@ export class Command extends Commands.Command { .setFlag("env", "", Joi.string().default("production")) .setFlag("bip38", "", Joi.string()) .setFlag("bip39", "A delegate plain text passphrase. Referred to as BIP39.", Joi.string()) - .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()); + .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()) + .setFlag("skipPrompts", "Skip prompts.", Joi.boolean().default(false)); } /** diff --git a/packages/core/src/commands/forger-start.ts b/packages/core/src/commands/forger-start.ts index 8cfef6ffd3..4e71a5a755 100644 --- a/packages/core/src/commands/forger-start.ts +++ b/packages/core/src/commands/forger-start.ts @@ -47,7 +47,8 @@ export class Command extends Commands.Command { .setFlag("bip38", "", Joi.string()) .setFlag("bip39", "A delegate plain text passphrase. Referred to as BIP39.", Joi.string()) .setFlag("password", "A custom password that encrypts the BIP39. Referred to as BIP38.", Joi.string()) - .setFlag("daemon", "Start the Forger process as a daemon.", Joi.boolean().default(true)); + .setFlag("daemon", "Start the Forger process as a daemon.", Joi.boolean().default(true)) + .setFlag("skipPrompts", "Skip prompts.", Joi.boolean().default(false)); } /** diff --git a/packages/core/src/commands/network-generate.ts b/packages/core/src/commands/network-generate.ts index 46a025c5b0..e89373e264 100644 --- a/packages/core/src/commands/network-generate.ts +++ b/packages/core/src/commands/network-generate.ts @@ -1,9 +1,9 @@ import { Commands, Container, Contracts, Services } from "@arkecosystem/core-cli"; -import { Crypto, Identities, Interfaces, Transactions, Utils, Managers, Blocks } from "@arkecosystem/crypto"; -import Joi from "joi"; +import { Blocks, Crypto, Identities, Interfaces, Managers, Transactions, Utils } from "@arkecosystem/crypto"; import { generateMnemonic } from "bip39"; import envPaths from "env-paths"; import { ensureDirSync, existsSync, readJSONSync, writeFileSync, writeJSONSync } from "fs-extra"; +import Joi from "joi"; import { join, resolve } from "path"; import prompts from "prompts"; @@ -787,6 +787,7 @@ export class Command extends Commands.Command { } if (!Object.keys(dynamicFees.addonBytes).length) { + // @ts-ignore delete dynamicFees.addonBytes; } @@ -894,7 +895,7 @@ export class Command extends Commands.Command { private formatGenesisTransaction(transaction, wallet: Wallet) { Object.assign(transaction, { - fee: "0", + fee: Utils.BigNumber.ZERO, timestamp: 0, }); transaction.signature = Transactions.Signer.sign(transaction, wallet.keys); diff --git a/packages/core/src/commands/plugin-install.ts b/packages/core/src/commands/plugin-install.ts index 7ed2b614f6..003875d5c0 100644 --- a/packages/core/src/commands/plugin-install.ts +++ b/packages/core/src/commands/plugin-install.ts @@ -1,9 +1,7 @@ -import { Commands, Container } from "@arkecosystem/core-cli"; +import { Commands, Container, Contracts } from "@arkecosystem/core-cli"; import { Networks } from "@arkecosystem/crypto"; import Joi from "joi"; -import { File, Git, NPM, Source } from "../source-providers"; - /** * @export * @class Command @@ -11,6 +9,9 @@ import { File, Git, NPM, Source } from "../source-providers"; */ @Container.injectable() export class Command extends Commands.Command { + @Container.inject(Container.Identifiers.PluginManager) + private readonly pluginManager!: Contracts.PluginManager; + /** * The console command signature. * @@ -48,35 +49,11 @@ export class Command extends Commands.Command { * @memberof Command */ public async execute(): Promise { - const pkg: string = this.getArgument("package"); - const version: string | undefined = this.getFlag("version"); - - try { - return await this.install(pkg, version); - } catch (error) { - throw new Error(error.message); - } - } - - /** - * @private - * @param {string} pkg - * @param version - * @returns {Promise} - * @memberof Command - */ - private async install(pkg: string, version?: string): Promise { - for (const Instance of [File, Git, NPM]) { - const source: Source = new Instance({ - data: this.app.getCorePath("data", "plugins"), - temp: this.app.getCorePath("temp", "plugins"), - }); - - if (await source.exists(pkg, version)) { - return source.install(pkg, version); - } - } - - throw new Error(`The given package [${pkg}] is neither a git nor a npm package.`); + return await this.pluginManager.install( + this.getFlag("token"), + this.getFlag("network"), + this.getArgument("package"), + this.getFlag("version"), + ); } } diff --git a/packages/core/src/commands/plugin-remove.ts b/packages/core/src/commands/plugin-remove.ts index d1348a8b68..367e5b201a 100644 --- a/packages/core/src/commands/plugin-remove.ts +++ b/packages/core/src/commands/plugin-remove.ts @@ -1,7 +1,6 @@ -import { Commands, Container } from "@arkecosystem/core-cli"; +import { Commands, Container, Contracts } from "@arkecosystem/core-cli"; import { Networks } from "@arkecosystem/crypto"; import Joi from "joi"; -import { existsSync, removeSync } from "fs-extra"; /** * @export @@ -10,6 +9,9 @@ import { existsSync, removeSync } from "fs-extra"; */ @Container.injectable() export class Command extends Commands.Command { + @Container.inject(Container.Identifiers.PluginManager) + private readonly pluginManager!: Contracts.PluginManager; + /** * The console command signature. * @@ -46,14 +48,10 @@ export class Command extends Commands.Command { * @memberof Command */ public async execute(): Promise { - const pkg: string = this.getArgument("package"); - - let directory: string = this.app.getCorePath("data", `plugins/${pkg}`); - - if (!existsSync(directory)) { - throw new Error(`The package [${pkg}] does not exist.`); - } - - removeSync(directory); + return await this.pluginManager.remove( + this.getFlag("token"), + this.getFlag("network"), + this.getArgument("package"), + ); } } diff --git a/packages/core/src/commands/plugin-update.ts b/packages/core/src/commands/plugin-update.ts index e2a3808c22..f1f6ed0f2b 100644 --- a/packages/core/src/commands/plugin-update.ts +++ b/packages/core/src/commands/plugin-update.ts @@ -1,10 +1,6 @@ -import { Commands, Container } from "@arkecosystem/core-cli"; +import { Commands, Container, Contracts } from "@arkecosystem/core-cli"; import { Networks } from "@arkecosystem/crypto"; import Joi from "joi"; -import { existsSync } from "fs-extra"; -import { join } from "path"; - -import { Git, NPM } from "../source-providers"; /** * @export @@ -13,6 +9,9 @@ import { Git, NPM } from "../source-providers"; */ @Container.injectable() export class Command extends Commands.Command { + @Container.inject(Container.Identifiers.PluginManager) + private readonly pluginManager!: Contracts.PluginManager; + /** * The console command signature. * @@ -49,22 +48,10 @@ export class Command extends Commands.Command { * @memberof Command */ public async execute(): Promise { - const pkg: string = this.getArgument("package"); - - const paths = { - data: this.app.getCorePath("data", "plugins"), - temp: this.app.getCorePath("temp", "plugins"), - }; - const directory: string = join(paths.data, pkg); - - if (!existsSync(directory)) { - throw new Error(`The package [${pkg}] does not exist.`); - } - - if (existsSync(`${directory}/.git`)) { - return new Git(paths).update(pkg); - } - - return new NPM(paths).update(pkg); + return await this.pluginManager.update( + this.getFlag("token"), + this.getFlag("network"), + this.getArgument("package"), + ); } } diff --git a/packages/core/src/commands/pool-clear.ts b/packages/core/src/commands/pool-clear.ts index bb9f380212..a695c92d28 100644 --- a/packages/core/src/commands/pool-clear.ts +++ b/packages/core/src/commands/pool-clear.ts @@ -71,6 +71,8 @@ export class Command extends Commands.Command { * @memberof Command */ private removeFiles() { - removeSync(this.app.getCorePath("data", "transaction-pool")); + removeSync(this.app.getCorePath("data", "transaction-pool.sqlite")); + removeSync(this.app.getCorePath("data", "transaction-pool.sqlite-shm")); + removeSync(this.app.getCorePath("data", "transaction-pool.sqlite-wal")); } } diff --git a/packages/core/src/exceptions/base.ts b/packages/core/src/exceptions/base.ts new file mode 100644 index 0000000000..67f507dabe --- /dev/null +++ b/packages/core/src/exceptions/base.ts @@ -0,0 +1,24 @@ +export class Exception extends Error { + /** + * Creates an instance of Exception. + * + * @param {string} message + * @param {string} [code] + * @memberof Exception + */ + public constructor(message: string, code?: string) { + super(message); + + Object.defineProperty(this, "message", { + enumerable: false, + value: code ? `${code}: ${message}` : message, + }); + + Object.defineProperty(this, "name", { + enumerable: false, + value: this.constructor.name, + }); + + Error.captureStackTrace(this, this.constructor); + } +} diff --git a/packages/core/src/exceptions/crypto.ts b/packages/core/src/exceptions/crypto.ts new file mode 100644 index 0000000000..39f91913ce --- /dev/null +++ b/packages/core/src/exceptions/crypto.ts @@ -0,0 +1,21 @@ +import { Exception } from "./base"; + +export class Bip38Exception extends Exception {} + +export class MissingConfigFile extends Bip38Exception { + public constructor(filePath: string) { + super(`The ${filePath} file does not exist.`); + } +} + +export class PassphraseNotDetected extends Bip38Exception { + public constructor() { + super(`We were unable to detect a BIP38 or BIP39 passphrase.`); + } +} + +export class InvalidPassword extends Bip38Exception { + public constructor() { + super(`We've detected that you are using BIP38 but have not provided a valid password.`); + } +} diff --git a/packages/core/src/exceptions/index.ts b/packages/core/src/exceptions/index.ts new file mode 100644 index 0000000000..dfddf18190 --- /dev/null +++ b/packages/core/src/exceptions/index.ts @@ -0,0 +1,2 @@ +export * as Base from "./base"; +export * as Crypto from "./crypto"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c1d55cf46a..44bc91c7f7 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1 +1,2 @@ export * from "./cli"; +export * from "./exceptions"; diff --git a/packages/core/src/internal/crypto.ts b/packages/core/src/internal/crypto.ts index 471441f0d0..7a47054dd9 100644 --- a/packages/core/src/internal/crypto.ts +++ b/packages/core/src/internal/crypto.ts @@ -2,6 +2,8 @@ import { existsSync } from "fs-extra"; import { join } from "path"; import prompts from "prompts"; +import { InvalidPassword, MissingConfigFile, PassphraseNotDetected } from "../exceptions/crypto"; + // todo: review the implementation export const buildBIP38 = async (flags, config?: string): Promise> => { if (!config && process.env.CORE_PATH_CONFIG) { @@ -15,6 +17,7 @@ export const buildBIP38 = async (flags, config?: string): Promise { - return Buffer.from(Keys.fromPrivateKey(buffer, compressed).publicKey, "hex"); +const getPublicKey = (buff: Buffer, compressed: boolean): Buffer => { + return Buffer.from(Keys.fromPrivateKey(buff, compressed).publicKey, "hex"); }; const getAddressPrivate = (privateKey: Buffer, compressed: boolean): string => { const publicKey = getPublicKey(privateKey, compressed); - const buffer = HashAlgorithms.hash160(publicKey); + const buff = HashAlgorithms.hash160(publicKey); const payload = Buffer.alloc(21); payload.writeUInt8(0x00, 0); - buffer.copy(payload, 1); + buff.copy(payload, 1); return Base58.encodeCheck(payload); }; @@ -82,12 +82,12 @@ export const verify = (bip38: string): boolean => { return true; }; -const encryptRaw = (buffer: Buffer, compressed: boolean, passphrase: string): Buffer => { - if (buffer.length !== 32) { - throw new PrivateKeyLengthError(32, buffer.length); +const encryptRaw = (buff: Buffer, compressed: boolean, passphrase: string): Buffer => { + if (buff.length !== 32) { + throw new PrivateKeyLengthError(32, buff.length); } - const address = getAddressPrivate(buffer, compressed); + const address = getAddressPrivate(buff, compressed); const secret = Buffer.from(passphrase, "utf8"); const salt = HashAlgorithms.hash256(address).slice(0, 4); @@ -96,7 +96,7 @@ const encryptRaw = (buffer: Buffer, compressed: boolean, passphrase: string): Bu const derivedHalf1 = scryptBuf.slice(0, 32); const derivedHalf2 = scryptBuf.slice(32, 64); - const xorBuf = xor(derivedHalf1, buffer); + const xorBuf = xor(derivedHalf1, buff); const cipher = aes.createCipheriv("aes-256-ecb", derivedHalf2, NULL); cipher.setAutoPadding(false); cipher.end(xorBuf); @@ -114,18 +114,18 @@ const encryptRaw = (buffer: Buffer, compressed: boolean, passphrase: string): Bu return result; }; -const decryptECMult = (buffer: Buffer, passphrase: string): IDecryptResult => { - buffer = buffer.slice(1); +const decryptECMult = (buff: Buffer, passphrase: string): IDecryptResult => { + buff = buff.slice(1); - const flag = buffer.readUInt8(1); + const flag = buff.readUInt8(1); const compressed = (flag & 0x20) !== 0; const hasLotSeq = (flag & 0x04) !== 0; assert.strictEqual(flag & 0x24, flag, "Invalid private key."); - const addressHash = buffer.slice(2, 6); - const ownerEntropy = buffer.slice(6, 14); + const addressHash = buff.slice(2, 6); + const ownerEntropy = buff.slice(6, 14); let ownerSalt; // 4 bytes ownerSalt if 4 bytes lot/sequence @@ -137,8 +137,8 @@ const decryptECMult = (buffer: Buffer, passphrase: string): IDecryptResult => { ownerSalt = ownerEntropy; } - const encryptedPart1 = buffer.slice(14, 22); // First 8 bytes - const encryptedPart2 = buffer.slice(22, 38); // 16 bytes + const encryptedPart1 = buff.slice(14, 22); // First 8 bytes + const encryptedPart2 = buff.slice(22, 38); // 16 bytes const preFactor = crypto.scryptSync(passphrase, ownerSalt, 32, SCRYPT_PARAMS); @@ -183,36 +183,36 @@ const decryptECMult = (buffer: Buffer, passphrase: string): IDecryptResult => { }; // some of the techniques borrowed from: https://github.com/pointbiz/bitaddress.org -const decryptRaw = (buffer: Buffer, passphrase: string): IDecryptResult => { +const decryptRaw = (buff: Buffer, passphrase: string): IDecryptResult => { // 39 bytes: 2 bytes prefix, 37 bytes payload - if (buffer.length !== 39) { - throw new Bip38LengthError(39, buffer.length); + if (buff.length !== 39) { + throw new Bip38LengthError(39, buff.length); } - if (buffer.readUInt8(0) !== 0x01) { - throw new Bip38PrefixError(0x01, buffer.readUInt8(0)); + if (buff.readUInt8(0) !== 0x01) { + throw new Bip38PrefixError(0x01, buff.readUInt8(0)); } // check if BIP38 EC multiply - const type = buffer.readUInt8(1); + const type = buff.readUInt8(1); if (type === 0x43) { - return decryptECMult(buffer, passphrase); + return decryptECMult(buff, passphrase); } if (type !== 0x42) { throw new Bip38TypeError(0x42, type); } - const flagByte = buffer.readUInt8(2); + const flagByte = buff.readUInt8(2); const compressed = flagByte === 0xe0; if (!compressed && flagByte !== 0xc0) { throw new Bip38CompressionError(0xc0, flagByte); } - const salt = buffer.slice(3, 7); + const salt = buff.slice(3, 7); const scryptBuf = crypto.scryptSync(passphrase, salt, 64, SCRYPT_PARAMS); const derivedHalf1 = scryptBuf.slice(0, 32); const derivedHalf2 = scryptBuf.slice(32, 64); - const privKeyBuf = buffer.slice(7, 7 + 32); + const privKeyBuf = buff.slice(7, 7 + 32); const decipher = aes.createDecipheriv("aes-256-ecb", derivedHalf2, NULL); decipher.setAutoPadding(false); decipher.end(privKeyBuf); diff --git a/packages/crypto/src/crypto/hash-algorithms.ts b/packages/crypto/src/crypto/hash-algorithms.ts index 4c3ff7096f..c28a177aa7 100644 --- a/packages/crypto/src/crypto/hash-algorithms.ts +++ b/packages/crypto/src/crypto/hash-algorithms.ts @@ -1,39 +1,39 @@ import { Hash160, Hash256, RIPEMD160, SHA1, SHA256 } from "bcrypto"; export class HashAlgorithms { - public static ripemd160(buffer: Buffer | string): Buffer { - return RIPEMD160.digest(this.bufferize(buffer)); + public static ripemd160(buff: Buffer | string): Buffer { + return RIPEMD160.digest(this.bufferize(buff)); } - public static sha1(buffer: Buffer | string): Buffer { - return SHA1.digest(this.bufferize(buffer)); + public static sha1(buff: Buffer | string): Buffer { + return SHA1.digest(this.bufferize(buff)); } - public static sha256(buffer: Buffer | string | Buffer[]): Buffer { - if (Array.isArray(buffer)) { + public static sha256(buff: Buffer | string | Buffer[]): Buffer { + if (Array.isArray(buff)) { let sha256 = SHA256.ctx; sha256.init(); - for (const element of buffer) { + for (const element of buff) { sha256 = sha256.update(element); } return sha256.final(); } - return SHA256.digest(this.bufferize(buffer)); + return SHA256.digest(this.bufferize(buff)); } - public static hash160(buffer: Buffer | string): Buffer { - return Hash160.digest(this.bufferize(buffer)); + public static hash160(buff: Buffer | string): Buffer { + return Hash160.digest(this.bufferize(buff)); } - public static hash256(buffer: Buffer | string): Buffer { - return Hash256.digest(this.bufferize(buffer)); + public static hash256(buff: Buffer | string): Buffer { + return Hash256.digest(this.bufferize(buff)); } - private static bufferize(buffer: Buffer | string) { - return buffer instanceof Buffer ? buffer : Buffer.from(buffer); + private static bufferize(buff: Buffer | string) { + return buff instanceof Buffer ? buff : Buffer.from(buff); } } diff --git a/packages/crypto/src/identities/address.ts b/packages/crypto/src/identities/address.ts index 99f318f03a..6b9ed65864 100644 --- a/packages/crypto/src/identities/address.ts +++ b/packages/crypto/src/identities/address.ts @@ -27,8 +27,8 @@ export class Address { return Identity.fromPrivateKey(privateKey, { pubKeyHash: getPubKeyHash(networkVersion) }); } - public static fromBuffer(buffer: Buffer): string { - return Identity.fromBuffer(buffer); + public static fromBuffer(buff: Buffer): string { + return Identity.fromBuffer(buff); } public static toBuffer(address: string, networkVersion?: number): { addressBuffer: Buffer; addressError?: string } { diff --git a/packages/crypto/src/interfaces/transactions.ts b/packages/crypto/src/interfaces/transactions.ts index a7d0c97fc1..85a35f8923 100644 --- a/packages/crypto/src/interfaces/transactions.ts +++ b/packages/crypto/src/interfaces/transactions.ts @@ -1,8 +1,7 @@ import { ErrorObject } from "ajv"; -import ByteBuffer from "bytebuffer"; import { HtlcLockExpirationType } from "../enums"; -import { BigNumber } from "../utils"; +import { BigNumber, ByteBuffer } from "../utils"; export interface ITransaction { readonly id: string | undefined; diff --git a/packages/crypto/src/transactions/builders/transactions/transaction.ts b/packages/crypto/src/transactions/builders/transactions/transaction.ts index 4dbe9f954c..861e81c3b6 100644 --- a/packages/crypto/src/transactions/builders/transactions/transaction.ts +++ b/packages/crypto/src/transactions/builders/transactions/transaction.ts @@ -99,6 +99,12 @@ export abstract class TransactionBuilder 0) { if (transaction.hasVendorField()) { - const vendorFieldBuffer: Buffer = buf.readBytes(vendorFieldLength).toBuffer(); + const vendorFieldBuffer: Buffer = buf.readBuffer(vendorFieldLength); transaction.data.vendorField = vendorFieldBuffer.toString("utf8"); } else { - buf.skip(vendorFieldLength); + buf.jump(vendorFieldLength); } } } @@ -112,69 +111,68 @@ export class Deserializer { private static deserializeECDSA(transaction: ITransactionData, buf: ByteBuffer): void { const currentSignatureLength = (): number => { - buf.mark(); - - const lengthHex: string = buf.skip(1).readBytes(1).toString("hex"); + buf.jump(1); + const length = buf.readUInt8(); - buf.reset(); - return parseInt(lengthHex, 16) + 2; + buf.jump(-2); + return length + 2; }; // Signature - if (buf.remaining()) { + if (buf.getRemainderLength()) { const signatureLength: number = currentSignatureLength(); - transaction.signature = buf.readBytes(signatureLength).toString("hex"); + transaction.signature = buf.readBuffer(signatureLength).toString("hex"); } const beginningMultiSignature = () => { - buf.mark(); - - const marker: number = buf.readUint8(); + const marker: number = buf.readUInt8(); - buf.reset(); + buf.jump(-1); return marker === 255; }; // Second Signature - if (buf.remaining() && !beginningMultiSignature()) { + if (buf.getRemainderLength() && !beginningMultiSignature()) { const secondSignatureLength: number = currentSignatureLength(); - transaction.secondSignature = buf.readBytes(secondSignatureLength).toString("hex"); + transaction.secondSignature = buf.readBuffer(secondSignatureLength).toString("hex"); } // Multi Signatures - if (buf.remaining() && beginningMultiSignature()) { - buf.skip(1); - const multiSignature: string = buf.readBytes(buf.limit - buf.offset).toString("hex"); + if (buf.getRemainderLength() && beginningMultiSignature()) { + buf.jump(1); + const multiSignature: string = buf.readBuffer(buf.getRemainderLength()).toString("hex"); transaction.signatures = [multiSignature]; } - if (buf.remaining()) { + if (buf.getRemainderLength()) { throw new InvalidTransactionBytesError("signature buffer not exhausted"); } } private static deserializeSchnorr(transaction: ITransactionData, buf: ByteBuffer): void { const canReadNonMultiSignature = () => { - return buf.remaining() && (buf.remaining() % 64 === 0 || buf.remaining() % 65 !== 0); + return ( + buf.getRemainderLength() && (buf.getRemainderLength() % 64 === 0 || buf.getRemainderLength() % 65 !== 0) + ); }; if (canReadNonMultiSignature()) { - transaction.signature = buf.readBytes(64).toString("hex"); + transaction.signature = buf.readBuffer(64).toString("hex"); } if (canReadNonMultiSignature()) { - transaction.secondSignature = buf.readBytes(64).toString("hex"); + transaction.secondSignature = buf.readBuffer(64).toString("hex"); } - if (buf.remaining()) { - if (buf.remaining() % 65 === 0) { + if (buf.getRemainderLength()) { + if (buf.getRemainderLength() % 65 === 0) { transaction.signatures = []; - const count: number = buf.remaining() / 65; + const count: number = buf.getRemainderLength() / 65; const publicKeyIndexes: { [index: number]: boolean } = {}; for (let i = 0; i < count; i++) { - const multiSignaturePart: string = buf.readBytes(65).toString("hex"); + const multiSignaturePart: string = buf.readBuffer(65).toString("hex"); const publicKeyIndex: number = parseInt(multiSignaturePart.slice(0, 2), 16); if (!publicKeyIndexes[publicKeyIndex]) { @@ -192,7 +190,7 @@ export class Deserializer { } private static detectSchnorr(buf: ByteBuffer): boolean { - const remaining: number = buf.remaining(); + const remaining: number = buf.getRemainderLength(); // `signature` / `secondSignature` if (remaining === 64 || remaining === 128) { @@ -217,10 +215,6 @@ export class Deserializer { serialized = Buffer.from(serialized, "hex"); } - const buffer: ByteBuffer = new ByteBuffer(serialized.length, true); - buffer.append(serialized); - buffer.reset(); - - return buffer; + return new ByteBuffer(serialized); } } diff --git a/packages/crypto/src/transactions/factory.ts b/packages/crypto/src/transactions/factory.ts index f5359bc984..c3af0ead37 100644 --- a/packages/crypto/src/transactions/factory.ts +++ b/packages/crypto/src/transactions/factory.ts @@ -23,8 +23,8 @@ export class TransactionFactory { return this.fromSerialized(hex); } - public static fromBytes(buffer: Buffer, strict = true, options: IDeserializeOptions = {}): ITransaction { - return this.fromSerialized(buffer.toString("hex"), strict, options); + public static fromBytes(buff: Buffer, strict = true, options: IDeserializeOptions = {}): ITransaction { + return this.fromSerialized(buff.toString("hex"), strict, options); } /** @@ -34,10 +34,10 @@ export class TransactionFactory { * NOTE: Only use this internally when it is safe to assume the buffer has already been * verified. */ - public static fromBytesUnsafe(buffer: Buffer, id?: string): ITransaction { + public static fromBytesUnsafe(buff: Buffer, id?: string): ITransaction { try { const options: IDeserializeOptions | ISerializeOptions = { acceptLegacyVersion: true }; - const transaction = Deserializer.deserialize(buffer, options); + const transaction = Deserializer.deserialize(buff, options); transaction.data.id = id || Utils.getId(transaction.data, options); transaction.isVerified = true; @@ -48,7 +48,7 @@ export class TransactionFactory { } public static fromJson(json: ITransactionJson): ITransaction { - const data: ITransactionData = ({ ...json } as unknown) as ITransactionData; + const data: ITransactionData = { ...json } as unknown as ITransactionData; data.amount = BigNumber.make(data.amount); data.fee = BigNumber.make(data.fee); diff --git a/packages/crypto/src/transactions/serializer.ts b/packages/crypto/src/transactions/serializer.ts index 07dbfcfb52..1f444f88ee 100644 --- a/packages/crypto/src/transactions/serializer.ts +++ b/packages/crypto/src/transactions/serializer.ts @@ -1,5 +1,3 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../enums"; import { TransactionVersionError } from "../errors"; import { Address } from "../identities"; @@ -7,7 +5,7 @@ import { ISerializeOptions } from "../interfaces"; import { ITransaction, ITransactionData } from "../interfaces"; import { configManager } from "../managers/config"; import { isException } from "../utils"; -import { isSupportedTransactionVersion } from "../utils"; +import { ByteBuffer, isSupportedTransactionVersion } from "../utils"; import { TransactionTypeFactory } from "./types"; // Reference: https://github.com/ArkEcosystem/AIPs/blob/master/AIPS/aip-11.md @@ -30,10 +28,18 @@ export class Serializer { * Serializes the given transaction according to AIP11. */ public static serialize(transaction: ITransaction, options: ISerializeOptions = {}): Buffer { - const buffer: ByteBuffer = new ByteBuffer(512, true); + let size = 83886; + const maxPayload = configManager.getMilestone(configManager.getHeight()).block?.maxPayload; + const maxTransactions = configManager.getMilestone(configManager.getHeight()).block?.maxTransactions; + + if (maxPayload && maxTransactions) { + size = Math.floor(maxPayload / maxTransactions) * 2; + } - this.serializeCommon(transaction.data, buffer); - this.serializeVendorField(transaction, buffer); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(size)); + + this.serializeCommon(transaction.data, buff); + this.serializeVendorField(transaction, buff); const serialized: ByteBuffer | undefined = transaction.serialize(options); @@ -41,15 +47,14 @@ export class Serializer { throw new Error(); } - const typeBuffer: ByteBuffer = serialized.flip(); - buffer.append(typeBuffer); + buff.writeBuffer(serialized.getResult()); - this.serializeSignatures(transaction.data, buffer, options); + this.serializeSignatures(transaction.data, buff, options); - const flippedBuffer: Buffer = buffer.flip().toBuffer(); - transaction.serialized = flippedBuffer; + const bufferBuffer = buff.getResult(); + transaction.serialized = bufferBuffer; - return flippedBuffer; + return bufferBuffer; } /** @@ -61,19 +66,13 @@ export class Serializer { if (transaction.type === TransactionType.SecondSignature && transaction.asset) { const { signature } = transaction.asset; - const bb = new ByteBuffer(33, true); + const bytebuffer = new ByteBuffer(Buffer.alloc(33)); if (signature && signature.publicKey) { - const publicKeyBuffer = Buffer.from(signature.publicKey, "hex"); - - for (const byte of publicKeyBuffer) { - bb.writeByte(byte); - } + bytebuffer.writeBuffer(Buffer.from(signature.publicKey, "hex")); } - bb.flip(); - - assetBytes = new Uint8Array(bb.toArrayBuffer()); + assetBytes = bytebuffer.getResult(); assetSize = assetBytes.length; } @@ -100,33 +99,26 @@ export class Serializer { transaction.asset.multiSignatureLegacy.keysgroup.join(""), "utf8", ); - const bb: ByteBuffer = new ByteBuffer(1 + 1 + keysgroupBuffer.length, true); + const bb: ByteBuffer = new ByteBuffer(Buffer.alloc(1 + 1 + keysgroupBuffer.length)); - bb.writeByte(transaction.asset.multiSignatureLegacy.min); - bb.writeByte(transaction.asset.multiSignatureLegacy.lifetime); + bb.writeUInt8(transaction.asset.multiSignatureLegacy.min); + bb.writeUInt8(transaction.asset.multiSignatureLegacy.lifetime); for (const byte of keysgroupBuffer) { - bb.writeByte(byte); + bb.writeUInt8(byte); } - bb.flip(); - - assetBytes = bb.toBuffer(); - if (assetBytes) { - assetSize = assetBytes.length; - } + assetBytes = bb.getResult(); + assetSize = assetBytes.length; } - const bb: ByteBuffer = new ByteBuffer(1 + 4 + 32 + 8 + 8 + 21 + 64 + 64 + 64 + assetSize, true); - bb.writeByte(transaction.type); - bb.writeInt(transaction.timestamp); + const bb: ByteBuffer = new ByteBuffer(Buffer.alloc(1 + 4 + 32 + 8 + 8 + 21 + 255 + 64 + 64 + 64 + assetSize)); - if (transaction.senderPublicKey) { - const senderPublicKeyBuffer: Buffer = Buffer.from(transaction.senderPublicKey, "hex"); + bb.writeUInt8(transaction.type); + bb.writeUInt32LE(transaction.timestamp); - for (const byte of senderPublicKeyBuffer) { - bb.writeByte(byte); - } + if (transaction.senderPublicKey) { + bb.writeBuffer(Buffer.from(transaction.senderPublicKey, "hex")); // Apply fix for broken type 1 and 4 transactions, which were // erroneously calculated with a recipient id. @@ -137,13 +129,10 @@ export class Serializer { if (isBrokenTransaction || (transaction.recipientId && transaction.type !== 1 && transaction.type !== 4)) { const recipientId = transaction.recipientId || Address.fromPublicKey(transaction.senderPublicKey, transaction.network); - const recipient = Address.toBuffer(recipientId).addressBuffer; - for (const byte of recipient) { - bb.writeByte(byte); - } + bb.writeBuffer(Address.toBuffer(recipientId).addressBuffer); } else { for (let i = 0; i < 21; i++) { - bb.writeByte(0); + bb.writeUInt8(0); } } } @@ -151,122 +140,100 @@ export class Serializer { if (transaction.vendorField) { const vf: Buffer = Buffer.from(transaction.vendorField); const fillstart: number = vf.length; - for (let i = 0; i < fillstart; i++) { - bb.writeByte(vf[i]); - } + bb.writeBuffer(vf); + for (let i = fillstart; i < 64; i++) { - bb.writeByte(0); + bb.writeUInt8(0); } } else { for (let i = 0; i < 64; i++) { - bb.writeByte(0); + bb.writeUInt8(0); } } - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - bb.writeInt64(transaction.amount.toString()); - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - bb.writeInt64(transaction.fee.toString()); + bb.writeBigUInt64LE(transaction.amount.toBigInt()); + + bb.writeBigUInt64LE(transaction.fee.toBigInt()); if (assetSize > 0 && assetBytes) { for (let i = 0; i < assetSize; i++) { - bb.writeByte(assetBytes[i]); + bb.writeUInt8(assetBytes[i]); } } if (!options.excludeSignature && transaction.signature) { - const signatureBuffer = Buffer.from(transaction.signature, "hex"); - for (const byte of signatureBuffer) { - bb.writeByte(byte); - } + bb.writeBuffer(Buffer.from(transaction.signature, "hex")); } if (!options.excludeSecondSignature && transaction.secondSignature) { - const signSignatureBuffer = Buffer.from(transaction.secondSignature, "hex"); - for (const byte of signSignatureBuffer) { - bb.writeByte(byte); - } - } - - bb.flip(); - const arrayBuffer: Uint8Array = new Uint8Array(bb.toArrayBuffer()); - const buffer: number[] = []; - - for (let i = 0; i < arrayBuffer.length; i++) { - buffer[i] = arrayBuffer[i]; + bb.writeBuffer(Buffer.from(transaction.secondSignature, "hex")); } - return Buffer.from(buffer); + return bb.getResult(); } - private static serializeCommon(transaction: ITransactionData, buffer: ByteBuffer): void { + private static serializeCommon(transaction: ITransactionData, buff: ByteBuffer): void { transaction.version = transaction.version || 0x01; if (transaction.typeGroup === undefined) { transaction.typeGroup = TransactionTypeGroup.Core; } - buffer.writeByte(0xff); - buffer.writeByte(transaction.version); - buffer.writeByte(transaction.network || configManager.get("network.pubKeyHash")); + buff.writeUInt8(0xff); + buff.writeUInt8(transaction.version); + buff.writeUInt8(transaction.network || configManager.get("network.pubKeyHash")); if (transaction.version === 1) { - buffer.writeByte(transaction.type); - buffer.writeUint32(transaction.timestamp); + buff.writeUInt8(transaction.type); + buff.writeUInt32LE(transaction.timestamp); } else { - buffer.writeUint32(transaction.typeGroup); - buffer.writeUint16(transaction.type); + buff.writeUInt32LE(transaction.typeGroup); + buff.writeUInt16LE(transaction.type); if (transaction.nonce) { - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - buffer.writeUint64(transaction.nonce.toString()); + buff.writeBigInt64LE(transaction.nonce.toBigInt()); } } if (transaction.senderPublicKey) { - buffer.append(transaction.senderPublicKey, "hex"); + buff.writeBuffer(Buffer.from(transaction.senderPublicKey, "hex")); } - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - buffer.writeUint64(transaction.fee.toString()); + buff.writeBigInt64LE(transaction.fee.toBigInt()); } - private static serializeVendorField(transaction: ITransaction, buffer: ByteBuffer): void { - if (transaction.hasVendorField()) { - const { data }: ITransaction = transaction; + private static serializeVendorField(transaction: ITransaction, buff: ByteBuffer): void { + const { data }: ITransaction = transaction; - if (data.vendorField) { - const vf: Buffer = Buffer.from(data.vendorField, "utf8"); - buffer.writeByte(vf.length); - buffer.append(vf); - } else { - buffer.writeByte(0x00); - } + if (transaction.hasVendorField() && data.vendorField) { + const vf: Buffer = Buffer.from(data.vendorField, "utf8"); + buff.writeUInt8(vf.length); + buff.writeBuffer(vf); } else { - buffer.writeByte(0x00); + buff.writeUInt8(0x00); } } private static serializeSignatures( transaction: ITransactionData, - buffer: ByteBuffer, + buff: ByteBuffer, options: ISerializeOptions = {}, ): void { if (transaction.signature && !options.excludeSignature) { - buffer.append(transaction.signature, "hex"); + buff.writeBuffer(Buffer.from(transaction.signature, "hex")); } const secondSignature: string | undefined = transaction.secondSignature || transaction.signSignature; if (secondSignature && !options.excludeSecondSignature) { - buffer.append(secondSignature, "hex"); + buff.writeBuffer(Buffer.from(secondSignature, "hex")); } if (transaction.signatures) { if (transaction.version === 1 && isException(transaction)) { - buffer.append("ff", "hex"); // 0xff separator to signal start of multi-signature transactions - buffer.append(transaction.signatures.join(""), "hex"); + buff.writeUInt8(0xff); // 0xff separator to signal start of multi-signature transactions + buff.writeBuffer(Buffer.from(transaction.signatures.join(""), "hex")); } else if (!options.excludeMultiSignature) { - buffer.append(transaction.signatures.join(""), "hex"); + buff.writeBuffer(Buffer.from(transaction.signatures.join(""), "hex")); } } } diff --git a/packages/crypto/src/transactions/types/one/delegate-registration.ts b/packages/crypto/src/transactions/types/one/delegate-registration.ts index cfd6c853e5..c2f66f5efd 100644 --- a/packages/crypto/src/transactions/types/one/delegate-registration.ts +++ b/packages/crypto/src/transactions/types/one/delegate-registration.ts @@ -1,8 +1,6 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -23,12 +21,13 @@ export abstract class DelegateRegistrationTransaction extends Transaction { if (data.asset && data.asset.delegate) { const delegateBytes: Buffer = Buffer.from(data.asset.delegate.username, "utf8"); - const buffer: ByteBuffer = new ByteBuffer(delegateBytes.length, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(delegateBytes.length + 1)); - buffer.writeByte(delegateBytes.length); - buffer.append(delegateBytes, "hex"); + buff.writeUInt8(delegateBytes.length); + // buffer.writeBuffer(delegateBytes, "hex"); + buff.writeBuffer(delegateBytes); - return buffer; + return buff; } return undefined; @@ -36,11 +35,11 @@ export abstract class DelegateRegistrationTransaction extends Transaction { public deserialize(buf: ByteBuffer): void { const { data } = this; - const usernamelength: number = buf.readUint8(); + const usernameLength = buf.readUInt8(); data.asset = { delegate: { - username: buf.readString(usernamelength), + username: buf.readBuffer(usernameLength).toString("utf8"), }, }; } diff --git a/packages/crypto/src/transactions/types/one/multi-signature-registration.ts b/packages/crypto/src/transactions/types/one/multi-signature-registration.ts index eef570f246..097c2e5ca5 100644 --- a/packages/crypto/src/transactions/types/one/multi-signature-registration.ts +++ b/packages/crypto/src/transactions/types/one/multi-signature-registration.ts @@ -1,9 +1,7 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { IMultiSignatureLegacyAsset, ISerializeOptions, ITransactionData } from "../../../interfaces"; import { isException } from "../../../utils"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -37,27 +35,27 @@ export abstract class MultiSignatureRegistrationTransaction extends Transaction const legacyAsset: IMultiSignatureLegacyAsset = data.asset!.multiSignatureLegacy!; const joined: string = legacyAsset.keysgroup.map((k) => (k.startsWith("+") ? k.slice(1) : k)).join(""); const keysgroupBuffer: Buffer = Buffer.from(joined, "hex"); - const buffer: ByteBuffer = new ByteBuffer(keysgroupBuffer.length + 3, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(keysgroupBuffer.length + 3)); - buffer.writeByte(legacyAsset.min); - buffer.writeByte(legacyAsset.keysgroup.length); - buffer.writeByte(legacyAsset.lifetime); - buffer.append(keysgroupBuffer, "hex"); + buff.writeUInt8(legacyAsset.min); + buff.writeUInt8(legacyAsset.keysgroup.length); + buff.writeUInt8(legacyAsset.lifetime); + buff.writeBuffer(keysgroupBuffer); - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; const multiSignatureLegacy: IMultiSignatureLegacyAsset = { keysgroup: [], lifetime: 0, min: 0 }; - multiSignatureLegacy.min = buf.readUint8(); + multiSignatureLegacy.min = buf.readUInt8(); - const num: number = buf.readUint8(); - multiSignatureLegacy.lifetime = buf.readUint8(); + const num = buf.readUInt8(); + multiSignatureLegacy.lifetime = buf.readUInt8(); for (let index = 0; index < num; index++) { - const key: string = buf.readBytes(33).toString("hex"); + const key: string = buf.readBuffer(33).toString("hex"); multiSignatureLegacy.keysgroup.push(key); } diff --git a/packages/crypto/src/transactions/types/one/second-signature-registration.ts b/packages/crypto/src/transactions/types/one/second-signature-registration.ts index 247f7b31a3..a4c8a7e4eb 100644 --- a/packages/crypto/src/transactions/types/one/second-signature-registration.ts +++ b/packages/crypto/src/transactions/types/one/second-signature-registration.ts @@ -1,8 +1,6 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -20,13 +18,13 @@ export abstract class SecondSignatureRegistrationTransaction extends Transaction public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; - const buffer: ByteBuffer = new ByteBuffer(33, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(33)); if (data.asset && data.asset.signature) { - buffer.append(data.asset.signature.publicKey, "hex"); + buff.writeBuffer(Buffer.from(data.asset.signature.publicKey, "hex")); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { @@ -34,7 +32,7 @@ export abstract class SecondSignatureRegistrationTransaction extends Transaction data.asset = { signature: { - publicKey: buf.readBytes(33).toString("hex"), + publicKey: buf.readBuffer(33).toString("hex"), }, }; } diff --git a/packages/crypto/src/transactions/types/one/transfer.ts b/packages/crypto/src/transactions/types/one/transfer.ts index 8aa176d1c8..4ee81599d0 100644 --- a/packages/crypto/src/transactions/types/one/transfer.ts +++ b/packages/crypto/src/transactions/types/one/transfer.ts @@ -1,9 +1,7 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { Address } from "../../../identities"; import { ISerializeOptions } from "../../../interfaces"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -25,10 +23,9 @@ export abstract class TransferTransaction extends Transaction { public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; - const buffer: ByteBuffer = new ByteBuffer(24, true); - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - buffer.writeUint64(data.amount.toString()); - buffer.writeUint32(data.expiration || 0); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(33)); + buff.writeBigUInt64LE(data.amount.toBigInt()); + buff.writeUInt32LE(data.expiration || 0); if (data.recipientId) { const { addressBuffer, addressError } = Address.toBuffer(data.recipientId); @@ -37,16 +34,16 @@ export abstract class TransferTransaction extends Transaction { options.addressError = addressError; } - buffer.append(addressBuffer); + buff.writeBuffer(addressBuffer); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; - data.amount = BigNumber.make(buf.readUint64().toString()); - data.expiration = buf.readUint32(); - data.recipientId = Address.fromBuffer(buf.readBytes(21).toBuffer()); + data.amount = BigNumber.make(buf.readBigUInt64LE().toString()); + data.expiration = buf.readUInt32LE(); + data.recipientId = Address.fromBuffer(buf.readBuffer(21)); } } diff --git a/packages/crypto/src/transactions/types/one/vote.ts b/packages/crypto/src/transactions/types/one/vote.ts index 52c5904831..025e96f1d3 100644 --- a/packages/crypto/src/transactions/types/one/vote.ts +++ b/packages/crypto/src/transactions/types/one/vote.ts @@ -1,8 +1,6 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -20,26 +18,26 @@ export class VoteTransaction extends Transaction { public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; - const buffer: ByteBuffer = new ByteBuffer(24, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(100)); if (data.asset && data.asset.votes) { const voteBytes = data.asset.votes .map((vote) => (vote.startsWith("+") ? "01" : "00") + vote.slice(1)) .join(""); - buffer.writeByte(data.asset.votes.length); - buffer.append(voteBytes, "hex"); + buff.writeUInt8(data.asset.votes.length); + buff.writeBuffer(Buffer.from(voteBytes, "hex")); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; - const votelength: number = buf.readUint8(); + const votelength: number = buf.readUInt8(); data.asset = { votes: [] }; for (let i = 0; i < votelength; i++) { - let vote: string = buf.readBytes(34).toString("hex"); + let vote: string = buf.readBuffer(34).toString("hex"); vote = (vote[1] === "1" ? "+" : "-") + vote.slice(2); if (data.asset && data.asset.votes) { diff --git a/packages/crypto/src/transactions/types/transaction.ts b/packages/crypto/src/transactions/types/transaction.ts index e4b5429c56..c80bf2dd86 100644 --- a/packages/crypto/src/transactions/types/transaction.ts +++ b/packages/crypto/src/transactions/types/transaction.ts @@ -1,5 +1,3 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionTypeGroup } from "../../enums"; import { NotImplemented } from "../../errors"; import { Address } from "../../identities"; @@ -11,7 +9,7 @@ import { ITransactionJson, } from "../../interfaces"; import { configManager } from "../../managers/config"; -import { BigNumber } from "../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../utils"; import { Verifier } from "../verifier"; import { TransactionSchema } from "./schemas"; diff --git a/packages/crypto/src/transactions/types/two/delegate-resignation.ts b/packages/crypto/src/transactions/types/two/delegate-resignation.ts index 73d24ec413..61b6434202 100644 --- a/packages/crypto/src/transactions/types/two/delegate-resignation.ts +++ b/packages/crypto/src/transactions/types/two/delegate-resignation.ts @@ -1,5 +1,4 @@ -import ByteBuffer from "bytebuffer"; - +import { ByteBuffer } from "../../../utils/byte-buffer"; import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; import { configManager } from "../../../managers"; @@ -24,7 +23,7 @@ export abstract class DelegateResignationTransaction extends Transaction { } public serialize(options?: ISerializeOptions): ByteBuffer | undefined { - return new ByteBuffer(0); + return new ByteBuffer(Buffer.alloc(0)); } public deserialize(buf: ByteBuffer): void { diff --git a/packages/crypto/src/transactions/types/two/htlc-claim.ts b/packages/crypto/src/transactions/types/two/htlc-claim.ts index f104409035..042aa68056 100644 --- a/packages/crypto/src/transactions/types/two/htlc-claim.ts +++ b/packages/crypto/src/transactions/types/two/htlc-claim.ts @@ -1,9 +1,7 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; import { configManager } from "../../../managers"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -27,21 +25,21 @@ export abstract class HtlcClaimTransaction extends Transaction { public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; - const buffer: ByteBuffer = new ByteBuffer(32 + 32, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(32 + 32)); if (data.asset && data.asset.claim) { - buffer.append(Buffer.from(data.asset.claim.lockTransactionId, "hex")); - buffer.append(Buffer.from(data.asset.claim.unlockSecret, "hex")); + buff.writeBuffer(Buffer.from(data.asset.claim.lockTransactionId, "hex")); + buff.writeBuffer(Buffer.from(data.asset.claim.unlockSecret, "hex")); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; - const lockTransactionId: string = buf.readBytes(32).toString("hex"); - const unlockSecret: string = buf.readBytes(32).toString("hex"); + const lockTransactionId: string = buf.readBuffer(32).toString("hex"); + const unlockSecret: string = buf.readBuffer(32).toString("hex"); data.asset = { claim: { diff --git a/packages/crypto/src/transactions/types/two/htlc-lock.ts b/packages/crypto/src/transactions/types/two/htlc-lock.ts index 8e658f0eec..12a6f1fd35 100644 --- a/packages/crypto/src/transactions/types/two/htlc-lock.ts +++ b/packages/crypto/src/transactions/types/two/htlc-lock.ts @@ -1,10 +1,8 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { Address } from "../../../identities"; import { ISerializeOptions } from "../../../interfaces"; import { configManager } from "../../../managers"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -32,15 +30,14 @@ export abstract class HtlcLockTransaction extends Transaction { public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; - const buffer: ByteBuffer = new ByteBuffer(8 + 32 + 1 + 4 + 21, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(8 + 32 + 1 + 4 + 21)); - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - buffer.writeUint64(data.amount.toString()); + buff.writeBigUInt64LE(data.amount.toBigInt()); if (data.asset && data.asset.lock) { - buffer.append(Buffer.from(data.asset.lock.secretHash, "hex")); - buffer.writeUint8(data.asset.lock.expiration.type); - buffer.writeUint32(data.asset.lock.expiration.value); + buff.writeBuffer(Buffer.from(data.asset.lock.secretHash, "hex")); + buff.writeUInt8(data.asset.lock.expiration.type); + buff.writeUInt32LE(data.asset.lock.expiration.value); } if (data.recipientId) { @@ -50,20 +47,20 @@ export abstract class HtlcLockTransaction extends Transaction { options.addressError = addressError; } - buffer.append(addressBuffer); + buff.writeBuffer(addressBuffer); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; - const amount: BigNumber = BigNumber.make(buf.readUint64().toString()); - const secretHash: string = buf.readBytes(32).toString("hex"); - const expirationType: number = buf.readUint8(); - const expirationValue: number = buf.readUint32(); - const recipientId: string = Address.fromBuffer(buf.readBytes(21).toBuffer()); + const amount: BigNumber = BigNumber.make(buf.readBigUInt64LE().toString()); + const secretHash: string = buf.readBuffer(32).toString("hex"); + const expirationType: number = buf.readUInt8(); + const expirationValue: number = buf.readUInt32LE(); + const recipientId: string = Address.fromBuffer(buf.readBuffer(21)); data.amount = amount; data.recipientId = recipientId; diff --git a/packages/crypto/src/transactions/types/two/htlc-refund.ts b/packages/crypto/src/transactions/types/two/htlc-refund.ts index 3b8394e88c..1542f1ebf9 100644 --- a/packages/crypto/src/transactions/types/two/htlc-refund.ts +++ b/packages/crypto/src/transactions/types/two/htlc-refund.ts @@ -1,9 +1,7 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; import { configManager } from "../../../managers"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -27,19 +25,19 @@ export abstract class HtlcRefundTransaction extends Transaction { public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; - const buffer: ByteBuffer = new ByteBuffer(32, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(32)); if (data.asset && data.asset.refund) { - buffer.append(Buffer.from(data.asset.refund.lockTransactionId, "hex")); + buff.writeBuffer(Buffer.from(data.asset.refund.lockTransactionId, "hex")); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; - const lockTransactionId: string = buf.readBytes(32).toString("hex"); + const lockTransactionId: string = buf.readBuffer(32).toString("hex"); data.asset = { refund: { diff --git a/packages/crypto/src/transactions/types/two/ipfs.ts b/packages/crypto/src/transactions/types/two/ipfs.ts index bb11d17a93..065673c60b 100644 --- a/packages/crypto/src/transactions/types/two/ipfs.ts +++ b/packages/crypto/src/transactions/types/two/ipfs.ts @@ -1,10 +1,9 @@ import { base58 } from "bstring"; -import ByteBuffer from "bytebuffer"; import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { ISerializeOptions } from "../../../interfaces"; import { configManager } from "../../../managers"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -29,11 +28,11 @@ export abstract class IpfsTransaction extends Transaction { if (data.asset) { const ipfsBuffer: Buffer = base58.decode(data.asset.ipfs); - const buffer: ByteBuffer = new ByteBuffer(ipfsBuffer.length, true); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(ipfsBuffer.length)); - buffer.append(ipfsBuffer, "hex"); + buff.writeBuffer(ipfsBuffer); - return buffer; + return buff; } return undefined; @@ -42,17 +41,17 @@ export abstract class IpfsTransaction extends Transaction { public deserialize(buf: ByteBuffer): void { const { data } = this; - const hashFunction: number = buf.readUint8(); - const ipfsHashLength: number = buf.readUint8(); - const ipfsHash: Buffer = buf.readBytes(ipfsHashLength).toBuffer(); + const hashFunction: number = buf.readUInt8(); + const ipfsHashLength: number = buf.readUInt8(); + const ipfsHash: Buffer = buf.readBuffer(ipfsHashLength); - const buffer: Buffer = Buffer.alloc(ipfsHashLength + 2); - buffer.writeUInt8(hashFunction, 0); - buffer.writeUInt8(ipfsHashLength, 1); - buffer.fill(ipfsHash, 2); + const buff: Buffer = Buffer.alloc(ipfsHashLength + 2); + buff.writeUInt8(hashFunction, 0); + buff.writeUInt8(ipfsHashLength, 1); + buff.fill(ipfsHash, 2); data.asset = { - ipfs: base58.encode(buffer), + ipfs: base58.encode(buff), }; } } diff --git a/packages/crypto/src/transactions/types/two/multi-payment.ts b/packages/crypto/src/transactions/types/two/multi-payment.ts index 4d2faf81f3..cffcce2ce9 100644 --- a/packages/crypto/src/transactions/types/two/multi-payment.ts +++ b/packages/crypto/src/transactions/types/two/multi-payment.ts @@ -1,10 +1,8 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { Address } from "../../../identities"; import { IMultiPaymentItem, ISerializeOptions } from "../../../interfaces"; import { configManager } from "../../../managers"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -32,20 +30,19 @@ export abstract class MultiPaymentTransaction extends Transaction { const { data } = this; if (data.asset && data.asset.payments) { - const buffer: ByteBuffer = new ByteBuffer(2 + data.asset.payments.length * 29, true); - buffer.writeUint16(data.asset.payments.length); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(2 + data.asset.payments.length * 29)); + buff.writeUInt16LE(data.asset.payments.length); for (const payment of data.asset.payments) { - // @ts-ignore - The ByteBuffer types say we can't use strings but the code actually handles them. - buffer.writeUint64(payment.amount.toString()); + buff.writeBigUInt64LE(payment.amount.toBigInt()); const { addressBuffer, addressError } = Address.toBuffer(payment.recipientId); options.addressError = addressError || options.addressError; - buffer.append(addressBuffer); + buff.writeBuffer(addressBuffer); } - return buffer; + return buff; } return undefined; @@ -54,12 +51,12 @@ export abstract class MultiPaymentTransaction extends Transaction { public deserialize(buf: ByteBuffer): void { const { data } = this; const payments: IMultiPaymentItem[] = []; - const total: number = buf.readUint16(); + const total: number = buf.readUInt16LE(); for (let j = 0; j < total; j++) { payments.push({ - amount: BigNumber.make(buf.readUint64().toString()), - recipientId: Address.fromBuffer(buf.readBytes(21).toBuffer()), + amount: BigNumber.make(buf.readBigUInt64LE().toString()), + recipientId: Address.fromBuffer(buf.readBuffer(21)), }); } diff --git a/packages/crypto/src/transactions/types/two/multi-signature-registration.ts b/packages/crypto/src/transactions/types/two/multi-signature-registration.ts index 26745f384d..503c401134 100644 --- a/packages/crypto/src/transactions/types/two/multi-signature-registration.ts +++ b/packages/crypto/src/transactions/types/two/multi-signature-registration.ts @@ -1,9 +1,7 @@ -import ByteBuffer from "bytebuffer"; - import { TransactionType, TransactionTypeGroup } from "../../../enums"; import { IMultiSignatureAsset, ISerializeOptions, ITransactionData } from "../../../interfaces"; import { configManager } from "../../../managers"; -import { BigNumber } from "../../../utils/bignum"; +import { BigNumber, ByteBuffer } from "../../../utils"; import * as schemas from "../schemas"; import { Transaction } from "../transaction"; @@ -34,27 +32,27 @@ export class MultiSignatureRegistrationTransaction extends Transaction { public serialize(options?: ISerializeOptions): ByteBuffer | undefined { const { data } = this; const { min, publicKeys } = data.asset!.multiSignature!; - const buffer: ByteBuffer = new ByteBuffer(2 + publicKeys.length * 33); + const buff: ByteBuffer = new ByteBuffer(Buffer.alloc(2 + publicKeys.length * 33)); - buffer.writeUint8(min); - buffer.writeUint8(publicKeys.length); + buff.writeUInt8(min); + buff.writeUInt8(publicKeys.length); for (const publicKey of publicKeys) { - buffer.append(publicKey, "hex"); + buff.writeBuffer(Buffer.from(publicKey, "hex")); } - return buffer; + return buff; } public deserialize(buf: ByteBuffer): void { const { data } = this; const multiSignature: IMultiSignatureAsset = { publicKeys: [], min: 0 }; - multiSignature.min = buf.readUint8(); + multiSignature.min = buf.readUInt8(); - const count = buf.readUint8(); + const count = buf.readUInt8(); for (let i = 0; i < count; i++) { - const publicKey = buf.readBytes(33).toString("hex"); + const publicKey = buf.readBuffer(33).toString("hex"); multiSignature.publicKeys.push(publicKey); } diff --git a/packages/crypto/src/utils/base58.ts b/packages/crypto/src/utils/base58.ts index bbf667add9..aa8f28e83b 100644 --- a/packages/crypto/src/utils/base58.ts +++ b/packages/crypto/src/utils/base58.ts @@ -3,18 +3,18 @@ import moize from "fast-memoize"; import { HashAlgorithms } from "../crypto"; -const encodeCheck = (buffer: Buffer): string => { - const checksum: Buffer = HashAlgorithms.hash256(buffer); +const encodeCheck = (buff: Buffer): string => { + const checksum: Buffer = HashAlgorithms.hash256(buff); - return base58.encode(Buffer.concat([buffer, checksum], buffer.length + 4)); + return base58.encode(Buffer.concat([buff, checksum], buff.length + 4)); }; const decodeCheck = (address: string): Buffer => { - const buffer: Buffer = base58.decode(address); - const payload: Buffer = buffer.slice(0, -4); + const buff: Buffer = base58.decode(address); + const payload: Buffer = buff.slice(0, -4); const checksum: Buffer = HashAlgorithms.hash256(payload); - if (checksum.readUInt32LE(0) !== buffer.slice(-4).readUInt32LE(0)) { + if (checksum.readUInt32LE(0) !== buff.slice(-4).readUInt32LE(0)) { throw new Error("Invalid checksum"); } diff --git a/packages/crypto/src/utils/byte-buffer.ts b/packages/crypto/src/utils/byte-buffer.ts new file mode 100644 index 0000000000..65d687b447 --- /dev/null +++ b/packages/crypto/src/utils/byte-buffer.ts @@ -0,0 +1,194 @@ +export class ByteBuffer { + private readonly buff: Buffer; + private offset = 0; + + public constructor(buff: Buffer) { + this.buff = buff; + } + + public getRemainder(): Buffer { + return this.buff.slice(this.offset); + } + + public getRemainderLength(): number { + return this.buff.length - this.offset; + } + + public getResult(): Buffer { + return this.buff.slice(0, this.offset); + } + + public getResultLength(): number { + return this.offset; + } + + public reset(): void { + this.offset = 0; + } + + public jump(length: number): void { + if (length < -this.offset || length > this.getRemainderLength()) { + throw new Error("Jump over buffer boundary."); + } + + this.offset += length; + } + + public writeInt8(value: number): void { + this.offset = this.buff.writeInt8(value, this.offset); + } + + public writeInt16BE(value: number): void { + this.offset = this.buff.writeInt16BE(value, this.offset); + } + + public writeInt16LE(value: number): void { + this.offset = this.buff.writeInt16LE(value, this.offset); + } + + public writeInt32BE(value: number): void { + this.offset = this.buff.writeInt32BE(value, this.offset); + } + + public writeInt32LE(value: number): void { + this.offset = this.buff.writeInt32LE(value, this.offset); + } + + public writeBigInt64BE(value: bigint): void { + this.offset = this.buff.writeBigInt64BE(value, this.offset); + } + + public writeBigInt64LE(value: bigint): void { + this.offset = this.buff.writeBigInt64LE(value, this.offset); + } + + public writeUInt8(value: number): void { + this.offset = this.buff.writeUInt8(value, this.offset); + } + + public writeUInt16BE(value: number): void { + this.offset = this.buff.writeUInt16BE(value, this.offset); + } + + public writeUInt16LE(value: number): void { + this.offset = this.buff.writeUInt16LE(value, this.offset); + } + + public writeUInt32BE(value: number): void { + this.offset = this.buff.writeUInt32BE(value, this.offset); + } + + public writeUInt32LE(value: number): void { + this.offset = this.buff.writeUInt32LE(value, this.offset); + } + + public writeBigUInt64BE(value: bigint): void { + this.offset = this.buff.writeBigUInt64BE(value, this.offset); + } + + public writeBigUInt64LE(value: bigint): void { + this.offset = this.buff.writeBigUInt64LE(value, this.offset); + } + + public writeBuffer(value: Buffer): void { + if (value.length > this.getRemainderLength()) { + throw new Error("Write over buffer boundary."); + } + + this.offset += value.copy(this.buff, this.offset); + } + + public readInt8(): number { + const value = this.buff.readInt8(this.offset); + this.offset += 1; + return value; + } + + public readInt16BE(): number { + const value = this.buff.readInt16BE(this.offset); + this.offset += 2; + return value; + } + + public readInt16LE(): number { + const value = this.buff.readInt16LE(this.offset); + this.offset += 2; + return value; + } + + public readInt32BE(): number { + const value = this.buff.readInt32BE(this.offset); + this.offset += 4; + return value; + } + + public readInt32LE(): number { + const value = this.buff.readInt32LE(this.offset); + this.offset += 4; + return value; + } + + public readBigInt64BE(): bigint { + const value = this.buff.readBigInt64BE(this.offset); + this.offset += 8; + return value; + } + + public readBigInt64LE(): bigint { + const value = this.buff.readBigInt64LE(this.offset); + this.offset += 8; + return value; + } + + public readUInt8(): number { + const value = this.buff.readUInt8(this.offset); + this.offset += 1; + return value; + } + + public readUInt16BE(): number { + const value = this.buff.readUInt16BE(this.offset); + this.offset += 2; + return value; + } + + public readUInt16LE(): number { + const value = this.buff.readUInt16LE(this.offset); + this.offset += 2; + return value; + } + + public readUInt32BE(): number { + const value = this.buff.readUInt32BE(this.offset); + this.offset += 4; + return value; + } + + public readUInt32LE(): number { + const value = this.buff.readUInt32LE(this.offset); + this.offset += 4; + return value; + } + + public readBigUInt64BE(): bigint { + const value = this.buff.readBigUInt64BE(this.offset); + this.offset += 8; + return value; + } + + public readBigUInt64LE(): bigint { + const value = this.buff.readBigUInt64LE(this.offset); + this.offset += 8; + return value; + } + + public readBuffer(length: number): Buffer { + if (length > this.getRemainderLength()) { + throw new Error("Read over buffer boundary."); + } + + const value = this.buff.slice(this.offset, this.offset + length); + this.offset += length; + return value; + } +} diff --git a/packages/crypto/src/utils/index.ts b/packages/crypto/src/utils/index.ts index 9a4a718d4f..55749c5b4b 100644 --- a/packages/crypto/src/utils/index.ts +++ b/packages/crypto/src/utils/index.ts @@ -4,6 +4,7 @@ import { configManager } from "../managers"; import { Base58 } from "./base58"; import { BigNumber } from "./bignum"; import { calculateBlockTime, isNewBlockTime } from "./block-time-calculator"; +import { ByteBuffer } from "./byte-buffer"; import { isLocalHost, isValidPeer } from "./is-valid-peer"; let genesisTransactions: { [key: string]: boolean }; @@ -107,4 +108,4 @@ export const isSupportedTransactionVersion = (version: number): boolean => { return true; }; -export { Base58, BigNumber, isValidPeer, isLocalHost, calculateBlockTime, isNewBlockTime }; +export { Base58, BigNumber, ByteBuffer, isValidPeer, isLocalHost, calculateBlockTime, isNewBlockTime }; diff --git a/packages/crypto/src/validation/schemas.ts b/packages/crypto/src/validation/schemas.ts index 064bf0a723..75a69934f5 100644 --- a/packages/crypto/src/validation/schemas.ts +++ b/packages/crypto/src/validation/schemas.ts @@ -39,7 +39,7 @@ export const schemas = { walletVote: { $id: "walletVote", - allOf: [{ type: "string", pattern: "^[+|-][a-zA-Z0-9]{66}$" }, { transform: ["toLowerCase"] }], + allOf: [{ type: "string", pattern: "^[+|-][a-fA-F0-9]{66}$" }, { transform: ["toLowerCase"] }], }, username: { diff --git a/scripts/api-iptables.sh b/scripts/api-iptables.sh new file mode 100644 index 0000000000..d1b51972cf --- /dev/null +++ b/scripts/api-iptables.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +#mainnet_ports API_GLOBAL=4003 / devnet_ports API_GLOBAL=4003 / testnet_ports API_GLOBAL=4003 +API_GLOBAL=4003 +API_GLOBAL_RATE=300/second +API_GLOBAL_BURST=100 + +#Initialize api limiter +start_limit() { + +table=$(sudo iptables -nL API_LIMIT 2> /dev/null) +myip=$(ip -o route get to 1.1.1.1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p') + +if [[ $table ]]; then + sudo iptables -F API_LIMIT + sudo iptables --append API_LIMIT --match limit --limit ${API_GLOBAL_RATE} --limit-burst ${API_GLOBAL_BURST} -j ACCEPT + sudo iptables -A API_LIMIT -j REJECT + echo "API Connection Limits exist, resetting rules..." + echo "Done!" +else + echo "Applying API Connection Limits..." + sudo iptables -N API_LIMIT + sudo iptables -I INPUT --match conntrack --ctstate NEW -p tcp -d $myip --dport ${API_GLOBAL} -j API_LIMIT + sudo iptables --append API_LIMIT --match limit --limit ${API_GLOBAL_RATE} --limit-burst ${API_GLOBAL_BURST} -j ACCEPT + sudo iptables -A API_LIMIT -j REJECT + echo "Done!" +fi +} + +#Stop limiter +stop_limit() { + +table=$(sudo iptables -nL API_LIMIT 2> /dev/null) +myip=$(ip -o route get to 1.1.1.1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p') + +if [[ $table ]]; then + sudo iptables -F API_LIMIT + sudo iptables -D INPUT --match conntrack --ctstate NEW -p tcp -d $myip --dport ${API_GLOBAL} -j API_LIMIT > /dev/null 2>&1 + sudo iptables -X API_LIMIT + echo "Removed API Connection Limits!" +fi + +} + +is_enabled() { + +table=$(sudo iptables -nL API_LIMIT 2> /dev/null) +rate=$(sudo iptables -vxnL API_LIMIT 1 | awk '{print $12}') +burst=$(sudo iptables -vxnL API_LIMIT 1 | awk '{print $14}') + +if [[ $table ]]; then + echo "Status: Enabled" + echo "Connection rate limit: ${rate}" + echo "Connection burst limit: ${burst}" +else + echo "Status: Disabled" +fi + +} + +case "$1" in + start) start_limit ;; + stop) stop_limit;; + restart) stop_limit; start_limit ;; + status) is_enabled;; + *) echo "usage: $0 start|stop|restart|status" >&2 + exit 1 + ;; +esac diff --git a/scripts/deps/unused.js b/scripts/deps/unused.js index dd7bb49bc8..7057f078d0 100644 --- a/scripts/deps/unused.js +++ b/scripts/deps/unused.js @@ -1,50 +1,41 @@ const depcheck = require("depcheck"); -const { - resolve -} = require("path"); -const { - lstatSync, - readdirSync -} = require("fs"); +const { resolve } = require("path"); +const { lstatSync, readdirSync } = require("fs"); const source = resolve(__dirname, "../../packages"); const pkgs = readdirSync(source) - .filter(name => lstatSync(`${source}/${name}`).isDirectory()) + .filter((name) => lstatSync(`${source}/${name}`).isDirectory()) .sort(); for (const pkg of pkgs) { - depcheck(`${source}/${pkg}`, { - ignoreDirs: [ - '__tests__', - 'benchmark', - 'dist', - 'docker', - 'scripts', - ], - ignoreMatches: [ - '@types/*' - ], - }, unused => { - const dependencies = Object.values(unused.dependencies); - const devDependencies = Object.values(unused.devDependencies); + depcheck( + `${source}/${pkg}`, + { + ignoreDirs: ["__tests__", "benchmark", "dist", "docker", "scripts"], + ignoreMatches: ["@types/*"], + }, + (unused) => { + const dependencies = Object.values(unused.dependencies); + const devDependencies = Object.values(unused.devDependencies); - if (dependencies || devDependencies) { - console.log(`[FAIL] ${pkg}`) + if (dependencies || devDependencies) { + console.log(`[FAIL] ${pkg}`); - if (dependencies.length > 0) { - for (const dep of dependencies) { - console.log(`[PRO] ${dep}`) + if (dependencies.length > 0) { + for (const dep of dependencies) { + console.log(`[PRO] ${dep}`); + } } - } - if (devDependencies.length > 0) { - for (const dep of devDependencies) { - console.log(`[DEV] ${dep}`) + if (devDependencies.length > 0) { + for (const dep of devDependencies) { + console.log(`[DEV] ${dep}`); + } } + } else { + console.log(`[PASS] ${pkg}`); } - } else { - console.log(`[PASS] ${pkg}`) - } - }); + }, + ); } diff --git a/scripts/docker/templates/devnet/restore.sh b/scripts/docker/templates/devnet/restore.sh index efd5ae4c03..018206ebd5 100755 --- a/scripts/docker/templates/devnet/restore.sh +++ b/scripts/docker/templates/devnet/restore.sh @@ -1,8 +1,8 @@ -DOCKER_DB_NAME="$(docker-compose ps -q postgres)" +DOCKER_DB_NAME="$(docker compose ps -q postgres)" DB_HOSTNAME=postgres DB_USER={token} LOCAL_DUMP_PATH="snapshot.dump" -docker-compose up -d postgres +docker compose up -d postgres docker exec -i "${DOCKER_DB_NAME}" pg_restore -C --clean --no-acl --no-owner -U "${DB_USER}" -d "${DB_HOSTNAME}" < "${LOCAL_DUMP_PATH}" -docker-compose stop postgres +docker compose stop postgres diff --git a/scripts/docker/templates/testnet/restore.sh b/scripts/docker/templates/testnet/restore.sh index efd5ae4c03..018206ebd5 100755 --- a/scripts/docker/templates/testnet/restore.sh +++ b/scripts/docker/templates/testnet/restore.sh @@ -1,8 +1,8 @@ -DOCKER_DB_NAME="$(docker-compose ps -q postgres)" +DOCKER_DB_NAME="$(docker compose ps -q postgres)" DB_HOSTNAME=postgres DB_USER={token} LOCAL_DUMP_PATH="snapshot.dump" -docker-compose up -d postgres +docker compose up -d postgres docker exec -i "${DOCKER_DB_NAME}" pg_restore -C --clean --no-acl --no-owner -U "${DB_USER}" -d "${DB_HOSTNAME}" < "${LOCAL_DUMP_PATH}" -docker-compose stop postgres +docker compose stop postgres diff --git a/scripts/version.sh b/scripts/version.sh index 14dd98bd9c..e9fa044a41 100755 --- a/scripts/version.sh +++ b/scripts/version.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -./node_modules/lerna/cli.js version $1 --exact --no-git-tag-version --yes +lerna version $1 --exact --no-git-tag-version --yes diff --git a/tsconfig.json b/tsconfig.json index efffa1cb1d..898fd771af 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,12 +3,13 @@ "assumeChangesOnlyAffectDirectDependencies": true, "baseUrl": "./", "declaration": true, + "declarationMap": true, "emitDecoratorMetadata": true, "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "lib": ["es2019"], - "module": "commonjs", + "lib": ["es2020"], + "module": "CommonJS", "moduleResolution": "node", "newLine": "lf", "noEmitOnError": true, @@ -27,7 +28,7 @@ "sourceMap": true, "strict": true, "stripInternal": true, - "target": "es2019", + "target": "es2020", "typeRoots": ["reflect-metadata", "node_modules/@types"] }, "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"] diff --git a/yarn.lock b/yarn.lock index 9f434a6681..94fa7cd23a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,19 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@arkecosystem/crypto-identities@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-identities/-/crypto-identities-1.2.0.tgz#9301a8c322663dac7759a6759ec8c7a59d73f27e" @@ -12,15 +25,15 @@ fast-memoize "^2.5.1" wif "^2.0.6" -"@arkecosystem/crypto-networks@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-networks/-/crypto-networks-1.2.0.tgz#7f00d8f2421923ab779b14c3d60b092c5484b44f" - integrity sha512-ZytgxSgP4lfOUdQLvY6PyWkhvx6//V24MKv/faom9preIiamEfwEHLobFRs0cr5F1wSD7brMrLN/KcCkUw2Itw== +"@arkecosystem/crypto-networks@1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-networks/-/crypto-networks-1.8.2.tgz#80cf278d1838ff237bd987dc66d511b72471f1f0" + integrity sha512-yrx7m0+0CEX3Rztvj9yS9BYAsZY+of2nFb/e6yZKUhx9o+HoI44bzojcPCwu5vTsExG7ourRfG+6dvu8ylGHXQ== -"@arkecosystem/utils@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@arkecosystem/utils/-/utils-1.3.0.tgz#25150fd990e1192668a75c32b94b88dabc0f86eb" - integrity sha512-H3QlzZRHE6NXh5hJXGAAHdPGGq9VemgblpMcRixDYLEzpB9tP3S1AM3uNCr5KSjP+B6QuGt3B4yYTdzgQEvZ9A== +"@arkecosystem/utils@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@arkecosystem/utils/-/utils-1.3.1.tgz#2995bc92132c2d75a6f142ee9990a08adc1ab05c" + integrity sha512-CxEE65pBqlsg7tHiuoUh/IzwkDk56afgAUUQg6rgFhB3S4UQf0nt26rGC598ymh3+qnTLUvDsxdRR+P6toXLig== dependencies: "@hapi/bourne" "^2.0.0" deepmerge "^4.2.2" @@ -36,19 +49,20 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.14.5" + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@7.15.5", "@babel/core@^7.1.0", "@babel/core@^7.13.15", "@babel/core@^7.7.5": +"@babel/core@7.15.5": version "7.15.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== @@ -69,64 +83,90 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" - integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== - dependencies: - "@babel/types" "^7.15.4" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" - integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== - dependencies: - "@babel/types" "^7.15.4" +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.13.15", "@babel/core@^7.7.5": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@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.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" - integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== +"@babel/generator@^7.15.4", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== +"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" + "@babel/types" "^7.22.5" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" - integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/types" "^7.22.15" -"@babel/helper-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + "@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" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.15": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz#fddfdf51fca28f23d16b9e3935a4732690acfad6" + integrity sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.2.2", "@babel/helper-define-polyfill-provider@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10" + integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -137,295 +177,317 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" - integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== - dependencies: - "@babel/helper-get-function-arity" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" - integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== dependencies: - "@babel/types" "^7.15.4" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" - integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-wrap-function" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/types" "^7.22.5" -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" - integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== +"@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@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" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.14.5", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.15.4", "@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" -"@babel/helper-wrap-function@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" - integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== - dependencies: - "@babel/helper-function-name" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.5", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.23.0", "@babel/parser@^7.23.6", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.5", "@babel/parser@^7.15.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" - integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" - integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-proposal-async-generator-functions@^7.13.15", "@babel/plugin-proposal-async-generator-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" - integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" - integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.13.8", "@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8", "@babel/plugin-proposal-object-rest-spread@^7.14.7", "@babel/plugin-proposal-object-rest-spread@^7.15.6": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" - integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== +"@babel/plugin-proposal-object-rest-spread@^7.13.8", "@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.13.8", "@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-private-property-in-object@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" - integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== + version "7.21.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c" + integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -469,7 +531,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -539,265 +615,413 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== +"@babel/plugin-transform-arrow-functions@^7.14.5", "@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== +"@babel/plugin-transform-async-generator-functions@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" + integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.15.3": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" - integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== +"@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-classes@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" - integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== +"@babel/plugin-transform-block-scoped-functions@^7.14.5", "@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.15.3", "@babel/plugin-transform-block-scoping@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.15.4", "@babel/plugin-transform-classes@^7.23.8": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== +"@babel/plugin-transform-computed-properties@^7.14.5", "@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" -"@babel/plugin-transform-destructuring@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== +"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.23.3", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== +"@babel/plugin-transform-duplicate-keys@^7.14.5", "@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== +"@babel/plugin-transform-dynamic-import@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" - integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== +"@babel/plugin-transform-exponentiation-operator@^7.14.5", "@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== +"@babel/plugin-transform-export-namespace-from@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== +"@babel/plugin-transform-for-of@^7.15.4", "@babel/plugin-transform-for-of@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== +"@babel/plugin-transform-function-name@^7.14.5", "@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== +"@babel/plugin-transform-json-strings@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" - integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== +"@babel/plugin-transform-literals@^7.14.5", "@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== dependencies: - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" - integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== +"@babel/plugin-transform-logical-assignment-operators@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== dependencies: - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== +"@babel/plugin-transform-member-expression-literals@^7.14.5", "@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" - integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== +"@babel/plugin-transform-modules-amd@^7.14.5", "@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== +"@babel/plugin-transform-modules-commonjs@^7.15.4", "@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== +"@babel/plugin-transform-modules-systemjs@^7.15.4", "@babel/plugin-transform-modules-systemjs@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" + integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-parameters@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" - integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== +"@babel/plugin-transform-modules-umd@^7.14.5", "@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== +"@babel/plugin-transform-new-target@^7.14.5", "@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== dependencies: - regenerator-transform "^0.14.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" + +"@babel/plugin-transform-object-super@^7.14.5", "@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.15.4", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.14.5", "@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.14.5", "@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.14.5", "@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.13.15": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz#d3aa650d11678ca76ce294071fda53d7804183b3" - integrity sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw== + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz#2c64d0680fc8e09e1dfe8fd5c646fe72abd82004" + integrity sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - semver "^6.3.0" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== +"@babel/plugin-transform-shorthand-properties@^7.14.5", "@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" - integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== +"@babel/plugin-transform-spread@^7.14.6", "@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== +"@babel/plugin-transform-sticky-regex@^7.14.5", "@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== +"@babel/plugin-transform-template-literals@^7.14.5", "@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== +"@babel/plugin-transform-typeof-symbol@^7.14.5", "@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== +"@babel/plugin-transform-unicode-escapes@^7.14.5", "@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.14.5", "@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@7.15.4": version "7.15.4" @@ -879,35 +1103,26 @@ semver "^6.3.0" "@babel/preset-env@^7.13.15": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" - integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" - "@babel/plugin-proposal-async-generator-functions" "^7.15.4" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.15.4" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.15.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.15.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" + integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -917,50 +1132,75 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.15.3" - "@babel/plugin-transform-classes" "^7.15.4" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.15.4" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" - "@babel/plugin-transform-modules-systemjs" "^7.15.4" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.15.4" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.6" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.6" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.16.0" - semver "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.9" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.4" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.4" + "@babel/plugin-transform-classes" "^7.23.8" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.4" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.4" + "@babel/plugin-transform-for-of" "^7.23.6" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.4" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.9" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" + "@babel/plugin-transform-numeric-separator" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.4" + "@babel/plugin-transform-optional-chaining" "^7.23.4" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.4" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" "@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + version "0.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" + integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -968,43 +1208,50 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.15.4", "@babel/template@^7.3.3": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.5", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - debug "^4.1.0" +"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.15.4", "@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== + 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.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.15.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== +"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== dependencies: - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1020,6 +1267,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@commitlint/cli@11.0.0": version "11.0.0" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" @@ -1156,6 +1408,14 @@ resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== +"@dependents/detective-less@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@dependents/detective-less/-/detective-less-3.0.2.tgz#c6e46997010fe03a5dc98351a7e99a46d34f5832" + integrity sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^5.0.1" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -1171,80 +1431,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@evocateur/libnpmaccess@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" - integrity sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - aproba "^2.0.0" - figgy-pudding "^3.5.1" - get-stream "^4.0.0" - npm-package-arg "^6.1.0" - -"@evocateur/libnpmpublish@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz#55df09d2dca136afba9c88c759ca272198db9f1a" - integrity sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - aproba "^2.0.0" - figgy-pudding "^3.5.1" - get-stream "^4.0.0" - lodash.clonedeep "^4.5.0" - normalize-package-data "^2.4.0" - npm-package-arg "^6.1.0" - semver "^5.5.1" - ssri "^6.0.1" - -"@evocateur/npm-registry-fetch@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz#8c4c38766d8d32d3200fcb0a83f064b57365ed66" - integrity sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g== - dependencies: - JSONStream "^1.3.4" - bluebird "^3.5.1" - figgy-pudding "^3.4.1" - lru-cache "^5.1.1" - make-fetch-happen "^5.0.0" - npm-package-arg "^6.1.0" - safe-buffer "^5.1.2" - -"@evocateur/pacote@^9.6.3": - version "9.6.5" - resolved "https://registry.yarnpkg.com/@evocateur/pacote/-/pacote-9.6.5.tgz#33de32ba210b6f17c20ebab4d497efc6755f4ae5" - integrity sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - bluebird "^3.5.3" - cacache "^12.0.3" - chownr "^1.1.2" - figgy-pudding "^3.5.1" - get-stream "^4.1.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - make-fetch-happen "^5.0.0" - minimatch "^3.0.4" - minipass "^2.3.5" - mississippi "^3.0.0" - mkdirp "^0.5.1" - normalize-package-data "^2.5.0" - npm-package-arg "^6.1.0" - npm-packlist "^1.4.4" - npm-pick-manifest "^3.0.0" - osenv "^0.1.5" - promise-inflight "^1.0.1" - promise-retry "^1.1.1" - protoduck "^5.0.1" - rimraf "^2.6.3" - safe-buffer "^5.2.0" - semver "^5.7.0" - ssri "^6.0.1" - tar "^4.4.10" - unique-filename "^1.1.1" - which "^1.3.1" - "@faustbrian/benchmarker@0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@faustbrian/benchmarker/-/benchmarker-0.1.2.tgz#80fe90f51473eb711fb59b706d52acf4253fbad2" @@ -1252,10 +1438,10 @@ dependencies: benchmark "^2.1.4" -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@hapi/accept@^5.0.1": version "5.0.2" @@ -1302,9 +1488,9 @@ "@hapi/hoek" "9.x.x" "@hapi/bourne@2.x.x", "@hapi/bourne@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" - integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" + integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== "@hapi/call@^8.0.0": version "8.0.1" @@ -1384,11 +1570,16 @@ "@hapi/hoek" "9.x.x" "@hapi/validate" "1.x.x" -"@hapi/hoek@9.2.0", "@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.0.4": +"@hapi/hoek@9.2.0": version "9.2.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== +"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.0.4", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + "@hapi/iron@6.x.x": version "6.0.0" resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" @@ -1416,10 +1607,10 @@ "@hapi/hoek" "^9.0.4" "@hapi/vise" "^4.0.0" -"@hapi/pez@^5.0.1": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.0.3.tgz#b75446e6fef8cbb16816573ab7da1b0522e7a2a1" - integrity sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA== +"@hapi/pez@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.1.0.tgz#c03a5e01f8be01cfabc4c0017631e619586321c1" + integrity sha512-YfB0btnkLB3lb6Ry/1KifnMPBm5ZPfaAHWFskzOMAgDgXgcBgA+zjpIynyEiBfWEz22DBT8o1e2tAaBdlt8zbw== dependencies: "@hapi/b64" "5.x.x" "@hapi/boom" "9.x.x" @@ -1463,9 +1654,9 @@ "@hapi/hoek" "9.x.x" "@hapi/statehood@^7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.3.tgz#655166f3768344ed3c3b50375a303cdeca8040d9" - integrity sha512-pYB+pyCHkf2Amh67QAXz7e/DN9jcMplIL7Z6N8h0K+ZTy0b404JKPEYkbWHSnDtxLjJB/OtgElxocr2fMH4G7w== + version "7.0.4" + resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.4.tgz#6acb9d0817b5c657089356f7d9fd60af0bce4f41" + integrity sha512-Fia6atroOVmc5+2bNOxF6Zv9vpbNAjEXNcUbWXavDqhnJDlchwUUwKS5LCi5mGtCTxRhUKKHwuxuBZJkmLZ7fw== dependencies: "@hapi/boom" "9.x.x" "@hapi/bounce" "2.x.x" @@ -1476,16 +1667,16 @@ "@hapi/validate" "1.x.x" "@hapi/subtext@^7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.0.3.tgz#f7440fc7c966858e1f39681e99eb6171c71e7abd" - integrity sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A== + version "7.1.0" + resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.1.0.tgz#b4d1ea2aeab1923ac130a24e75921e38fab5b15b" + integrity sha512-n94cU6hlvsNRIpXaROzBNEJGwxC+HA69q769pChzej84On8vsU14guHDub7Pphr/pqn5b93zV3IkMPDU5AUiXA== dependencies: "@hapi/boom" "9.x.x" "@hapi/bourne" "2.x.x" "@hapi/content" "^5.0.2" "@hapi/file" "2.x.x" "@hapi/hoek" "9.x.x" - "@hapi/pez" "^5.0.1" + "@hapi/pez" "^5.1.0" "@hapi/wreck" "17.x.x" "@hapi/teamwork@4.x.x": @@ -1493,12 +1684,17 @@ resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-4.0.0.tgz#4aadbb88de13bce39ab8431565cd50c7ecc6327f" integrity sha512-V6xYOrr5aFv/IJqNPneaYCu8vuGTKisamqHVRS3JJnbZr18TrpXdsJOYk9pjPhFti+M2YETPebQLUr820N5NoQ== -"@hapi/teamwork@5.1.0", "@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.0": +"@hapi/teamwork@5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.0.tgz#7801a61fc727f702fd2196ef7625eb4e389f4124" integrity sha512-llqoQTrAJDTXxG3c4Kz/uzhBS1TsmSBa/XG5SPcVXgmffHE1nFtyLIK0hNJHCB3EuBKT84adzd1hZNY9GJLWtg== -"@hapi/topo@^5.0.0": +"@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" + integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== + +"@hapi/topo@^5.0.0", "@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== @@ -1521,9 +1717,9 @@ "@hapi/hoek" "9.x.x" "@hapi/wreck@17.x.x": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-17.1.0.tgz#fbdc380c6f3fa1f8052dc612b2d3b6ce3e88dbec" - integrity sha512-nx6sFyfqOpJ+EFrHX+XWwJAxs3ju4iHdbB/bwR8yTNZOiYmuhA8eCe7lYPtYmb4j7vyK/SlbaQsmTtUrMvPEBw== + version "17.2.0" + resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-17.2.0.tgz#a5b69b724fa8fa25550fb02f55c649becfc59f63" + integrity sha512-pJ5kjYoRPYDv+eIuiLQqhGon341fr2bNIYZjuotuPJG/3Ilzr/XtI+JAp0A86E2bYfsS3zBPABuS2ICkaXFT8g== dependencies: "@hapi/boom" "9.x.x" "@hapi/bourne" "2.x.x" @@ -1539,9 +1735,26 @@ minimatch "^3.0.4" "@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1677,6 +1890,13 @@ optionalDependencies: node-notifier "^8.0.0" +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + "@jest/source-map@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" @@ -1717,767 +1937,191 @@ "@jest/test-sequencer@^26.6.3": version "26.6.3" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@lerna/add@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" - integrity sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A== - dependencies: - "@evocateur/pacote" "^9.6.3" - "@lerna/bootstrap" "3.21.0" - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/npm-conf" "3.16.0" - "@lerna/validation-error" "3.13.0" - dedent "^0.7.0" - npm-package-arg "^6.1.0" - p-map "^2.1.0" - semver "^6.2.0" - -"@lerna/bootstrap@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.21.0.tgz#bcd1b651be5b0970b20d8fae04c864548123aed6" - integrity sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/has-npm-version" "3.16.5" - "@lerna/npm-install" "3.16.5" - "@lerna/package-graph" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/rimraf-dir" "3.16.5" - "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.5" - "@lerna/symlink-binary" "3.17.0" - "@lerna/symlink-dependencies" "3.17.0" - "@lerna/validation-error" "3.13.0" - dedent "^0.7.0" - get-port "^4.2.0" - multimatch "^3.0.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - p-finally "^1.0.0" - p-map "^2.1.0" - p-map-series "^1.0.0" - p-waterfall "^1.0.0" - read-package-tree "^5.1.6" - semver "^6.2.0" - -"@lerna/changed@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.21.0.tgz#108e15f679bfe077af500f58248c634f1044ea0b" - integrity sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw== - dependencies: - "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.21.0" - "@lerna/listable" "3.18.5" - "@lerna/output" "3.13.0" - -"@lerna/check-working-tree@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz#b4f8ae61bb4523561dfb9f8f8d874dd46bb44baa" - integrity sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ== - dependencies: - "@lerna/collect-uncommitted" "3.16.5" - "@lerna/describe-ref" "3.16.5" - "@lerna/validation-error" "3.13.0" - -"@lerna/child-process@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.16.5.tgz#38fa3c18064aa4ac0754ad80114776a7b36a69b2" - integrity sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg== - dependencies: - chalk "^2.3.1" - execa "^1.0.0" - strong-log-transformer "^2.0.0" - -"@lerna/clean@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.21.0.tgz#c0b46b5300cc3dae2cda3bec14b803082da3856d" - integrity sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/prompt" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/rimraf-dir" "3.16.5" - p-map "^2.1.0" - p-map-series "^1.0.0" - p-waterfall "^1.0.0" - -"@lerna/cli@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.18.5.tgz#c90c461542fcd35b6d5b015a290fb0dbfb41d242" - integrity sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA== - dependencies: - "@lerna/global-options" "3.13.0" - dedent "^0.7.0" - npmlog "^4.1.2" - yargs "^14.2.2" - -"@lerna/collect-uncommitted@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz#a494d61aac31cdc7aec4bbe52c96550274132e63" - integrity sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg== - dependencies: - "@lerna/child-process" "3.16.5" - chalk "^2.3.1" - figgy-pudding "^3.5.1" - npmlog "^4.1.2" - -"@lerna/collect-updates@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.20.0.tgz#62f9d76ba21a25b7d9fbf31c02de88744a564bd1" - integrity sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/describe-ref" "3.16.5" - minimatch "^3.0.4" - npmlog "^4.1.2" - slash "^2.0.0" - -"@lerna/command@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.21.0.tgz#9a2383759dc7b700dacfa8a22b2f3a6e190121f7" - integrity sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/package-graph" "3.18.5" - "@lerna/project" "3.21.0" - "@lerna/validation-error" "3.13.0" - "@lerna/write-log-file" "3.13.0" - clone-deep "^4.0.1" - dedent "^0.7.0" - execa "^1.0.0" - is-ci "^2.0.0" - npmlog "^4.1.2" - -"@lerna/conventional-commits@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz#2798f4881ee2ef457bdae027ab7d0bf0af6f1e09" - integrity sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA== - dependencies: - "@lerna/validation-error" "3.13.0" - conventional-changelog-angular "^5.0.3" - conventional-changelog-core "^3.1.6" - conventional-recommended-bump "^5.0.0" - fs-extra "^8.1.0" - get-stream "^4.0.0" - lodash.template "^4.5.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - pify "^4.0.1" - semver "^6.2.0" - -"@lerna/create-symlink@3.16.2": - version "3.16.2" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.16.2.tgz#412cb8e59a72f5a7d9463e4e4721ad2070149967" - integrity sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw== - dependencies: - "@zkochan/cmd-shim" "^3.1.0" - fs-extra "^8.1.0" - npmlog "^4.1.2" - -"@lerna/create@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.22.0.tgz#d6bbd037c3dc5b425fe5f6d1b817057c278f7619" - integrity sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw== - dependencies: - "@evocateur/pacote" "^9.6.3" - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/npm-conf" "3.16.0" - "@lerna/validation-error" "3.13.0" - camelcase "^5.0.0" - dedent "^0.7.0" - fs-extra "^8.1.0" - globby "^9.2.0" - init-package-json "^1.10.3" - npm-package-arg "^6.1.0" - p-reduce "^1.0.0" - pify "^4.0.1" - semver "^6.2.0" - slash "^2.0.0" - validate-npm-package-license "^3.0.3" - validate-npm-package-name "^3.0.0" - whatwg-url "^7.0.0" - -"@lerna/describe-ref@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.16.5.tgz#a338c25aaed837d3dc70b8a72c447c5c66346ac0" - integrity sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw== - dependencies: - "@lerna/child-process" "3.16.5" - npmlog "^4.1.2" - -"@lerna/diff@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.21.0.tgz#e6df0d8b9916167ff5a49fcb02ac06424280a68d" - integrity sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/validation-error" "3.13.0" - npmlog "^4.1.2" - -"@lerna/exec@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.21.0.tgz#17f07533893cb918a17b41bcc566dc437016db26" - integrity sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/profiler" "3.20.0" - "@lerna/run-topologically" "3.18.5" - "@lerna/validation-error" "3.13.0" - p-map "^2.1.0" - -"@lerna/filter-options@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.20.0.tgz#0f0f5d5a4783856eece4204708cc902cbc8af59b" - integrity sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g== - dependencies: - "@lerna/collect-updates" "3.20.0" - "@lerna/filter-packages" "3.18.0" - dedent "^0.7.0" - figgy-pudding "^3.5.1" - npmlog "^4.1.2" - -"@lerna/filter-packages@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.18.0.tgz#6a7a376d285208db03a82958cfb8172e179b4e70" - integrity sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ== - dependencies: - "@lerna/validation-error" "3.13.0" - multimatch "^3.0.0" - npmlog "^4.1.2" - -"@lerna/get-npm-exec-opts@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz#d1b552cb0088199fc3e7e126f914e39a08df9ea5" - integrity sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw== - dependencies: - npmlog "^4.1.2" - -"@lerna/get-packed@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-3.16.0.tgz#1b316b706dcee86c7baa55e50b087959447852ff" - integrity sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw== - dependencies: - fs-extra "^8.1.0" - ssri "^6.0.1" - tar "^4.4.8" - -"@lerna/github-client@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-3.22.0.tgz#5d816aa4f76747ed736ae64ff962b8f15c354d95" - integrity sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg== - dependencies: - "@lerna/child-process" "3.16.5" - "@octokit/plugin-enterprise-rest" "^6.0.1" - "@octokit/rest" "^16.28.4" - git-url-parse "^11.1.2" - npmlog "^4.1.2" - -"@lerna/gitlab-client@3.15.0": - version "3.15.0" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz#91f4ec8c697b5ac57f7f25bd50fe659d24aa96a6" - integrity sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q== - dependencies: - node-fetch "^2.5.0" - npmlog "^4.1.2" - whatwg-url "^7.0.0" - -"@lerna/global-options@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.13.0.tgz#217662290db06ad9cf2c49d8e3100ee28eaebae1" - integrity sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ== - -"@lerna/has-npm-version@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz#ab83956f211d8923ea6afe9b979b38cc73b15326" - integrity sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q== - dependencies: - "@lerna/child-process" "3.16.5" - semver "^6.2.0" - -"@lerna/import@3.22.0": - version "3.22.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.22.0.tgz#1a5f0394f38e23c4f642a123e5e1517e70d068d2" - integrity sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - "@lerna/prompt" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/validation-error" "3.13.0" - dedent "^0.7.0" - fs-extra "^8.1.0" - p-map-series "^1.0.0" - -"@lerna/info@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-3.21.0.tgz#76696b676fdb0f35d48c83c63c1e32bb5e37814f" - integrity sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/output" "3.13.0" - envinfo "^7.3.1" - -"@lerna/init@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.21.0.tgz#1e810934dc8bf4e5386c031041881d3b4096aa5c" - integrity sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/command" "3.21.0" - fs-extra "^8.1.0" - p-map "^2.1.0" - write-json-file "^3.2.0" - -"@lerna/link@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.21.0.tgz#8be68ff0ccee104b174b5bbd606302c2f06e9d9b" - integrity sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/package-graph" "3.18.5" - "@lerna/symlink-dependencies" "3.17.0" - p-map "^2.1.0" - slash "^2.0.0" - -"@lerna/list@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.21.0.tgz#42f76fafa56dea13b691ec8cab13832691d61da2" - integrity sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/listable" "3.18.5" - "@lerna/output" "3.13.0" - -"@lerna/listable@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.18.5.tgz#e82798405b5ed8fc51843c8ef1e7a0e497388a1a" - integrity sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg== - dependencies: - "@lerna/query-graph" "3.18.5" - chalk "^2.3.1" - columnify "^1.5.4" - -"@lerna/log-packed@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.16.0.tgz#f83991041ee77b2495634e14470b42259fd2bc16" - integrity sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ== - dependencies: - byte-size "^5.0.1" - columnify "^1.5.4" - has-unicode "^2.0.1" - npmlog "^4.1.2" - -"@lerna/npm-conf@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.16.0.tgz#1c10a89ae2f6c2ee96962557738685300d376827" - integrity sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA== - dependencies: - config-chain "^1.1.11" - pify "^4.0.1" - -"@lerna/npm-dist-tag@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz#9ef9abb7c104077b31f6fab22cc73b314d54ac55" - integrity sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ== - dependencies: - "@evocateur/npm-registry-fetch" "^4.0.0" - "@lerna/otplease" "3.18.5" - figgy-pudding "^3.5.1" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - -"@lerna/npm-install@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.16.5.tgz#d6bfdc16f81285da66515ae47924d6e278d637d3" - integrity sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/get-npm-exec-opts" "3.13.0" - fs-extra "^8.1.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - signal-exit "^3.0.2" - write-pkg "^3.1.0" - -"@lerna/npm-publish@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.18.5.tgz#240e4039959fd9816b49c5b07421e11b5cb000af" - integrity sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg== - dependencies: - "@evocateur/libnpmpublish" "^1.2.2" - "@lerna/otplease" "3.18.5" - "@lerna/run-lifecycle" "3.16.2" - figgy-pudding "^3.5.1" - fs-extra "^8.1.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - pify "^4.0.1" - read-package-json "^2.0.13" - -"@lerna/npm-run-script@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz#9c2ec82453a26c0b46edc0bb7c15816c821f5c15" - integrity sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ== - dependencies: - "@lerna/child-process" "3.16.5" - "@lerna/get-npm-exec-opts" "3.13.0" - npmlog "^4.1.2" - -"@lerna/otplease@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-3.18.5.tgz#b77b8e760b40abad9f7658d988f3ea77d4fd0231" - integrity sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog== - dependencies: - "@lerna/prompt" "3.18.5" - figgy-pudding "^3.5.1" - -"@lerna/output@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.13.0.tgz#3ded7cc908b27a9872228a630d950aedae7a4989" - integrity sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg== - dependencies: - npmlog "^4.1.2" - -"@lerna/pack-directory@3.16.4": - version "3.16.4" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.16.4.tgz#3eae5f91bdf5acfe0384510ed53faddc4c074693" - integrity sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng== - dependencies: - "@lerna/get-packed" "3.16.0" - "@lerna/package" "3.16.0" - "@lerna/run-lifecycle" "3.16.2" - figgy-pudding "^3.5.1" - npm-packlist "^1.4.4" - npmlog "^4.1.2" - tar "^4.4.10" - temp-write "^3.4.0" - -"@lerna/package-graph@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.18.5.tgz#c740e2ea3578d059e551633e950690831b941f6b" - integrity sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA== - dependencies: - "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/validation-error" "3.13.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - semver "^6.2.0" - -"@lerna/package@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.16.0.tgz#7e0a46e4697ed8b8a9c14d59c7f890e0d38ba13c" - integrity sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw== + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== dependencies: - load-json-file "^5.3.0" - npm-package-arg "^6.1.0" - write-pkg "^3.1.0" + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" -"@lerna/prerelease-id-from-version@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz#b24bfa789f5e1baab914d7b08baae9b7bd7d83a1" - integrity sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA== +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== dependencies: - semver "^6.2.0" + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" -"@lerna/profiler@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-3.20.0.tgz#0f6dc236f4ea8f9ea5f358c6703305a4f32ad051" - integrity sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg== +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== dependencies: - figgy-pudding "^3.5.1" - fs-extra "^8.1.0" - npmlog "^4.1.2" - upath "^1.2.0" - -"@lerna/project@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.21.0.tgz#5d784d2d10c561a00f20320bcdb040997c10502d" - integrity sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A== - dependencies: - "@lerna/package" "3.16.0" - "@lerna/validation-error" "3.13.0" - cosmiconfig "^5.1.0" - dedent "^0.7.0" - dot-prop "^4.2.0" - glob-parent "^5.0.0" - globby "^9.2.0" - load-json-file "^5.3.0" - npmlog "^4.1.2" - p-map "^2.1.0" - resolve-from "^4.0.0" - write-json-file "^3.2.0" - -"@lerna/prompt@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.18.5.tgz#628cd545f225887d060491ab95df899cfc5218a1" - integrity sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ== - dependencies: - inquirer "^6.2.0" - npmlog "^4.1.2" - -"@lerna/publish@3.22.1": - version "3.22.1" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.22.1.tgz#b4f7ce3fba1e9afb28be4a1f3d88222269ba9519" - integrity sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw== - dependencies: - "@evocateur/libnpmaccess" "^3.1.2" - "@evocateur/npm-registry-fetch" "^4.0.0" - "@evocateur/pacote" "^9.6.3" - "@lerna/check-working-tree" "3.16.5" - "@lerna/child-process" "3.16.5" - "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.21.0" - "@lerna/describe-ref" "3.16.5" - "@lerna/log-packed" "3.16.0" - "@lerna/npm-conf" "3.16.0" - "@lerna/npm-dist-tag" "3.18.5" - "@lerna/npm-publish" "3.18.5" - "@lerna/otplease" "3.18.5" - "@lerna/output" "3.13.0" - "@lerna/pack-directory" "3.16.4" - "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/prompt" "3.18.5" - "@lerna/pulse-till-done" "3.13.0" - "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.5" - "@lerna/validation-error" "3.13.0" - "@lerna/version" "3.22.1" - figgy-pudding "^3.5.1" - fs-extra "^8.1.0" - npm-package-arg "^6.1.0" - npmlog "^4.1.2" - p-finally "^1.0.0" - p-map "^2.1.0" - p-pipe "^1.2.0" - semver "^6.2.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" -"@lerna/pulse-till-done@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz#c8e9ce5bafaf10d930a67d7ed0ccb5d958fe0110" - integrity sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA== +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: - npmlog "^4.1.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" -"@lerna/query-graph@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-3.18.5.tgz#df4830bb5155273003bf35e8dda1c32d0927bd86" - integrity sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: - "@lerna/package-graph" "3.18.5" - figgy-pudding "^3.5.1" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -"@lerna/resolve-symlink@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz#37fc7095fabdbcf317c26eb74e0d0bde8efd2386" - integrity sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ== - dependencies: - fs-extra "^8.1.0" - npmlog "^4.1.2" - read-cmd-shim "^1.0.1" +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@lerna/rimraf-dir@3.16.5": - version "3.16.5" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz#04316ab5ffd2909657aaf388ea502cb8c2f20a09" - integrity sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA== - dependencies: - "@lerna/child-process" "3.16.5" - npmlog "^4.1.2" - path-exists "^3.0.0" - rimraf "^2.6.2" +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@lerna/run-lifecycle@3.16.2": - version "3.16.2" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz#67b288f8ea964db9ea4fb1fbc7715d5bbb0bce00" - integrity sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A== +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: - "@lerna/npm-conf" "3.16.0" - figgy-pudding "^3.5.1" - npm-lifecycle "^3.1.2" - npmlog "^4.1.2" + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@lerna/run-topologically@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-3.18.5.tgz#3cd639da20e967d7672cb88db0f756b92f2fdfc3" - integrity sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg== - dependencies: - "@lerna/query-graph" "3.18.5" - figgy-pudding "^3.5.1" - p-queue "^4.0.0" +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@lerna/run@3.21.0": - version "3.21.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.21.0.tgz#2a35ec84979e4d6e42474fe148d32e5de1cac891" - integrity sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q== - dependencies: - "@lerna/command" "3.21.0" - "@lerna/filter-options" "3.20.0" - "@lerna/npm-run-script" "3.16.5" - "@lerna/output" "3.13.0" - "@lerna/profiler" "3.20.0" - "@lerna/run-topologically" "3.18.5" - "@lerna/timer" "3.13.0" - "@lerna/validation-error" "3.13.0" - p-map "^2.1.0" - -"@lerna/symlink-binary@3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz#8f8031b309863814883d3f009877f82e38aef45a" - integrity sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ== - dependencies: - "@lerna/create-symlink" "3.16.2" - "@lerna/package" "3.16.0" - fs-extra "^8.1.0" - p-map "^2.1.0" - -"@lerna/symlink-dependencies@3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz#48d6360e985865a0e56cd8b51b308a526308784a" - integrity sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q== - dependencies: - "@lerna/create-symlink" "3.16.2" - "@lerna/resolve-symlink" "3.16.0" - "@lerna/symlink-binary" "3.17.0" - fs-extra "^8.1.0" - p-finally "^1.0.0" - p-map "^2.1.0" - p-map-series "^1.0.0" - -"@lerna/timer@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-3.13.0.tgz#bcd0904551db16e08364d6c18e5e2160fc870781" - integrity sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw== - -"@lerna/validation-error@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.13.0.tgz#c86b8f07c5ab9539f775bd8a54976e926f3759c3" - integrity sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA== - dependencies: - npmlog "^4.1.2" - -"@lerna/version@3.22.1": - version "3.22.1" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.22.1.tgz#9805a9247a47ee62d6b81bd9fa5fb728b24b59e2" - integrity sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g== - dependencies: - "@lerna/check-working-tree" "3.16.5" - "@lerna/child-process" "3.16.5" - "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.21.0" - "@lerna/conventional-commits" "3.22.0" - "@lerna/github-client" "3.22.0" - "@lerna/gitlab-client" "3.15.0" - "@lerna/output" "3.13.0" - "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/prompt" "3.18.5" - "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.5" - "@lerna/validation-error" "3.13.0" - chalk "^2.3.1" - dedent "^0.7.0" - load-json-file "^5.3.0" - minimatch "^3.0.4" - npmlog "^4.1.2" - p-map "^2.1.0" - p-pipe "^1.2.0" - p-reduce "^1.0.0" - p-waterfall "^1.0.0" - semver "^6.2.0" - slash "^2.0.0" - temp-write "^3.4.0" - write-json-file "^3.2.0" +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@lerna/write-log-file@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.13.0.tgz#b78d9e4cfc1349a8be64d91324c4c8199e822a26" - integrity sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A== +"@jsdoc/salty@^0.2.1": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.7.tgz#98ddce519fd95d7bee605a658fabf6e8cbf7556d" + integrity sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg== dependencies: - npmlog "^4.1.2" - write-file-atomic "^2.3.0" + lodash "^4.17.21" -"@mapbox/node-pre-gyp@^1.0.1": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz#2a0b32fcb416fb3f2250fd24cb2a81421a4f5950" - integrity sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA== +"@lerna/child-process@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.4.2.tgz#a2fd013ac2150dc288270d3e0d0b850c06bec511" + integrity sha512-je+kkrfcvPcwL5Tg8JRENRqlbzjdlZXyaR88UcnCdNW0AJ1jX9IfHRys1X7AwSroU2ug8ESNC+suoBw1vX833Q== dependencies: - detect-libc "^1.0.3" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.1" - nopt "^5.0.0" - npmlog "^4.1.2" - rimraf "^3.0.2" + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/create@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.4.2.tgz#f845fad1480e46555af98bd39af29571605dddc9" + integrity sha512-1wplFbQ52K8E/unnqB0Tq39Z4e+NEoNrpovEnl6GpsTUrC6WDp8+w0Le2uCBV0hXyemxChduCkLz4/y1H1wTeg== + dependencies: + "@lerna/child-process" "7.4.2" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" + dedent "0.7.0" + execa "5.0.0" + fs-extra "^11.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + ini "^1.3.8" + init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + js-yaml "4.1.0" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.5" + npmlog "^6.0.2" + nx ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" + p-reduce "^2.1.0" + pacote "^15.2.0" + pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" semver "^7.3.4" - tar "^6.1.0" + signal-exit "3.0.7" + slash "^3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + upath "2.0.1" + uuid "^9.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" "@mdn/browser-compat-data@^3.2.4": version "3.3.14" resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz#b72a37c654e598f9ae6f8335faaee182bebc6b28" integrity sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA== -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" +"@noble/hashes@^1.2.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2492,11 +2136,6 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - "@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" @@ -2505,82 +2144,180 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" - integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== dependencies: - "@gar/promisify" "^1.0.1" + "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" - integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== dependencies: - "@npmcli/promise-spawn" "^1.3.2" - lru-cache "^6.0.0" - mkdirp "^1.0.4" - npm-pick-manifest "^6.1.1" + semver "^7.3.5" + +"@npmcli/git@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" + which "^3.0.0" -"@npmcli/installed-package-contents@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/node-gyp@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz#3cdc1f30e9736dbc417373ed803b42b1a0a29ede" - integrity sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg== +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" - integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== dependencies: - infer-owner "^1.0.4" + which "^3.0.0" -"@npmcli/run-script@^1.8.2": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" - integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== - dependencies: - "@npmcli/node-gyp" "^1.0.2" - "@npmcli/promise-spawn" "^1.3.2" - node-gyp "^7.1.0" - read-package-json-fast "^2.0.1" +"@npmcli/run-script@6.0.2", "@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nrwl/devkit@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.10.0.tgz#ac8c5b4db00f12c4b817c937be2f7c4eb8f2593c" + integrity sha512-fRloARtsDQoQgQ7HKEy0RJiusg/HSygnmg4gX/0n/Z+SUS+4KoZzvHjXc6T5ZdEiSjvLypJ+HBM8dQzIcVACPQ== + dependencies: + "@nx/devkit" "16.10.0" + +"@nrwl/tao@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.10.0.tgz#94642a0380709b8e387e1e33705a5a9624933375" + integrity sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q== + dependencies: + nx "16.10.0" + tslib "^2.3.0" + +"@nx/devkit@16.10.0", "@nx/devkit@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.10.0.tgz#7e466be2dee2dcb1ccaf286786ca2a0a639aa007" + integrity sha512-IvKQqRJFDDiaj33SPfGd3ckNHhHi6ceEoqCbAP4UuMXOPPVOX6H0KVk+9tknkPb48B7jWIw6/AgOeWkBxPRO5w== + dependencies: + "@nrwl/devkit" "16.10.0" + ejs "^3.1.7" + enquirer "~2.3.6" + ignore "^5.0.4" + semver "7.5.3" + tmp "~0.2.1" + tslib "^2.3.0" + +"@nx/nx-darwin-arm64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz#0c73010cac7a502549483b12bad347da9014e6f1" + integrity sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ== + +"@nx/nx-darwin-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz#2ccf270418d552fd0a8e0d6089aee4944315adaa" + integrity sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg== + +"@nx/nx-freebsd-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.10.0.tgz#c3ee6914256e69493fed9355b0d6661d0e86da44" + integrity sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw== + +"@nx/nx-linux-arm-gnueabihf@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.10.0.tgz#a961eccbb38acb2da7fc125b29d1fead0b39152f" + integrity sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA== + +"@nx/nx-linux-arm64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.10.0.tgz#795f20072549d03822b5c4639ef438e473dbb541" + integrity sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g== + +"@nx/nx-linux-arm64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.10.0.tgz#f2428ee6dbe2b2c326e8973f76c97666def33607" + integrity sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ== + +"@nx/nx-linux-x64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.10.0.tgz#d36c2bcf94d49eaa24e3880ddaf6f1f617de539b" + integrity sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA== + +"@nx/nx-linux-x64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.10.0.tgz#78bd2ab97a583b3d4ea3387b67fd7b136907493c" + integrity sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q== + +"@nx/nx-win32-arm64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.10.0.tgz#ef20ec8d0c83d66e73e20df12d2c788b8f866396" + integrity sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA== + +"@nx/nx-win32-x64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.10.0.tgz#7410a51d0f8be631eec9552f01b2e5946285927c" + integrity sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA== + +"@oclif/command@^1.8.0", "@oclif/command@^1.8.15": + version "1.8.36" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.36.tgz#9739b9c268580d064a50887c4597d1b4e86ca8b5" + integrity sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ== + dependencies: + "@oclif/config" "^1.18.2" + "@oclif/errors" "^1.3.6" + "@oclif/help" "^1.0.1" + "@oclif/parser" "^3.8.17" + debug "^4.1.1" + semver "^7.5.4" -"@oclif/command@^1.5.20", "@oclif/command@^1.6.0", "@oclif/command@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.0.tgz#c1a499b10d26e9d1a611190a81005589accbb339" - integrity sha512-5vwpq6kbvwkQwKqAoOU3L72GZ3Ta8RRrewKj9OJRolx28KLJJ8Dg9Rf7obRwt5jQA9bkYd8gqzMTrI7H3xLfaw== +"@oclif/config@1.18.16": + version "1.18.16" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.16.tgz#3235d260ab1eb8388ebb6255bca3dd956249d796" + integrity sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA== dependencies: - "@oclif/config" "^1.15.1" - "@oclif/errors" "^1.3.3" - "@oclif/parser" "^3.8.3" - "@oclif/plugin-help" "^3" - debug "^4.1.1" - semver "^7.3.2" + "@oclif/errors" "^1.3.6" + "@oclif/parser" "^3.8.16" + debug "^4.3.4" + globby "^11.1.0" + is-wsl "^2.1.1" + tslib "^2.6.1" -"@oclif/config@^1.15.1", "@oclif/config@^1.17.0": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.17.0.tgz#ba8639118633102a7e481760c50054623d09fcab" - integrity sha512-Lmfuf6ubjQ4ifC/9bz1fSCHc6F6E653oyaRXxg+lgT4+bYf9bk+nqrUpAbrXyABkCqgIBiFr3J4zR/kiFdE1PA== +"@oclif/config@1.18.2": + version "1.18.2" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.2.tgz#5bfe74a9ba6a8ca3dceb314a81bd9ce2e15ebbfe" + integrity sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA== dependencies: "@oclif/errors" "^1.3.3" "@oclif/parser" "^3.8.0" @@ -2589,6 +2326,18 @@ is-wsl "^2.1.1" tslib "^2.0.0" +"@oclif/config@^1.17.0", "@oclif/config@^1.18.2": + version "1.18.17" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.17.tgz#00aa4049da27edca8f06fc106832d9f0f38786a5" + integrity sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg== + dependencies: + "@oclif/errors" "^1.3.6" + "@oclif/parser" "^3.8.17" + debug "^4.3.4" + globby "^11.1.0" + is-wsl "^2.1.1" + tslib "^2.6.1" + "@oclif/dev-cli@1.26.0": version "1.26.0" resolved "https://registry.yarnpkg.com/@oclif/dev-cli/-/dev-cli-1.26.0.tgz#e3ec294b362c010ffc8948003d3770955c7951fd" @@ -2608,7 +2357,7 @@ qqjs "^0.3.10" tslib "^2.0.3" -"@oclif/errors@^1.2.1", "@oclif/errors@^1.2.2", "@oclif/errors@^1.3.3": +"@oclif/errors@1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.5.tgz#a1e9694dbeccab10fe2fe15acb7113991bed636c" integrity sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ== @@ -2619,153 +2368,184 @@ strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +"@oclif/errors@1.3.6", "@oclif/errors@^1.3.3", "@oclif/errors@^1.3.5", "@oclif/errors@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.6.tgz#e8fe1fc12346cb77c4f274e26891964f5175f75d" + integrity sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ== + dependencies: + clean-stack "^3.0.0" + fs-extra "^8.1" + indent-string "^4.0.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +"@oclif/help@^1.0.1": + version "1.0.15" + resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.15.tgz#5e36e576b8132a4906d2662204ad9de7ece87e8f" + integrity sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g== + dependencies: + "@oclif/config" "1.18.16" + "@oclif/errors" "1.3.6" + chalk "^4.1.2" + indent-string "^4.0.0" + lodash "^4.17.21" + string-width "^4.2.0" + strip-ansi "^6.0.0" + widest-line "^3.1.0" + wrap-ansi "^6.2.0" + "@oclif/linewrap@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== -"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.3": - version "3.8.5" - resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.5.tgz#c5161766a1efca7343e1f25d769efbefe09f639b" - integrity sha512-yojzeEfmSxjjkAvMRj0KzspXlMjCfBzNRPkWw8ZwOSoNWoJn+OCS/m/S+yfV6BvAM4u2lTzX9Y5rCbrFIgkJLg== +"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.16", "@oclif/parser@^3.8.17": + version "3.8.17" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.17.tgz#e1ce0f29b22762d752d9da1c7abd57ad81c56188" + integrity sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A== dependencies: - "@oclif/errors" "^1.2.2" + "@oclif/errors" "^1.3.6" "@oclif/linewrap" "^1.0.0" - chalk "^2.4.2" - tslib "^1.9.3" - -"@oclif/plugin-help@^3", "@oclif/plugin-help@^3.2.0": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-3.2.3.tgz#cd24010e7eb326782843d3aa6d6b5a4affebb2c3" - integrity sha512-l2Pd0lbOMq4u/7xsl9hqISFqyR9gWEz/8+05xmrXFr67jXyS6EUCQB+mFBa0wepltrmJu0sAFg9AvA2mLaMMqQ== - dependencies: - "@oclif/command" "^1.5.20" - "@oclif/config" "^1.15.1" - "@oclif/errors" "^1.2.2" chalk "^4.1.0" + tslib "^2.6.2" + +"@oclif/plugin-help@^3.2.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-3.3.1.tgz#36adb4e0173f741df409bb4b69036d24a53bfb24" + integrity sha512-QuSiseNRJygaqAdABYFWn/H1CwIZCp9zp/PLid6yXvy6VcQV7OenEFF5XuYaCvSARe2Tg9r8Jqls5+fw1A9CbQ== + dependencies: + "@oclif/command" "^1.8.15" + "@oclif/config" "1.18.2" + "@oclif/errors" "1.3.5" + "@oclif/help" "^1.0.1" + chalk "^4.1.2" indent-string "^4.0.0" - lodash.template "^4.4.0" + lodash "^4.17.21" string-width "^4.2.0" strip-ansi "^6.0.0" widest-line "^3.1.0" - wrap-ansi "^4.0.0" + wrap-ansi "^6.2.0" -"@oclif/screen@^1.0.3": +"@oclif/screen@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== -"@octokit/auth-token@^2.4.0": - version "2.4.5" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" - integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== - dependencies: - "@octokit/types" "^6.0.3" +"@octokit/auth-token@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== + +"@octokit/core@^4.2.1": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" + integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" -"@octokit/endpoint@^6.0.1": - version "6.0.12" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" - integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== +"@octokit/endpoint@^7.0.0": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== dependencies: - "@octokit/types" "^6.0.3" + "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^10.1.5": - version "10.1.5" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-10.1.5.tgz#deafbec805896ae963d7d3846e70b18003cafda1" - integrity sha512-OoShNYzhAU8p8JbGHe1rRs1GIErRtmN2230AQCJAjL5lc0AUU5OhppVe6693HIZ2eCBLUhoLPhnnnmQ5ASH7Wg== +"@octokit/graphql@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^18.0.0": + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== -"@octokit/plugin-enterprise-rest@^6.0.1": +"@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" - integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q== +"@octokit/plugin-paginate-rest@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== dependencies: - "@octokit/types" "^2.0.1" + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" -"@octokit/plugin-request-log@^1.0.0": +"@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" - integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ== - dependencies: - "@octokit/types" "^2.0.1" - deprecation "^2.3.1" - -"@octokit/request-error@^1.0.2": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" - integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA== +"@octokit/plugin-rest-endpoint-methods@^7.1.2": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz#37a84b171a6cb6658816c82c4082ac3512021797" + integrity sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== dependencies: - "@octokit/types" "^2.0.0" - deprecation "^2.0.0" - once "^1.4.0" + "@octokit/types" "^10.0.0" -"@octokit/request-error@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" - integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== +"@octokit/request-error@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== dependencies: - "@octokit/types" "^6.0.3" + "@octokit/types" "^9.0.0" deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.2.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.1.tgz#f97aff075c37ab1d427c49082fefeef0dba2d8ce" - integrity sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ== +"@octokit/request@^6.0.0": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb" + integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== dependencies: - "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.1.0" - "@octokit/types" "^6.16.1" + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" - node-fetch "^2.6.1" + node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@^16.28.4": - version "16.43.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" - integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== - dependencies: - "@octokit/auth-token" "^2.4.0" - "@octokit/plugin-paginate-rest" "^1.1.1" - "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "2.4.0" - "@octokit/request" "^5.2.0" - "@octokit/request-error" "^1.0.2" - atob-lite "^2.0.0" - before-after-hook "^2.0.0" - btoa-lite "^1.0.0" - deprecation "^2.0.0" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.0" - once "^1.4.0" - universal-user-agent "^4.0.0" +"@octokit/rest@19.0.11": + version "19.0.11" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.11.tgz#2ae01634fed4bd1fca5b642767205ed3fd36177c" + integrity sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw== + dependencies: + "@octokit/core" "^4.2.1" + "@octokit/plugin-paginate-rest" "^6.1.2" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^7.1.2" + +"@octokit/tsconfig@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== -"@octokit/types@^2.0.0", "@octokit/types@^2.0.1": - version "2.16.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2" - integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q== +"@octokit/types@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== dependencies: - "@types/node" ">= 8" + "@octokit/openapi-types" "^18.0.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1": - version "6.27.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.27.2.tgz#b6f88d002aa06104f46ccaec0aaa8a5de1bf262c" - integrity sha512-AgajmAJh7LhStgaEaNoY1N7znst2q07CKZVdnVB/V4tmitMbk+qijmD0IkkSKulXE5RVLbJjQikJF9+XLqhsVA== +"@octokit/types@^9.0.0", "@octokit/types@^9.2.3": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== dependencies: - "@octokit/openapi-types" "^10.1.5" + "@octokit/openapi-types" "^18.0.0" "@opencensus/core@0.0.9": version "0.0.9" @@ -2797,42 +2577,60 @@ "@opencensus/core" "^0.0.8" uuid "^3.2.1" -"@phc/format@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@phc/format/-/format-1.0.0.tgz#b5627003b3216dc4362125b13f48a4daa76680e4" - integrity sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ== - -"@pm2/agent-node@^1.1.10": - version "1.1.10" - resolved "https://registry.yarnpkg.com/@pm2/agent-node/-/agent-node-1.1.10.tgz#29fafc9d1b75288dec87b6af1216ddfab8ea9b06" - integrity sha512-xRcrk7OEwhS3d/227/kKGvxgmbIi6Yyp27FzGlFNermEKhgddmFaRnmd7GRLIsBM/KB28NrwflBZulzk/mma6g== +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== dependencies: - debug "^3.1.0" - eventemitter2 "^5.0.1" - proxy-agent "^3.0.3" - ws "^6.0.0" + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" -"@pm2/io@4.3.5": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@pm2/io/-/io-4.3.5.tgz#57025ab821fd09d2afe6d0ab981f8a39ccec8860" - integrity sha512-CY/a6Nw72vrlp/FPx38l4jfEHp4gNEbo8i+WlSJ2cnWO6VE6CKmnC1zb4yQLvdP8f3EuzzoOBZVq6aGN20M82Q== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pm2/io@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@pm2/io/-/io-5.0.2.tgz#5e4177281280082d7c490bb776fad7f8448c6bca" + integrity sha512-XAvrNoQPKOyO/jJyCu8jPhLzlyp35MEf7w/carHXmWKddPzeNOFSEpSEqMzPDawsvpxbE+i918cNN+MwgVsStA== dependencies: "@opencensus/core" "0.0.9" "@opencensus/propagation-b3" "0.0.8" - "@pm2/agent-node" "^1.1.10" async "~2.6.1" - debug "4.1.1" + debug "~4.3.1" eventemitter2 "^6.3.1" require-in-the-middle "^5.0.0" - semver "6.3.0" + semver "~7.5.4" shimmer "^1.2.0" signal-exit "^3.0.3" tslib "1.9.3" +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" @@ -2847,12 +2645,12 @@ "@protobufjs/eventemitter@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" "@protobufjs/inquire" "^1.1.0" @@ -2860,27 +2658,27 @@ "@protobufjs/float@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== "@rollup/plugin-babel@5.3.0": version "5.3.0" @@ -2942,9 +2740,9 @@ picomatch "^2.2.2" "@rollup/pluginutils@^4.1.0": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec" - integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== dependencies: estree-walker "^2.0.1" picomatch "^2.2.2" @@ -2956,60 +2754,125 @@ dependencies: any-observable "^0.3.0" -"@sideway/address@^4.1.0": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.2.tgz#811b84333a335739d3969cfc434736268170cad1" - integrity sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA== +"@scure/base@^1.1.1": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + +"@sigstore/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + tuf-js "^1.1.7" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== "@sindresorhus/is@^4.0.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.2.0.tgz#667bfc6186ae7c9e0b45a08960c551437176e1ca" - integrity sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw== + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": +"@sinonjs/fake-timers@^11.2.2": + version "11.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" + integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@sinonjs/fake-timers@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/samsam@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" - integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== +"@sinonjs/samsam@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" + integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== dependencies: - "@sinonjs/commons" "^1.6.0" + "@sinonjs/commons" "^2.0.0" lodash.get "^4.4.2" type-detect "^4.0.8" -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@sinonjs/text-encoding@^0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -3025,17 +2888,37 @@ dependencies: defer-to-connect "^2.0.0" +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/async@3.2.7": - version "3.2.7" - resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.7.tgz#f784478440d313941e7b12c2e4db53b0ed55637b" - integrity sha512-a+MBBfOTs3ShFMlbH9qsRVFkjIUunEtxrBT0gxRx1cntjKRg2WApuGmNYzHkwKaIhMi3SMbKktaD/rLObQMwIw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" -"@types/babel__core@7.1.16", "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7": +"@types/babel__core@7.1.16": version "7.1.16" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== @@ -3046,34 +2929,45 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" -"@types/better-sqlite3@5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-5.4.3.tgz#4f1142c02db111627d9c5792f8aa349fcf46d100" - integrity sha512-d4T8Htgz3sQL3u5oVwkWipZLBYUooKEA4fhU9Sp4F6VDIhifQo1NR/IDtnAIID0Y9IXV3TQnNhv6S+m8TnkEdg== +"@types/better-sqlite3@7.6.9": + version "7.6.9" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.9.tgz#4bff3eb7c5eaaae26f8099606c69279146561c50" + integrity sha512-FvktcujPDj9XKMJQWFcl2vVl7OdRIqsSRX9b0acWwTmwLK9CF2eqo/FRcmMLNpugKoX/avA6pb7TorDLmpgTnQ== dependencies: - "@types/integer" "*" + "@types/node" "*" "@types/bip32@2.0.0": version "2.0.0" @@ -3082,34 +2976,22 @@ dependencies: bip32 "*" -"@types/bip39@2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/bip39/-/bip39-2.4.2.tgz#f5d6617212be496bb998d3969f657f77a10c5287" - integrity sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg== - dependencies: - "@types/node" "*" - -"@types/buffer-xor@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/buffer-xor/-/buffer-xor-2.0.0.tgz#15738051e0720b68120cd2cc3f204aa4dc16bab1" - integrity sha512-NEJkIKUE/xboduuIAJmdtUvbXgUOfMkjOo6lWsiBVUIWBC5fVWGT+50yEw9W1Xp4ga76khg57pHELXw5Xm3Y+A== +"@types/buffer-xor@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/buffer-xor/-/buffer-xor-2.0.2.tgz#d8c463583b8fbb322ea824562dc78a0c3cea2ca6" + integrity sha512-OqdCua7QCTupPnJgmyGJUpxWgbuOi0IMIVslXTSePS2o+qDrDB6f2Pg44zRyqhUA5GbFAf39U8z0+mH4WG0fLQ== dependencies: "@types/node" "*" "@types/cacheable-request@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" - integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: "@types/http-cache-semantics" "*" - "@types/keyv" "*" + "@types/keyv" "^3.1.4" "@types/node" "*" - "@types/responselike" "*" - -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== + "@types/responselike" "^1.0.0" "@types/ci-info@*": version "3.1.0" @@ -3140,26 +3022,28 @@ dependencies: depcheck "*" +"@types/duplexify@*": + version "3.6.4" + resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.4.tgz#aa7e916c33fcc05be8769546fd0441d9b368613e" + integrity sha512-2eahVPsd+dy3CL6FugAzJcxoraWhUghZGEQJns1kTKfCXWKJ5iG/VkaB05wRVrDKHfOFKqb0X0kXh91eE99RZg== + dependencies: + "@types/node" "*" + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/estree@*": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@^0.0.48": - version "0.0.48" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" - integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== - "@types/fast-levenshtein@0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@types/fast-levenshtein/-/fast-levenshtein-0.0.2.tgz#9f618cff4469da8df46c9ee91b1c95b9af1d8f6a" @@ -3172,15 +3056,23 @@ dependencies: "@types/node" "*" -"@types/functional-red-black-tree@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#5e776b74ff706b307e861a9fb3cb5ce98bc2d0e5" - integrity sha512-gUXkc6hiRJ2yPyiidbDbtU5YDt0c8JjYjq671QPYmJg2kiYS53/814Hg2SY4wqL/hfCzfa3NZzeh2e30YhALww== +"@types/functional-red-black-tree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/functional-red-black-tree/-/functional-red-black-tree-1.0.6.tgz#29c8c3f2bb3ea931eec9615b49cf9913f7732f8b" + integrity sha512-h7W9Mjozzx+HA9L7CSKAm3dSCa9vBea2U5kWfDuXedAjOb/Sy7VXWL4qUi7H03IJvwHEJ/vf2P2agw9XNTWZxg== -"@types/glob@*", "@types/glob@^7.1.1": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== +"@types/glob@*": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" @@ -3195,9 +3087,9 @@ form-data "^2.5.0" "@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" @@ -3206,30 +3098,20 @@ resolved "https://registry.yarnpkg.com/@types/hapi__boom/-/hapi__boom-7.4.1.tgz#06439d7637245dcbe6dd6548d2a91f2c1243d80b" integrity sha512-x/ZK824GomII7Yoei/nMoB46NQcSfGe0iVpZK3uUivxIAfUUSzRvu8RQO7ZkKapIgzgshHZc+GR+z/BQ8l2VLg== -"@types/hapi__joi@17.1.7": - version "17.1.7" - resolved "https://registry.yarnpkg.com/@types/hapi__joi/-/hapi__joi-17.1.7.tgz#a479bc593823fb7bd5600fea37917c8e5c71629c" - integrity sha512-byC9slpuqyDeEKegl/ViT8PCQRSp0CYkhLzz0cPxqxV6QC53Ht1cr2jG5iwOvtt/RxylUbTpXNqpgbf9Qu8QFw== - "@types/hapi__sntp@3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@types/hapi__sntp/-/hapi__sntp-3.1.2.tgz#f2a1aa2756455a649e8816dd57f4f7431fcc533b" integrity sha512-qMHxmxMBu39jHVUqii4qJHFILuXwTrRM5TX1GCLUbYOsH29xiJRLfQyWyEk6n1h1fBF98MOsjUIKtQBrFT5pCg== -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - -"@types/integer@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/integer/-/integer-4.0.1.tgz#022f2c77a899e383e6d3dd374142416c22a5b9df" - integrity sha512-QQojPymFcV1hrvWXA1h0pP9RmFBFNuWikZcUEjjVsS19IyKO+jqOX24lp2ZHF4A21EmkosJhJDX7CLG67F2s7A== +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== -"@types/ip@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/ip/-/ip-1.1.0.tgz#aec4f5bfd49e4a4c53b590d88c36eb078827a7c0" - integrity sha512-dwNe8gOoF70VdL6WJBwVHtQmAX4RMd62M+mAB9HQFjG1/qiCLM/meRy95Pd14FYBbEDwCq7jgJs89cHpLBu4HQ== +"@types/ip@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/ip/-/ip-1.1.3.tgz#5d8634b3514a51768adda5e17c91a11cdb2e5247" + integrity sha512-64waoJgkXFTYnCYDUWgSATJ/dXEBanVkaP5d4Sbk7P6U7cTTMhxVyROTckc6JKdwCrgnAjZMn0k3177aQxtDEA== dependencies: "@types/node" "*" @@ -3241,14 +3123,14 @@ "@types/ci-info" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" @@ -3261,9 +3143,9 @@ "@types/istanbul-lib-report" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" @@ -3275,23 +3157,28 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/js-yaml@3.12.7": - version "3.12.7" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.7.tgz#330c5d97a3500e9c903210d6e49f02964af04a0e" - integrity sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ== - "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/keyv@*": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" - integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: "@types/node" "*" +"@types/linkify-it@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8" + integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw== + "@types/listr@0.14.4": version "0.14.4" resolved "https://registry.yarnpkg.com/@types/listr/-/listr-0.14.4.tgz#6ba2a4206615cf80d79d10f9ba9701c303cd57b6" @@ -3300,56 +3187,52 @@ "@types/node" "*" rxjs "^6.5.1" -"@types/lodash.get@4.4.6": - version "4.4.6" - resolved "https://registry.yarnpkg.com/@types/lodash.get/-/lodash.get-4.4.6.tgz#0c7ac56243dae0f9f09ab6f75b29471e2e777240" - integrity sha512-E6zzjR3GtNig8UJG/yodBeJeIOtgPkMgsLjDU3CbgCAPC++vJ0eCMnJhVpRZb/ENqEFlov1+3K9TKtY4UdWKtQ== - dependencies: - "@types/lodash" "*" - -"@types/lodash.set@4.3.6": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/lodash.set/-/lodash.set-4.3.6.tgz#33e635c2323f855359225df6a5c8c6f1f1908264" - integrity sha512-ZeGDDlnRYTvS31Laij0RsSaguIUSBTYIlJFKL3vm3T2OAZAQj2YpSvVWJc0WiG4jqg9fGX6PAPGvDqBcHfSgFg== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.172" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a" - integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw== - "@types/log-process-errors@4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@types/log-process-errors/-/log-process-errors-4.1.0.tgz#d8fdf5312660fe39f425f4d4bc6a9cfe2605ed6e" integrity sha512-EZxSJpgUfiKgJKUuNOqHnobVODwjUfI9cOBUMyjt5tXkt5ZiZ3NB21DLPOVyAyqiW4dmmusVfgNE2+kMvdmFFA== -"@types/long@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" - integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== +"@types/markdown-it@^12.2.3": + version "12.2.3" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" + integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== + dependencies: + "@types/linkify-it" "*" + "@types/mdurl" "*" + +"@types/mdurl@*": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.5.tgz#3e0d2db570e9fb6ccb2dc8fde0be1d79ac810d39" + integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== + +"@types/minimatch@*", "@types/minimatch@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== -"@types/minimatch@*", "@types/minimatch@^3.0.3": +"@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== -"@types/node-forge@0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-0.10.4.tgz#f30025cc2da0177393b9deaefbf3b9edd55b807b" - integrity sha512-RpP7JCxlPA32n8FE0kjOpCsCrsX6VjiD0fjOCo4NwIn8IdcicHi4B2e+votWuOpOmwzUjMwRLqVIF95epGd5nA== +"@types/node-forge@1.3.11": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>= 8": - version "16.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708" - integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== +"@types/node@*", "@types/node@>=13.7.0": + version "20.11.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9" + integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== + dependencies: + undici-types "~5.26.4" "@types/node@10.12.18": version "10.12.18" @@ -3366,84 +3249,50 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.5.tgz#59738bf30b31aea1faa2df7f4a5f55613750cf00" integrity sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw== -"@types/node@^13.7.0": - version "13.13.52" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.52.tgz#03c13be70b9031baaed79481c0c0cfb0045e53f7" - integrity sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ== - "@types/node@^8.10.50": version "8.10.66" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/object-path@^0.11.0": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@types/object-path/-/object-path-0.11.1.tgz#eea5b357518597fc9c0a067ea3147f599fc1514f" - integrity sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg== + version "0.11.4" + resolved "https://registry.yarnpkg.com/@types/object-path/-/object-path-0.11.4.tgz#a14529227500faf7891d003b2c7f5772c4a5dfdc" + integrity sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/pino-pretty@*": - version "4.7.1" - resolved "https://registry.yarnpkg.com/@types/pino-pretty/-/pino-pretty-4.7.1.tgz#2ce3f56f3cf4f9632374419d616ae2e6c933b935" - integrity sha512-l1ntNXdpVWsnPYUk5HyO5Lxfr38zLCgxVfEn/9Zhhm+nGF04/BiIou/m8XPwvoVZLV+livUo79VdHXMJPfUYxA== - dependencies: - "@types/pino" "*" - -"@types/pino-std-serializers@*": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz#f8bd52a209c8b3c97d1533b1ba27f57c816382bf" - integrity sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ== - dependencies: - "@types/node" "*" - -"@types/pino@*", "@types/pino@6.3.11": - version "6.3.11" - resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.11.tgz#83652799e76b3ad692aaf68f6fbf994e83af5db2" - integrity sha512-S7+fLONqSpHeW9d7TApUqO6VN47KYgOXhCNKwGBVLHObq8HhaAYlVqUNdfnvoXjCMiwE5xcPm/5R2ZUh8bgaXQ== - dependencies: - "@types/node" "*" - "@types/pino-pretty" "*" - "@types/pino-std-serializers" "*" - sonic-boom "^2.1.0" + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== -"@types/prettier@2.3.2", "@types/prettier@^2.0.0": +"@types/prettier@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== -"@types/pump@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/pump/-/pump-1.1.1.tgz#edb3475e2bad0f4552bdaa91c6c43b82e08ff15e" - integrity sha512-wpRerjHDxFBQ4r8XNv3xHJZeuqrBBoeQ/fhgkooV2F7KsPIYRROb/+f9ODgZfOEyO5/w2ej4YQdpPPXipT8DAA== - dependencies: - "@types/node" "*" +"@types/prettier@^2.0.0": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== -"@types/readable-stream@2.3.11": - version "2.3.11" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.11.tgz#942bc4574a1d7ca4368cb9cb4352e3d2b4b51dea" - integrity sha512-0z+/apYJwKFz/RHp6mOMxz/y7xOvWPYPevuCEyAY3gXsjtaac02E26RvxA+I96rfvmVH/dEMGXNvyJfViR1FSQ== +"@types/pump@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/pump/-/pump-1.1.3.tgz#127eeed2f416f89ef60697003486ae27c7f0b49e" + integrity sha512-ZyooTTivmOwPfOwLVaszkF8Zq6mvavgjuHYitZhrIjfQAJDH+kIP3N+MzpG1zDAslsHvVz6Q8ECfivix3qLJaQ== dependencies: "@types/node" "*" - safe-buffer "*" -"@types/request@^2.48.2": - version "2.48.7" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.7.tgz#a962d11a26e0d71d9a9913d96bb806dc4d4c2f19" - integrity sha512-GWP9AZW7foLd4YQxyFZDBepl0lPsWLMEXDZUjQ/c1gqVPDPECrRZyEzuhJdnPWioFCq3Tv0qoGpMD6U+ygd4ZA== +"@types/pumpify@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@types/pumpify/-/pumpify-1.4.4.tgz#2246750e9380a1f885bf43c58cb31ddbb280d4a7" + integrity sha512-+cWbQUecD04MQYkjNBhPmcUIP368aloYmqm+ImdMKA8rMpxRNAhZAD6gIj+sAVTF1DliqrT/qUp6aGNi/9U3tw== dependencies: - "@types/caseless" "*" + "@types/duplexify" "*" "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" "@types/resolve@1.17.1": version "1.17.1" @@ -3452,10 +3301,10 @@ dependencies: "@types/node" "*" -"@types/responselike@*", "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== dependencies: "@types/node" "*" @@ -3467,20 +3316,20 @@ "@types/glob" "*" "@types/node" "*" -"@types/semver@6.2.3": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" - integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== +"@types/semaphore@1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/semaphore/-/semaphore-1.1.4.tgz#fe9a0deb4c680ec23e8ce6283b3bb94ab7744c64" + integrity sha512-W+KOVSGHKo5yoPXG69RFIKOdmvAcrAo2qnRrcDv80kIcxDnEUQ+c3IVKq0Jkp+BhhYfrbthPY9cXWFL0L9uzuw== -"@types/semver@^7.3.4": - version "7.3.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.8.tgz#508a27995498d7586dcecd77c25e289bfaf90c59" - integrity sha512-D/2EJvAlCEtYFEYmmlGwbGXuK886HzyCc3nZX/tkFTQdEU8jZDAgiv08P162yB17y4ZXZoq7yFAnW4GDBb9Now== +"@types/semver@7.5.6", "@types/semver@^7.3.4": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== -"@types/split2@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@types/split2/-/split2-2.1.6.tgz#b095c9e064853824b22c67993d99b066777402b1" - integrity sha512-ddaFSOMuy2Rp97l6q/LEteQygvTQJuEZ+SRhxFKR0uXGsdbFDqX/QF2xoGcOqLQ8XV91v01SnAv2vpgihNgW/Q== +"@types/split2@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/split2/-/split2-3.2.1.tgz#97c42b560a1b41064d46cd728cf1267d5755ee34" + integrity sha512-7uz3yU+LooBq4yNOzlZD9PU9/1Eu0rTD1MjQ6apOVEoHsPrMUrFw7W8XrvWtesm2vK67SBK9AyJcOXtMpl9bgQ== dependencies: "@types/node" "*" @@ -3490,19 +3339,19 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/tough-cookie@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.1.tgz#8f80dd965ad81f3e1bc26d6f5c727e132721ff40" - integrity sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/ua-parser-js@^0.7.35": - version "0.7.36" - resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz#9bd0b47f26b5a3151be21ba4ce9f5fa457c5f190" - integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ== + version "0.7.39" + resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz#832c58e460c9435e4e34bb866e85e9146e12cdbb" + integrity sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg== "@types/uuid@8.3.1": version "8.3.1" @@ -3516,7 +3365,12 @@ dependencies: "@types/node" "*" -"@types/yargs-parser@*", "@types/yargs-parser@20.2.1": +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs-parser@20.2.1": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== @@ -3529,12 +3383,19 @@ "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" @@ -3559,14 +3420,14 @@ eslint-utils "^2.0.0" "@typescript-eslint/experimental-utils@^4.0.1": - version "4.31.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.1.tgz#0c900f832f270b88e13e51753647b02d08371ce5" - integrity sha512-NtoPsqmcSsWty0mcL5nTZXMf7Ei0Xr2MT8jWjXMVgRK0/1qeQ2jZzLFUh4QtyJ4+/lPUyMw5cSfeeME+Zrtp9Q== + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.31.1" - "@typescript-eslint/types" "4.31.1" - "@typescript-eslint/typescript-estree" "4.31.1" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -3581,28 +3442,28 @@ "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/scope-manager@4.31.1": - version "4.31.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.1.tgz#0c21e8501f608d6a25c842fcf59541ef4f1ab561" - integrity sha512-N1Uhn6SqNtU2XpFSkD4oA+F0PfKdWHyr4bTX0xTj8NRx1314gBDRL1LUuZd5+L3oP+wo6hCbZpaa1in6SwMcVQ== +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== dependencies: - "@typescript-eslint/types" "4.31.1" - "@typescript-eslint/visitor-keys" "4.31.1" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" "@typescript-eslint/types@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/types@4.31.1": - version "4.31.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.1.tgz#5f255b695627a13401d2fdba5f7138bc79450d66" - integrity sha512-kixltt51ZJGKENNW88IY5MYqTBA8FR0Md8QdGbJD2pKZ+D5IvxjTYDNtJPDxFBiXmka2aJsITdB1BtO1fsgmsQ== +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== -"@typescript-eslint/types@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" - integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" @@ -3618,30 +3479,30 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.31.1": - version "4.31.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.1.tgz#4a04d5232cf1031232b7124a9c0310b577a62d17" - integrity sha512-EGHkbsUvjFrvRnusk6yFGqrqMBTue5E5ROnS5puj3laGQPasVUgwhrxfcgkdHNFECHAewpvELE1Gjv0XO3mdWg== +"@typescript-eslint/typescript-estree@4.33.0", "@typescript-eslint/typescript-estree@^4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== dependencies: - "@typescript-eslint/types" "4.31.1" - "@typescript-eslint/visitor-keys" "4.31.1" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@^4.8.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" - integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== - dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" +"@typescript-eslint/typescript-estree@^5.55.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@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" "@typescript-eslint/visitor-keys@3.10.1": @@ -3651,88 +3512,68 @@ dependencies: eslint-visitor-keys "^1.1.0" -"@typescript-eslint/visitor-keys@4.31.1": - version "4.31.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.1.tgz#f2e7a14c7f20c4ae07d7fc3c5878c4441a1da9cc" - integrity sha512-PCncP8hEqKw6SOJY+3St4LVtoZpPPn+Zlpm7KW5xnviMhdqcsBty4Lsg4J/VECpJjw1CkROaZhH4B8M1OfnXTQ== +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: - "@typescript-eslint/types" "4.31.1" + "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" - integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "4.31.2" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" -"@vue/compiler-core@3.2.11": - version "3.2.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.11.tgz#10af3777dba303ee7aae668029f131cb90391bee" - integrity sha512-bcbsLx5XyQg8WDDEGwmpX0BfEfv82wIs9fWFelpyVhNRGMaABvUTalYINyfhVT+jOqNaD4JBhJiVKd/8TmsHWg== +"@vue/compiler-core@3.4.15": + version "3.4.15" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.15.tgz#be20d1bbe19626052500b48969302cb6f396d36e" + integrity sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw== dependencies: - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" - "@vue/shared" "3.2.11" + "@babel/parser" "^7.23.6" + "@vue/shared" "3.4.15" + entities "^4.5.0" estree-walker "^2.0.2" - source-map "^0.6.1" - -"@vue/compiler-dom@3.2.11": - version "3.2.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.11.tgz#d066f8e1f1812b4e881593819ade0fe6d654c776" - integrity sha512-DNvhUHI/1Hn0/+ZYDYGAuDGasUm+XHKC3FE4GqkNCTO/fcLaJMRg/7eT1m1lkc7jPffUwwfh1rZru5mwzOjrNw== - dependencies: - "@vue/compiler-core" "3.2.11" - "@vue/shared" "3.2.11" - -"@vue/compiler-sfc@^3.0.5": - version "3.2.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.11.tgz#628fa12238760d9b9b339ac2e125a759224fadbf" - integrity sha512-cUIaS8mgJrQ6yucj2AupWAwBRITK3W/a8wCOn9g5fJGtOl8h4APY8vN3lzP8HIJDyEeRF3I8SfRhL+oX97kSnw== - dependencies: - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" - "@types/estree" "^0.0.48" - "@vue/compiler-core" "3.2.11" - "@vue/compiler-dom" "3.2.11" - "@vue/compiler-ssr" "3.2.11" - "@vue/ref-transform" "3.2.11" - "@vue/shared" "3.2.11" - consolidate "^0.16.0" + source-map-js "^1.0.2" + +"@vue/compiler-dom@3.4.15": + version "3.4.15" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz#753f5ed55f78d33dff04701fad4d76ff0cf81ee5" + integrity sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ== + dependencies: + "@vue/compiler-core" "3.4.15" + "@vue/shared" "3.4.15" + +"@vue/compiler-sfc@^3.3.4": + version "3.4.15" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz#4e5811e681955fcec886cebbec483f6ae463a64b" + integrity sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA== + dependencies: + "@babel/parser" "^7.23.6" + "@vue/compiler-core" "3.4.15" + "@vue/compiler-dom" "3.4.15" + "@vue/compiler-ssr" "3.4.15" + "@vue/shared" "3.4.15" estree-walker "^2.0.2" - hash-sum "^2.0.0" - lru-cache "^5.1.1" - magic-string "^0.25.7" - merge-source-map "^1.1.0" - postcss "^8.1.10" - postcss-modules "^4.0.0" - postcss-selector-parser "^6.0.4" - source-map "^0.6.1" - -"@vue/compiler-ssr@3.2.11": - version "3.2.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.11.tgz#702cef3429651645bdbe09fe5962803b5a621abb" - integrity sha512-+ptAdUlFDij+Z0VGCbRRkxQlNev5LkbZAntvkxrFjc08CTMhZmiV4Js48n2hAmuSXaKNEpmGkDGU26c/vf1+xw== - dependencies: - "@vue/compiler-dom" "3.2.11" - "@vue/shared" "3.2.11" + magic-string "^0.30.5" + postcss "^8.4.33" + source-map-js "^1.0.2" -"@vue/ref-transform@3.2.11": - version "3.2.11" - resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.11.tgz#4d282b9570d1485a73e7bf5d57cce27b4a7aa690" - integrity sha512-7rX0YsfYb7+1PeKPME1tQyUQcQgt0sIXRRnPD1Vw8Zs2KIo90YLy9CrvwalcRCxGw0ScsjBEhVjJtWIT79TElg== +"@vue/compiler-ssr@3.4.15": + version "3.4.15" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz#a910a5b89ba4f0a776e40b63d69bdae2f50616cf" + integrity sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw== dependencies: - "@babel/parser" "^7.15.0" - "@vue/compiler-core" "3.2.11" - "@vue/shared" "3.2.11" - estree-walker "^2.0.2" - magic-string "^0.25.7" + "@vue/compiler-dom" "3.4.15" + "@vue/shared" "3.4.15" -"@vue/shared@3.2.11": - version "3.2.11" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.11.tgz#01899f54949caf1ac241de397bd17069632574de" - integrity sha512-ovfXAsSsCvV9JVceWjkqC/7OF5HbgLOtCWjCIosmPGG8lxbPuavhIxRH1dTx4Dg9xLgRTNLvI3pVxG4ItQZekg== +"@vue/shared@3.4.15": + version "3.4.15" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.15.tgz#e7d2ea050c667480cb5e1a6df2ac13bcd03a8f30" + integrity sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g== "@wessberg/browserslist-generator@^1.0.47": version "1.0.47" @@ -3785,16 +3626,27 @@ resolved "https://registry.yarnpkg.com/@wessberg/ts-clone-node/-/ts-clone-node-0.3.19.tgz#823ed1fa74e4daa310226332322bfca97e264fe3" integrity sha512-BnJcU0ZwHxa5runiEkHzMZ6/ydxz+YYqBHOGQtf3eoxSZu2iWMPPaUfCum0O1/Ey5dqrrptUh+HmyMTzHPfdPA== -"@zkochan/cmd-shim@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" - integrity sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== dependencies: - is-windows "^1.0.0" - mkdirp-promise "^5.0.1" - mz "^2.5.0" + js-yaml "^3.10.0" + tslib "^2.4.0" -JSONStream@^1.0.4, JSONStream@^1.3.4: +"@zkochan/js-yaml@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== + dependencies: + argparse "^2.0.1" + +JSONStream@^1.0.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -3803,15 +3655,22 @@ JSONStream@^1.0.4, JSONStream@^1.3.4: through ">=2.2.7 <3" abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: +abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -3820,7 +3679,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -3835,17 +3694,15 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== +acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -3854,27 +3711,11 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - -agentkeepalive@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" - integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== - dependencies: - humanize-ms "^1.2.1" - -agentkeepalive@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== +agentkeepalive@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^1.1.2" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -3895,7 +3736,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@6.12.6, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@6.12.6, ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3906,9 +3747,9 @@ ajv@6.12.6, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.6.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -3923,24 +3764,24 @@ ambi@^7.3.0: editions "^2.3.0" typechecker "^7.0.0" -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: - string-width "^3.0.0" + string-width "^4.1.0" ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -3950,27 +3791,32 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -3986,20 +3832,30 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.2.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + ansicolors@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== -any-promise@^1.0.0: +any-promise@^1.0.0, any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@^2.0.0: version "2.0.0" @@ -4009,10 +3865,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@^3.0.3, anymatch@~3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -4020,49 +3876,34 @@ anymatch@^3.0.3, anymatch@~3.1.1, anymatch@~3.1.2: app-module-path@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= + integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== app-root-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" - integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== -aproba@^2.0.0: +"aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== dependencies: delegates "^1.0.0" - readable-stream "^2.0.6" + readable-stream "^3.6.0" argle@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/argle/-/argle-1.1.1.tgz#0cfe3bc032c36b2f48ba42b9c17f89f70607e994" - integrity sha1-DP47wDLDay9IukK5wX+J9wYH6ZQ= + version "1.1.2" + resolved "https://registry.yarnpkg.com/argle/-/argle-1.1.2.tgz#054e90b050ae065bf0fe716996b67d9473e6ec45" + integrity sha512-2sQZC5HeeSH9cQEwnZZhmHiKfvJkQ6ncpf8zl9Hv629aiMUsOw8jzYqOhpaMleQGzpQ7avCwrwyqSW1f4t7v0Q== dependencies: lodash.isfunction "^3.0.8" lodash.isnumber "^3.0.3" -argon2@0.28.2: - version "0.28.2" - resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.28.2.tgz#b583e4ef5b052a83bfe146752844b9fa526dba29" - integrity sha512-8oRk3kPlL0lLletENzhpbF9zoZJqvIHwTkjBseMrg1uD4gBMqhqnjJz1z3lEtwT0oqQAEkEwsEpsjaQBBRHcWw== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.1" - "@phc/format" "^1.0.0" - node-addon-api "^3.0.2" - opencollective-postinstall "^2.0.3" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -4070,20 +3911,15 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -args@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761" - integrity sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ== - dependencies: - camelcase "5.0.0" - chalk "2.4.2" - leven "2.1.0" - mri "1.1.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -4093,109 +3929,63 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-differ@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" - integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-union@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.2.tgz#5fcc373920775723cfd64d65c64bef53bf9eba6d" - integrity sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0= - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-module-types@^2.3.2, ast-module-types@^2.4.0, ast-module-types@^2.7.0, ast-module-types@^2.7.1: +ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" integrity sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw== -ast-types@0.x.x: - version "0.14.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" - integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== - dependencies: - tslib "^2.0.1" +ast-module-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-3.0.0.tgz#9a6d8a80f438b6b8fe4995699d700297f398bf81" + integrity sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ== + +ast-module-types@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-4.0.0.tgz#17e1cadd5b5b108e7295b0cf0cff21ccc226b639" + integrity sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g== astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async-listener@^0.6.0: version "0.6.10" resolved "https://registry.yarnpkg.com/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc" @@ -4204,28 +3994,28 @@ async-listener@^0.6.0: semver "^5.3.0" shimmer "^1.1.0" +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + async@~2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= - atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -4249,16 +4039,6 @@ awilix@^4.2.7: camel-case "^4.1.2" glob "^7.1.6" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - axios@^0.21.0: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -4266,6 +4046,15 @@ axios@^0.21.0: dependencies: follow-redirects "^1.14.0" +axios@^1.0.0: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" @@ -4290,22 +4079,15 @@ babel-loader@8.2.2: make-dir "^3.1.0" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" babel-plugin-jest-hoist@^26.6.2: @@ -4319,28 +4101,52 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__traverse" "^7.0.6" babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f" + integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.2.4" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.5.0" + semver "^6.3.1" + babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" - integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.14.0" + core-js-compat "^3.16.2" + +babel-plugin-polyfill-corejs3@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" + integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + core-js-compat "^3.34.0" babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d" + integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.2.4" + +babel-plugin-polyfill-regenerator@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -4374,9 +4180,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" @@ -4398,47 +4204,34 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bcrypto@5.4.0, bcrypto@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.4.0.tgz#4046f0c44a4b301eff84de593b4f86fce8d91db2" - integrity sha512-KDX2CR29o6ZoqpQndcCxFZAtYA1jDMnXU3jmCfzP44g++Cu7AHHtZN/JbrN/MXAg9SLvtQ8XISG+eVD9zH1+Jg== +bcrypto@5.5.2, bcrypto@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.5.2.tgz#7568186b31a1cfb142df50b22a87309287708e96" + integrity sha512-k3PF755oJM0+25iOVuraNedF5XneykxRwl+oBoMeQPfYee4qX8hHQhKCsNZWLthNYgi41GH2ysopd/8sDQDhEw== dependencies: bufio "~1.0.7" loady "~0.0.5" -before-after-hook@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" - integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== benchmark@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" - integrity sha1-CfPeMckWQl1JjMLuVloOvzwqVik= + integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== dependencies: lodash "^4.17.4" platform "^1.3.3" -better-sqlite3@7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-7.4.3.tgz#8e45a4164bf4b4e128d97375023550f780550997" - integrity sha512-07bKjClZg/f4KMVRkzWtoIvazVPcF1gsvVKVIXlxwleC2DxuIhnra3KCMlUT1rFeRYXXckot2a46UciF2d9KLw== +better-sqlite3@9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-9.3.0.tgz#2a8aaad65fa0210a4df5e8a0bcbc9156f6138d56" + integrity sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q== dependencies: bindings "^1.5.0" - prebuild-install "^6.0.1" - tar "^6.1.0" - -big-integer@1.6.48: - version "1.6.48" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + prebuild-install "^7.1.1" big.js@^5.2.2: version "5.2.2" @@ -4450,14 +4243,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -binary@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -4465,7 +4250,17 @@ bindings@^1.3.0, bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bip32@*, bip32@2.0.6: +bip32@*: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bip32/-/bip32-4.0.0.tgz#7fac3c05072188d2d355a4d6596b37188f06aa2f" + integrity sha512-aOGy88DDlVUhspIXJN+dVEtclhIsfAUppD43V0j40cPTld3pv/0X/MlrZSZ6jowIaQQzFwP8M6rFU2z2mVYjDQ== + dependencies: + "@noble/hashes" "^1.2.0" + "@scure/base" "^1.1.1" + typeforce "^1.11.5" + wif "^2.0.6" + +bip32@2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134" integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA== @@ -4497,7 +4292,7 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -4521,19 +4316,19 @@ boxen@4.2.0: type-fest "^0.8.1" widest-line "^3.1.0" -boxen@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.1.tgz#4faca6a437885add0bf8d99082e272d480814cd4" - integrity sha512-JtIQYts08AFAYGF4eSh3pUt3NQkYV/e75pRtQmAVTLNWR/1L7Bsswxlgzgk8nmLEM+gFszsIlA9BgD3XnSqp3g== +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" brace-expansion@^1.1.7: version "1.1.11" @@ -4543,6 +4338,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -4559,7 +4361,7 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -4569,7 +4371,7 @@ braces@^3.0.1, braces@~3.0.2: brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-process-hrtime@^1.0.0: version "1.0.0" @@ -4599,16 +4401,15 @@ browserslist@4.16.3: escalade "^3.1.1" node-releases "^1.1.70" -browserslist@^4.16.4, browserslist@^4.16.6, browserslist@^4.17.0: - version "4.17.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" - integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g== +browserslist@^4.16.4, browserslist@^4.22.2: + version "4.22.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== dependencies: - caniuse-lite "^1.0.30001254" - colorette "^1.3.0" - electron-to-chromium "^1.3.830" - escalade "^3.1.1" - node-releases "^1.1.75" + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" bs-logger@0.x: version "0.2.6" @@ -4620,7 +4421,7 @@ bs-logger@0.x: bs58@4.0.1, bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -4641,9 +4442,9 @@ bser@2.1.1: node-int64 "^0.4.0" bsert@~0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/bsert/-/bsert-0.0.10.tgz#231ac82873a1418c6ade301ab5cd9ae385895597" - integrity sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q== + version "0.0.12" + resolved "https://registry.yarnpkg.com/bsert/-/bsert-0.0.12.tgz#157c6a6beb1548af3b14d484fcd2a78eb440599d" + integrity sha512-lUB0EMu4KhIf+VQ6RZJ7J3dFdohYSeta+gNgDi00Hi/t3k/W6xZlwm9PSSG0q7hJ2zW9Rsn5yaMPymETxroTRw== bstring@0.3.9, bstring@^0.3.9: version "0.3.9" @@ -4654,15 +4455,10 @@ bstring@0.3.9, bstring@^0.3.9: loady "~0.0.1" nan "^2.13.1" -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= - -buffer-es6@4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" - integrity sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ= +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-from@1.x, buffer-from@^1.0.0: version "1.1.2" @@ -4684,7 +4480,15 @@ buffer-xor@2.0.2: buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@6.0.3, buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" buffer@^5.1.0, buffer@^5.5.0: version "5.7.1" @@ -4694,92 +4498,81 @@ buffer@^5.1.0, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - bufio@~1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.0.7.tgz#b7f63a1369a0829ed64cc14edf0573b3e382a33e" integrity sha512-bd1dDQhiC+bEbEfg56IdBv7faWa6OipMs/AFFFvtFnB3wAYjlwQpQRZ0pm6ZkgtfL0pILRXhKxOiQj6UzoMR7A== -builtin-modules@3.2.0, builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== +builtin-modules@3.3.0, builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== -byline@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" - integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= - -byte-size@^5.0.1: +builtins@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" - integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +byte-size@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" + integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== bytebuffer@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" - integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= + integrity sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ== dependencies: long "~3" -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cacache@^12.0.0, cacache@^12.0.3: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5, cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" + fs-minipass "^2.1.0" + glob "^8.0.1" infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" + lru-cache "^7.7.1" + minipass "^3.1.6" minipass-collect "^1.0.2" minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" p-map "^4.0.0" promise-inflight "^1.0.1" rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + +cacache@^17.0.0: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" cache-base@^1.0.1: version "1.0.1" @@ -4801,6 +4594,24 @@ cacheable-lookup@^5.0.3: resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -4814,50 +4625,32 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cacheable-request@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: clone-response "^1.0.2" get-stream "^5.1.0" http-cache-semantics "^4.0.0" keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - caller-callsite "^2.0.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +callsite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ== callsites@^3.0.0: version "3.1.0" @@ -4872,23 +4665,6 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -4898,44 +4674,34 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +camelcase@^6.0.0, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001208, caniuse-lite@^1.0.30001254: - version "1.0.30001257" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz#150aaf649a48bee531104cfeda57f92ce587f6e5" - integrity sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA== +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== -capture-console@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-console/-/capture-console-1.0.1.tgz#db63c39ac73239019badd7fbb10143eda380ff71" - integrity sha1-22PDmscyOQGbrdf7sQFD7aOA/3E= +caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001208, caniuse-lite@^1.0.30001580: + version "1.0.30001581" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" + integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== + +capture-console@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/capture-console/-/capture-console-1.0.2.tgz#742d370705566a5a1ccbda7ba500691e577cc774" + integrity sha512-vQNTSFr0cmHAYXXG3KG7ZJQn0XxC3K2di/wUZVb6yII6gqSN/10Egd3vV4XqJ00yCRNHy2wkN4uWHE+rJstDrw== dependencies: argle "~1.1.1" lodash.isfunction "~3.0.8" - randomstring "~1.1.5" + randomstring "^1.3.0" capture-exit@^2.0.0: version "2.0.0" @@ -4947,31 +4713,17 @@ capture-exit@^2.0.0: cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== dependencies: ansicolors "~0.3.2" redeyed "~2.1.0" -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + lodash "^4.17.15" chalk@4.1.0: version "4.1.0" @@ -4981,7 +4733,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0: +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4992,7 +4744,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -5000,6 +4752,15 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^3.0.0, chalk@^3.0.0-beta.2: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -5008,10 +4769,15 @@ chalk@^3.0.0, chalk@^3.0.0-beta.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chance@1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.8.tgz#5d6c2b78c9170bf6eb9df7acdda04363085be909" - integrity sha512-v7fi5Hj2VbR6dJEGRWLmJBA83LJMS47pkAbmROFxHWd9qmE1esHRZW8Clf1Fhzr3rjxnNZVCjOEv/ivFxeIMtg== +chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chance@1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.11.tgz#78e10e1f9220a5bbc60a83e3f28a5d8558d84d1b" + integrity sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA== char-regex@^1.0.2: version "1.0.2" @@ -5038,22 +4804,7 @@ chokidar@3.4.3: optionalDependencies: fsevents "~2.1.2" -"chokidar@>=3.0.0 <4.0.0": - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - 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" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: +chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -5064,19 +4815,19 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@*: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cint@^8.2.1: - version "8.2.1" - resolved "https://registry.yarnpkg.com/cint/-/cint-8.2.1.tgz#70386b1b48e2773d0d63166a55aff94ef4456a12" - integrity sha1-cDhrG0jidz0NYxZqVa/5TvRFahI= +ci-info@^3.2.0, ci-info@^3.6.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -5113,25 +4864,30 @@ clean-stack@^3.0.0: dependencies: escape-string-regexp "4.0.0" -cli-boxes@^2.2.0, cli-boxes@^2.2.1: +cli-boxes@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== -cli-cursor@^3.1.0: +cli-cursor@3.1.0, cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + cli-highlight@^2.0.0: version "2.1.11" resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" @@ -5145,17 +4901,21 @@ cli-highlight@^2.0.0: yargs "^16.0.0" cli-progress@^3.4.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.0.tgz#25db83447deb812e62d05bac1af9aec5387ef3d4" - integrity sha512-g7rLWfhAo/7pF+a/STFH/xPyosaL1zgADhI0OM83hl3c7S43iGvJWEAV2QuDOnQ8i6EMBj/u4+NTd0d5L+4JfA== + version "3.12.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== dependencies: - colors "^1.1.2" - string-width "^4.2.0" + string-width "^4.2.3" + +cli-spinners@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.2.0, cli-spinners@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" - integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-table3@0.6.0: version "0.6.0" @@ -5167,38 +4927,32 @@ cli-table3@0.6.0: optionalDependencies: colors "^1.1.2" -cli-table@^0.3.1: - version "0.3.6" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.6.tgz#e9d6aa859c7fe636981fd3787378c2a20bce92fc" - integrity sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ== +cli-table3@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: - colors "1.0.3" + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + integrity sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg== dependencies: slice-ansi "0.0.4" string-width "^1.0.1" -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - cli-ux@^5.2.1: - version "5.6.3" - resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.6.3.tgz#eecdb2e0261171f2b28f2be6b18c490291c3a287" - integrity sha512-/oDU4v8BiDjX2OKcSunGH0iGDiEtj2rZaGyqNuv9IT4CgcSMyVWAMfn0+rEHaOc4n9ka78B0wo1+N1QX89f7mw== + version "5.6.7" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.6.7.tgz#32ef9e6cb2b457be834280cc799028a11c8235a8" + integrity sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g== dependencies: - "@oclif/command" "^1.6.0" - "@oclif/errors" "^1.2.1" + "@oclif/command" "^1.8.15" + "@oclif/errors" "^1.3.5" "@oclif/linewrap" "^1.0.0" - "@oclif/screen" "^1.0.3" + "@oclif/screen" "^1.0.4" ansi-escapes "^4.3.0" ansi-styles "^4.2.0" cardinal "^2.1.1" @@ -5211,7 +4965,7 @@ cli-ux@^5.2.1: indent-string "^4.0.0" is-wsl "^2.2.0" js-yaml "^3.13.1" - lodash "^4.17.11" + lodash "^4.17.21" natural-orderby "^2.0.1" object-treeify "^1.1.4" password-prompt "^1.1.2" @@ -5222,10 +4976,10 @@ cli-ux@^5.2.1: supports-hyperlinks "^2.1.0" tslib "^2.0.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^5.0.0: version "5.0.0" @@ -5254,7 +5008,16 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone-deep@^4.0.1: +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== @@ -5264,41 +5027,46 @@ clone-deep@^4.0.1: shallow-clone "^3.0.0" clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone@2.x: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +cmd-shim@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -5320,57 +5088,72 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.1, colorette@^1.2.2, colorette@^1.3.0, colorette@^1.4.0: +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -columnify@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" - integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= +columnify@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== dependencies: - strip-ansi "^3.0.0" + strip-ansi "^6.0.1" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.16.0, commander@^2.20.0, commander@^2.20.3, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.2.0, commander@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compare-func@^2.0.0: version "2.0.0" @@ -5380,30 +5163,15 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -compare-versions@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== - component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^2.0.0: version "2.0.0" @@ -5423,34 +5191,26 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -consolidate@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" - integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== - dependencies: - bluebird "^3.7.2" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== content-type@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== continuation-local-storage@^3.2.1: version "3.2.1" @@ -5460,7 +5220,14 @@ continuation-local-storage@^3.2.1: async-listener "^0.6.0" emitter-listener "^1.1.1" -conventional-changelog-angular@^5.0.0, conventional-changelog-angular@^5.0.3: +conventional-changelog-angular@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-angular@^5.0.0: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== @@ -5469,66 +5236,61 @@ conventional-changelog-angular@^5.0.0, conventional-changelog-angular@^5.0.3: q "^1.5.1" conventional-changelog-conventionalcommits@^4.3.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.1.tgz#f4c0921937050674e578dc7875f908351ccf4014" - integrity sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw== + version "4.6.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== dependencies: compare-func "^2.0.0" lodash "^4.17.15" q "^1.5.1" -conventional-changelog-core@^3.1.6: - version "3.2.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb" - integrity sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ== - dependencies: - conventional-changelog-writer "^4.0.6" - conventional-commits-parser "^3.0.3" - dateformat "^3.0.0" - get-pkg-repo "^1.0.0" - git-raw-commits "2.0.0" +conventional-changelog-core@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz#3c331b155d5b9850f47b4760aeddfc983a92ad49" + integrity sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^6.0.0" + conventional-commits-parser "^4.0.0" + dateformat "^3.0.3" + get-pkg-repo "^4.2.1" + git-raw-commits "^3.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^2.0.3" - lodash "^4.2.1" - normalize-package-data "^2.3.5" - q "^1.5.1" + git-semver-tags "^5.0.0" + normalize-package-data "^3.0.3" read-pkg "^3.0.0" read-pkg-up "^3.0.0" - through2 "^3.0.0" -conventional-changelog-preset-loader@^2.1.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" - integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== +conventional-changelog-preset-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz#14975ef759d22515d6eabae6396c2ae721d4c105" + integrity sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== -conventional-changelog-writer@^4.0.6: - version "4.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz#1ca7880b75aa28695ad33312a1f2366f4b12659f" - integrity sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw== +conventional-changelog-writer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz#d8d3bb5e1f6230caed969dcc762b1c368a8f7b01" + integrity sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ== dependencies: - compare-func "^2.0.0" - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" - handlebars "^4.7.6" + conventional-commits-filter "^3.0.0" + dateformat "^3.0.3" + handlebars "^4.7.7" json-stringify-safe "^5.0.1" - lodash "^4.17.15" - meow "^8.0.0" - semver "^6.0.0" - split "^1.0.0" - through2 "^4.0.0" + meow "^8.1.2" + semver "^7.0.0" + split "^1.0.1" -conventional-commits-filter@^2.0.2, conventional-commits-filter@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" - integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== +conventional-commits-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz#bf1113266151dd64c49cd269e3eb7d71d7015ee2" + integrity sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== dependencies: lodash.ismatch "^4.4.0" - modify-values "^1.0.0" + modify-values "^1.0.1" -conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.3: - version "3.2.2" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.2.tgz#190fb9900c6e02be0c0bca9b03d57e24982639fd" - integrity sha512-Jr9KAKgqAkwXMRHjxDwO/zOCDKod1XdAESHAGuJX38iZ7ZzVti/tvVoysO0suMsdAObp9NQ2rHSsSbnAqZ5f5g== +conventional-commits-parser@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" @@ -5537,81 +5299,65 @@ conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.3: split2 "^3.0.0" through2 "^4.0.0" -conventional-recommended-bump@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz#5af63903947b6e089e77767601cb592cabb106ba" - integrity sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ== +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== + dependencies: + JSONStream "^1.3.5" + is-text-path "^1.0.1" + meow "^8.1.2" + split2 "^3.2.2" + +conventional-recommended-bump@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz#ec01f6c7f5d0e2491c2d89488b0d757393392424" + integrity sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== dependencies: concat-stream "^2.0.0" - conventional-changelog-preset-loader "^2.1.1" - conventional-commits-filter "^2.0.2" - conventional-commits-parser "^3.0.3" - git-raw-commits "2.0.0" - git-semver-tags "^2.0.3" - meow "^4.0.0" - q "^1.5.1" + conventional-changelog-preset-loader "^3.0.0" + conventional-commits-filter "^3.0.0" + conventional-commits-parser "^4.0.0" + git-raw-commits "^3.0.0" + git-semver-tags "^5.0.0" + meow "^8.1.2" convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.14.0, core-js-compat@^3.16.0: - version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e" - integrity sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA== +core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.31.0, core-js-compat@^3.34.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" + integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== dependencies: - browserslist "^4.17.0" - semver "7.0.0" + browserslist "^4.22.2" core-js@^3.6.1: - version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.17.3.tgz#8e8bd20e91df9951e903cabe91f9af4a0895bc1e" - integrity sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + version "3.35.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.1.tgz#9c28f8b7ccee482796f8590cc8d15739eaaf980c" + integrity sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== +cosmiconfig@^7.0.0, cosmiconfig@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -5619,38 +5365,15 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cp-file@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== - dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" - -cpy-cli@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-3.1.1.tgz#2adb06544102c948ce098e522d5b8ddcf4f7c0b4" - integrity sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg== - dependencies: - cpy "^8.0.0" - meow "^6.1.1" - -cpy@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" - integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - arrify "^2.0.1" - cp-file "^7.0.0" - globby "^9.2.0" - has-glob "^1.0.0" - junk "^3.1.0" - nested-error-stacks "^2.1.0" - p-all "^2.1.0" - p-filter "^2.1.0" - p-map "^3.0.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" create-hash@1.2.0, create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" @@ -5689,7 +5412,7 @@ cross-env@7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -5700,7 +5423,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5709,15 +5432,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" cssom@^0.4.4: version "0.4.4" @@ -5736,42 +5456,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= - dependencies: - number-is-nan "^1.0.0" - dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-uri-to-buffer@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" - integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -5786,105 +5475,65 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -dateformat@^3.0.0: +dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -dateformat@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c" - integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q== +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== -dayjs@1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" - integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== +dayjs@1.11.10: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" -debug@2, debug@^2.2.0, debug@^2.3.3: +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= - -decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decomment@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/decomment/-/decomment-0.9.4.tgz#fa40335bd90e3826d5c1984276e390525ff856d5" - integrity sha512-8eNlhyI5cSU4UbBlrtagWpR03dqXcE5IR9zpe7PnO6UzReXDskucsD8usgrzUmQ6qJ3N82aws/p/mu/jqbURWw== - dependencies: - esprima "4.0.1" + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== - dependencies: - mimic-response "^2.0.0" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -5892,23 +5541,10 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -decompress-zip@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/decompress-zip/-/decompress-zip-0.3.3.tgz#71469aca39003e360a4044d6a6a9f64a1bef5a49" - integrity sha512-/fy1L4s+4jujqj3kNptWjilFw3E6De8U6XUFvqmh4npN3Vsypm3oT2V0bXcmbBWS+5j5tr4okYaFrOmyZkszEg== - dependencies: - binary "^0.3.0" - graceful-fs "^4.1.3" - mkpath "^0.1.0" - nopt "^3.0.1" - q "^1.1.2" - readable-stream "^1.1.8" - touch "0.0.3" - -dedent@^0.7.0: +dedent@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-extend@^0.6.0: version "0.6.0" @@ -5918,22 +5554,22 @@ deep-extend@^0.6.0: deep-freeze@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" - integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + integrity sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@4.2.2, deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +deepmerge@4.3.1, deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" @@ -5942,70 +5578,46 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -defer-to-connect@^2.0.0: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: - object-keys "^1.0.12" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -degenerator@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" - integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= - dependencies: - ast-types "0.x.x" - escodegen "1.x.x" - esprima "3.x.x" - -del-cli@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-3.0.1.tgz#2d27ff260204b5104cadeda86f78f180a4ebe89a" - integrity sha512-BLHItGr82rUbHhjMu41d+vw9Md49i81jmZSV00HdTq4t+RTHywmEht/23mNFpUl2YeLYJZJyGz4rdlMAyOxNeg== + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: - del "^5.1.0" - meow "^6.1.1" + is-descriptor "^1.0.0" -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" - slash "^3.0.0" + is-descriptor "^1.0.2" + isobject "^3.0.1" delay@4.4.1: version "4.4.1" @@ -6015,113 +5627,138 @@ delay@4.4.1: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depcheck@*, depcheck@1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-1.4.2.tgz#dedeb8729b8fdf990e2bc45a869d99cfb4460097" - integrity sha512-oYaBLRbF5NMkYxc5rltnqtuPAn25Lx5xPBIJXy5oUVBgrEDDtotCoYUfFH8lvcmSWzgk1Ts9H+f4Rk0oWL51LQ== - dependencies: - "@babel/parser" "^7.12.5" - "@babel/traverse" "^7.12.5" - "@vue/compiler-sfc" "^3.0.5" - camelcase "^6.2.0" - cosmiconfig "^7.0.0" - debug "^4.2.0" - deps-regex "^0.1.4" - ignore "^5.1.8" - is-core-module "^2.4.0" - js-yaml "^3.14.0" - json5 "^2.1.3" - lodash "^4.17.20" - minimatch "^3.0.4" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depcheck@*, depcheck@1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-1.4.7.tgz#57976e2fa43625f477efc0f19ad868ef94f8a26c" + integrity sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA== + dependencies: + "@babel/parser" "^7.23.0" + "@babel/traverse" "^7.23.2" + "@vue/compiler-sfc" "^3.3.4" + callsite "^1.0.0" + camelcase "^6.3.0" + cosmiconfig "^7.1.0" + debug "^4.3.4" + deps-regex "^0.2.0" + findup-sync "^5.0.0" + ignore "^5.2.4" + is-core-module "^2.12.0" + js-yaml "^3.14.1" + json5 "^2.2.3" + lodash "^4.17.21" + minimatch "^7.4.6" multimatch "^5.0.0" please-upgrade-node "^3.2.0" - query-ast "^1.0.3" - readdirp "^3.5.0" + readdirp "^3.6.0" require-package-name "^2.0.1" - resolve "^1.18.1" - sass "^1.29.0" - scss-parser "^1.0.4" - semver "^7.3.2" - yargs "^16.1.0" - -depd@^1.1.2, depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + resolve "^1.22.3" + resolve-from "^5.0.0" + semver "^7.5.4" + yargs "^16.2.0" -dependency-tree@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-8.1.1.tgz#1a309f5a860b3285f7b1638c98ce48c8906ae6e6" - integrity sha512-bl5U16VQpaYxD0xvcnCH/dTctCiWnsVWymh9dNjbm4T00Hm21flu1VLnNueKCj7+3uusbcJhKKKtiWrpU0I+Nw== +dependency-tree@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-9.0.0.tgz#9288dd6daf35f6510c1ea30d9894b75369aa50a2" + integrity sha512-osYHZJ1fBSon3lNLw70amAXsQ+RGzXsPvk9HbBgTLbp/bQBmpH5mOmsUvqXU+YEWVU0ZLewsmzOET/8jWswjDQ== dependencies: commander "^2.20.3" debug "^4.3.1" - filing-cabinet "^3.0.0" - precinct "^8.0.0" - typescript "^3.9.7" + filing-cabinet "^3.0.1" + precinct "^9.0.0" + typescript "^4.0.0" -deprecation@^2.0.0, deprecation@^2.3.1: +deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -deps-regex@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" - integrity sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ= +deps-regex@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.2.0.tgz#3ee7ddae5fd784f3accf29d5a711aa6e10044137" + integrity sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -detective-amd@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-3.1.0.tgz#92daee3214a0ca4522646cf333cac90a3fca6373" - integrity sha512-G7wGWT6f0VErjUkE2utCm7IUshT7nBh7aBBH2VBOiY9Dqy2DMens5iiOvYCuhstoIxRKLrnOvVAz4/EyPIAjnw== +detective-amd@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-3.1.2.tgz#bf55eb5291c218b76d6224a3d07932ef13a9a357" + integrity sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ== dependencies: - ast-module-types "^2.7.0" + ast-module-types "^3.0.0" escodegen "^2.0.0" get-amd-module-type "^3.0.0" - node-source-walk "^4.0.0" + node-source-walk "^4.2.0" + +detective-amd@^4.0.1, detective-amd@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-4.2.0.tgz#21c43465669f06cf894eef047a27e6e72ba6bc13" + integrity sha512-RbuEJHz78A8nW7CklkqTzd8lDCN42En53dgEIsya0DilpkwslamSZDasLg8dJyxbw46OxhSQeY+C2btdSkCvQQ== + dependencies: + ast-module-types "^4.0.0" + escodegen "^2.0.0" + get-amd-module-type "^4.1.0" + node-source-walk "^5.0.1" detective-cjs@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-3.1.1.tgz#18da3e39a002d2098a1123d45ce1de1b0d9045a0" - integrity sha512-JQtNTBgFY6h8uT6pgph5QpV3IyxDv+z3qPk/FZRDT9TlFfm5dnRtpH39WtQEr1khqsUxVqXzKjZHpdoQvQbllg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-3.1.3.tgz#50e107d67b37f459b0ec02966ceb7e20a73f268b" + integrity sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ== dependencies: - ast-module-types "^2.4.0" + ast-module-types "^3.0.0" node-source-walk "^4.0.0" -detective-es6@^2.1.0, detective-es6@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-2.2.0.tgz#8f2baba3f8cd90a5cfd748f5ac436f0158ed2585" - integrity sha512-fSpNY0SLER7/sVgQZ1NxJPwmc9uCTzNgdkQDhAaj8NPYwr7Qji9QBcmbNvtMCnuuOGMuKn3O7jv0An+/WRWJZQ== +detective-cjs@^4.0.0, detective-cjs@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-4.1.0.tgz#56b1558ca0910933c7fc47c740b957f0280ff302" + integrity sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg== + dependencies: + ast-module-types "^4.0.0" + node-source-walk "^5.0.1" + +detective-es6@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-2.2.2.tgz#ee5f880981d9fecae9a694007029a2f6f26d8d28" + integrity sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw== dependencies: node-source-walk "^4.0.0" +detective-es6@^3.0.0, detective-es6@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-3.0.1.tgz#53a15fbb2f298c4a106d9fe7427da8a57162dde6" + integrity sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw== + dependencies: + node-source-walk "^5.0.0" + detective-less@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/detective-less/-/detective-less-1.0.2.tgz#a68af9ca5f69d74b7d0aa190218b211d83b4f7e3" @@ -6141,56 +5778,81 @@ detective-postcss@^4.0.0: postcss "^8.1.7" postcss-values-parser "^2.0.1" +detective-postcss@^6.1.0, detective-postcss@^6.1.1: + version "6.1.3" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-6.1.3.tgz#51a2d4419327ad85d0af071c7054c79fafca7e73" + integrity sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw== + dependencies: + is-url "^1.2.4" + postcss "^8.4.23" + postcss-values-parser "^6.0.2" + detective-sass@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-3.0.1.tgz#496b819efd1f5c4dd3f0e19b43a8634bdd6927c4" - integrity sha512-oSbrBozRjJ+QFF4WJFbjPQKeakoaY1GiR380NPqwdbWYd5wfl5cLWv0l6LsJVqrgWfFN1bjFqSeo32Nxza8Lbw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-3.0.2.tgz#e0f35aac79a4d2f6409c284d95b8f7ecd5973afd" + integrity sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g== dependencies: - debug "^4.1.1" - gonzales-pe "^4.2.3" + gonzales-pe "^4.3.0" node-source-walk "^4.0.0" +detective-sass@^4.0.1, detective-sass@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-4.1.3.tgz#6cdcc27ae8a90d15704e0ba83683048f77f10b75" + integrity sha512-xGRbwGaGte57gvEqM8B9GDiURY3El/H49vA6g9wFkxq9zalmTlTAuqWu+BsH0iwonGPruLt55tZZDEZqPc6lag== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^5.0.1" + detective-scss@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-2.0.1.tgz#06f8c21ae6dedad1fccc26d544892d968083eaf8" - integrity sha512-VveyXW4WQE04s05KlJ8K0bG34jtHQVgTc9InspqoQxvnelj/rdgSAy7i2DXAazyQNFKlWSWbS+Ro2DWKFOKTPQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-2.0.2.tgz#7d2a642616d44bf677963484fa8754d9558b8235" + integrity sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg== dependencies: - debug "^4.1.1" - gonzales-pe "^4.2.3" + gonzales-pe "^4.3.0" node-source-walk "^4.0.0" +detective-scss@^3.0.0, detective-scss@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-3.1.1.tgz#b49f05cadfb0837b04e23baba292581b7c7f65e1" + integrity sha512-FWkfru1jZBhUeuBsOeGKXKAVDrzYFSQFK2o2tuG/nCCFQ0U/EcXC157MNAcR5mmj+mCeneZzlkBOFJTesDjrww== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^5.0.1" + detective-stylus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-1.0.0.tgz#50aee7db8babb990381f010c63fabba5b58e54cd" - integrity sha1-UK7n24uruZA4HwEMY/q7pbWOVM0= + version "1.0.3" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-1.0.3.tgz#20a702936c9fd7d4203fd7a903314b5dd43ac713" + integrity sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q== -detective-typescript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-6.0.0.tgz#394062118d7c7da53425647ca41e0081169aa2b3" - integrity sha512-vTidcSDK3QostdbrH2Rwf9FhvrgJ4oIaVw5jbolgruTejexk6nNa9DShGpuS8CFVDb1IP86jct5BaZt1wSxpkA== - dependencies: - "@typescript-eslint/typescript-estree" "^4.8.2" - ast-module-types "^2.7.1" - node-source-walk "^4.2.0" - typescript "^3.9.7" +detective-stylus@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-2.0.1.tgz#d528dfa7ef3c4eb2fbc9a7249d54906ec4e05d09" + integrity sha512-/Tvs1pWLg8eYwwV6kZQY5IslGaYqc/GACxjcaGudiNtN5nKCH6o2WnJK3j0gA3huCnoQcbv8X7oz/c1lnvE3zQ== + +detective-stylus@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-3.0.0.tgz#c869795a7d6df7043ab6aee8b1a6f3dd66764232" + integrity sha512-1xYTzbrduExqMYmte7Qk99IRA3Aa6oV7PYzd+3yDcQXkmENvyGF/arripri6lxRDdNYEb4fZFuHtNRAXbz3iAA== detective-typescript@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-7.0.0.tgz#8c8917f2e51d9e4ee49821abf759ff512dd897f2" - integrity sha512-y/Ev98AleGvl43YKTNcA2Q+lyFmsmCfTTNWy4cjEJxoLkbobcXtRS0Kvx06daCgr2GdtlwLfNzL553BkktfJoA== + version "7.0.2" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-7.0.2.tgz#c6e00b4c28764741ef719662250e6b014a5f3c8e" + integrity sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA== dependencies: - "@typescript-eslint/typescript-estree" "^4.8.2" + "@typescript-eslint/typescript-estree" "^4.33.0" ast-module-types "^2.7.1" node-source-walk "^4.2.0" - typescript "^3.9.7" + typescript "^3.9.10" -dezalgo@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= +detective-typescript@^9.0.0, detective-typescript@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-9.1.1.tgz#b99c0122cbb35b39de2c5f58447f1e93ac28c6d5" + integrity sha512-Uc1yVutTF0RRm1YJ3g//i1Cn2vx1kwHj15cnzQP6ff5koNzQ0idc1zAC73ryaWEulA0ElRXFTq6wOqe8vUQ3MA== dependencies: - asap "^2.0.0" - wrappy "1" + "@typescript-eslint/typescript-estree" "^5.55.0" + ast-module-types "^4.0.0" + node-source-walk "^5.0.1" + typescript "^4.9.5" diff-sequences@^24.9.0: version "24.9.0" @@ -6202,17 +5864,15 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" +diff@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== dir-glob@^3.0.1: version "3.0.1" @@ -6235,43 +5895,53 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -dot-prop@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== - dependencies: - is-obj "^1.0.0" - -dot-prop@^5.1.0, dot-prop@^5.2.0: +dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + dotenv@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== +dotenv@~16.3.1: + version "16.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" + integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== + duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +duplexify@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" stream-shift "^1.0.0" eachr@^4.5.0: @@ -6281,13 +5951,10 @@ eachr@^4.5.0: dependencies: typechecker "^6.2.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== editions@^2.3.0: version "2.3.1" @@ -6297,15 +5964,22 @@ editions@^2.3.0: errlop "^2.0.0" semver "^6.3.0" -electron-to-chromium@^1.3.649, electron-to-chromium@^1.3.830: - version "1.3.838" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.838.tgz#d178b34a268c750c0444ba69e4c94d4c4fb3aa0d" - integrity sha512-65O6UJiyohFAdX/nc6KJ0xG/4zOn7XCO03kQNNbCeMRGxlWTLzc6Uyi0tFNQuuGWqySZJi8CD2KXPXySVYmzMA== +ejs@^3.1.7: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.3.649, electron-to-chromium@^1.4.648: + version "1.4.650" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.650.tgz#b38ef9de16991b9f7b924246770576ab91ab3d64" + integrity sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ== elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== elliptic@^6.4.0: version "6.5.4" @@ -6342,40 +6016,63 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encoding@^0.1.11, encoding@^0.1.12: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^5.3.2: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== +enhanced-resolve@^5.8.3: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@^2.3.5: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + env-paths@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" @@ -6396,16 +6093,11 @@ envfile@5.2.0: editions "^2.3.0" typechecker "^7.0.0" -envinfo@^7.3.1: +envinfo@7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -err-code@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= - err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -6416,67 +6108,22 @@ errlop@^2.0.0: resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.2, es-abstract@^1.18.5: - version "1.18.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" - integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-string "^1.0.7" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" @@ -6486,14 +6133,14 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@1.x.x: +escodegen@^1.13.0: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -6506,14 +6153,13 @@ escodegen@1.x.x: source-map "~0.6.1" escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -6575,6 +6221,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + eslint@7.32.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -6630,20 +6281,24 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@3.x.x: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= +espree@^9.0.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" -esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -6660,9 +6315,9 @@ estraverse@^4.1.1, estraverse@^4.2.0: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^0.6.1: version "0.6.1" @@ -6685,24 +6340,29 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-lite@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.2.tgz#838a3e0fdddef8cc90f128006c8e55a4e4e4c11b" - integrity sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g== + version "0.1.3" + resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.3.tgz#3dfe01144e808ac46448f0c19b4ab68e403a901d" + integrity sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw== -eventemitter2@^5.0.1: +event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" - integrity sha1-YZegldX7a1folC9v1+qtY6CclFI= + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter2@^6.3.1: - version "6.4.4" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" - integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== + version "6.4.9" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" + integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.3: version "1.0.3" @@ -6733,6 +6393,21 @@ execa@3.4.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + 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" + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -6759,7 +6434,7 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0, execa@^4.1.0: +execa@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -6774,15 +6449,30 @@ execa@^4.0.0, execa@^4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -6797,6 +6487,13 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + expect@^24.1.0: version "24.9.0" resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" @@ -6821,26 +6518,26 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -6869,20 +6566,26 @@ extract-stack@^2.0.0: resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" fast-copy@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-2.1.1.tgz#f5cbcf2df64215e59b8e43f0b2caabc19848083a" - integrity sha512-Qod3DdRgFZ8GUIM6ygeoZYpQ0QLW9cf/FS9KhhjlYggcSZXWAemAw8BOCO5LuYCrR3Uj3qXDVTUzOUwG8C7beQ== + version "2.1.7" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-2.1.7.tgz#affc9475cb4b555fb488572b2a44231d0c9fa39e" + integrity sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA== + +fast-copy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.1.tgz#9e89ef498b8c04c1cd76b33b8e14271658a732aa" + integrity sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -6890,31 +6593,19 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-equals@^1.6.0: version "1.6.3" resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-1.6.3.tgz#84839a1ce20627c463e1892f2ae316380c81b459" integrity sha512-4WKW0AL5+WEqO0zWavAfYGY1qwLsBgE//DN4TTcVEN2UlINgkv9b3vm2iHicoenWKSX9mKWmGOsU/iI5IST7pQ== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.0.3, fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== +fast-glob@^3.0.3, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -6930,19 +6621,19 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: fast-levenshtein@2.0.6, fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-memoize@2.5.2, fast-memoize@^2.5.1: +fast-memoize@2.5.2, fast-memoize@^2.5.1, fast-memoize@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== -fast-redact@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.2.tgz#c940ba7162dde3aeeefc522926ae8c5231412904" - integrity sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg== +fast-redact@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== -fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.0.8: +fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== @@ -6957,39 +6648,43 @@ fast-stringify@^1.1.0: resolved "https://registry.yarnpkg.com/fast-stringify/-/fast-stringify-1.1.2.tgz#f109b792d54343aec271b47882598d279402401d" integrity sha512-SfslXjiH8km0WnRiuPfpUKwlZjW5I878qsOm+2x8x3TgqmElOOLh1rgJFb+PolNdNRK3r8urEefqx0wt7vx1dA== -fastify-warning@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/fastify-warning/-/fastify-warning-0.2.0.tgz#e717776026a4493dc9a2befa44db6d17f618008f" - integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== - fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.17.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" + integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" -figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" figlet@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634" - integrity sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" + integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== + +figures@3.2.0, figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" @@ -6997,14 +6692,7 @@ figures@^1.7.0: figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== dependencies: escape-string-regexp "^1.0.5" @@ -7015,34 +6703,41 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-uri-to-path@1, file-uri-to-path@1.0.0: +file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filing-cabinet@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-3.0.0.tgz#08f9ceec5134f4a662926dd45b8a26eca1b5f622" - integrity sha512-o8Qac5qxZ1uVidR4Sd7ZQbbqObFZlqXU4xu1suAYg9PQPcQFNTzOmxQa/MehIDMgIvXHTb42mWPNV9l3eHBPSw== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filing-cabinet@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-3.3.1.tgz#45d87bb273a0e0a7dd6ac6bac9111059186e2e9c" + integrity sha512-renEK4Hh6DUl9Vl22Y3cxBq1yh8oNvbAdXnhih0wVpmea+uyKjC9K4QeRjUaybIiIewdzfum+Fg15ZqJ/GyCaA== dependencies: app-module-path "^2.2.0" commander "^2.20.3" - debug "^4.3.1" - decomment "^0.9.3" - enhanced-resolve "^5.3.2" + debug "^4.3.3" + enhanced-resolve "^5.8.3" is-relative-path "^1.0.2" module-definition "^3.3.1" - module-lookup-amd "^7.0.0" - resolve "^1.19.0" + module-lookup-amd "^7.0.1" + resolve "^1.21.0" resolve-dependency-path "^2.0.0" sass-lookup "^3.0.0" stylus-lookup "^3.0.1" + tsconfig-paths "^3.10.1" typescript "^3.9.7" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -7056,11 +6751,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= - filter-obj@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-2.0.2.tgz#fff662368e505d69826abb113f0f6a98f56e9d5f" @@ -7083,18 +6773,10 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -7113,13 +6795,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-versions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" - integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== - dependencies: - semver-regex "^3.1.2" - find-yarn-workspace-root@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" @@ -7127,56 +6802,69 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" +findup-sync@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-5.0.0.tgz#54380ad965a7edca00cc8f63113559aadc541bd2" + integrity sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.3" + micromatch "^4.0.4" + resolve-dir "^1.0.1" + flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flatstr@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" - integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" +follow-redirects@^1.14.0, follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== -follow-redirects@^1.14.0: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== form-data@^2.5.0: version "2.5.1" @@ -7196,36 +6884,33 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" +fp-and-or@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/fp-and-or/-/fp-and-or-0.1.4.tgz#0268c800c359ede259cdcbc352654e698b7ea299" + integrity sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" + map-cache "^0.2.2" fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@8.1.0, fs-extra@^8.1, fs-extra@^8.1.0: +fs-extra@8.1.0, fs-extra@^8.1: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -7234,6 +6919,15 @@ fs-extra@8.1.0, fs-extra@^8.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^11.1.0, fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" @@ -7253,13 +6947,6 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -7267,74 +6954,51 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" + minipass "^7.0.3" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@^2.1.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -ftp@~0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@1.0.1, functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -generic-names@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" - integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== dependencies: - loader-utils "^1.1.0" - -genfun@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" - integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -7342,26 +7006,35 @@ gensync@^1.0.0-beta.2: integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-amd-module-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.0.tgz#bb334662fa04427018c937774570de495845c288" - integrity sha512-99Q7COuACPfVt18zH9N4VAMyb81S6TUgJm2NgV6ERtkh9VIkAaByZkW530wl3lLN5KTtSrK9jVLxYsoP5hQKsw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz#46550cee2b8e1fa4c3f2c8a5753c36990aa49ab0" + integrity sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw== dependencies: - ast-module-types "^2.3.2" - node-source-walk "^4.0.0" + ast-module-types "^3.0.0" + node-source-walk "^4.2.2" + +get-amd-module-type@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-4.1.0.tgz#af1396d02cd935cb6fafdc4a5282395db3422db6" + integrity sha512-0e/eK6vTGCnSfQ6eYs3wtH05KotJYIP7ZIZEueP/KlA+0dIAEs8bYFvOd/U56w1vfjhJqBagUxVMyy9Tr/cViQ== + dependencies: + ast-module-types "^4.0.0" + node-source-walk "^5.0.1" get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -7373,46 +7046,40 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= +get-pkg-repo@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" through2 "^2.0.0" + yargs "^16.2.0" get-port@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== -get-port@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" - integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== - get-stdin@8.0.0, get-stdin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stream@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" @@ -7428,53 +7095,20 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-uri@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a" - integrity sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q== - dependencies: - data-uri-to-buffer "1" - debug "2" - extend "~3.0.2" - file-uri-to-path "1" - ftp "~0.3.10" - readable-stream "2" +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -git-raw-commits@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" - integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== - dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== git-raw-commits@^2.0.0: - version "2.0.10" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" - integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: dargs "^7.0.0" lodash "^4.17.15" @@ -7482,75 +7116,83 @@ git-raw-commits@^2.0.0: split2 "^3.0.0" through2 "^4.0.0" +git-raw-commits@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-3.0.0.tgz#5432f053a9744f67e8db03dbc48add81252cfdeb" + integrity sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== + dependencies: + dargs "^7.0.0" + meow "^8.1.2" + split2 "^3.2.2" + git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.3.tgz#48988a718acf593800f99622a952a77c405bfa34" - integrity sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA== +git-semver-tags@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-5.0.1.tgz#db748aa0e43d313bf38dcd68624d8443234e1c15" + integrity sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA== dependencies: - meow "^4.0.0" - semver "^6.0.0" + meow "^8.1.2" + semver "^7.0.0" -git-up@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" - integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== +git-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== dependencies: - is-ssh "^1.3.0" - parse-url "^6.0.0" + is-ssh "^1.4.0" + parse-url "^8.1.0" -git-url-parse@^11.1.2: - version "11.6.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" - integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== +git-url-parse@13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" + integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== dependencies: - git-up "^4.0.0" + git-up "^7.0.0" gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== github-slugger@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" - integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: +glob-parent@5.1.2, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" -glob@7.1.7, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: +glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -7562,32 +7204,108 @@ glob@7.1.7, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glo once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.2.2, glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +glob@^8.0.0, glob@^8.0.1, glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== dependencies: ini "^1.3.4" global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" +globby@11.1.0, globby@^11.0.1, globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -7602,56 +7320,71 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.1, globby@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -gonzales-pe@^4.2.3: +gonzales-pe@^4.2.3, gonzales-pe@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== dependencies: minimist "^1.2.5" -got@11.8.2: - version "11.8.2" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" - integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@11.8.5: + version "11.8.5" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" + integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: "@sindresorhus/is" "^4.0.0" "@szmarczak/http-timer" "^4.0.5" "@types/cacheable-request" "^6.0.1" "@types/responselike" "^1.0.0" cacheable-lookup "^5.0.3" - cacheable-request "^7.0.1" + cacheable-request "^7.0.2" decompress-response "^6.0.0" http2-wrapper "^1.0.0-beta.5.2" lowercase-keys "^2.0.0" p-cancelable "^2.0.0" responselike "^2.0.0" +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -7669,48 +7402,33 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphviz@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/graphviz/-/graphviz-0.0.9.tgz#0bbf1df588c6a92259282da35323622528c4bbc4" - integrity sha512-SmoY2pOtcikmMCqCSy2NO1YsRfu9OO0wpTlOYW++giGjfX1a6gax/m1Fo8IdUd0/3H15cTOfR1SMKwohj4LKsg== - dependencies: - temp "~0.4.0" +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== -handlebars@^4.7.6, handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -7719,36 +7437,36 @@ hard-rejection@^2.1.0: has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - is-glob "^3.0.0" + get-intrinsic "^1.2.2" -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" @@ -7757,15 +7475,15 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0, has-unicode@^2.0.1: +has-unicode@2.0.1, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -7774,7 +7492,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -7783,27 +7501,20 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== hash-base@^3.0.0: version "3.1.0" @@ -7814,11 +7525,6 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash-sum@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== - hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -7827,6 +7533,21 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +help-me@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-4.2.0.tgz#50712bfd799ff1854ae1d312c36eafcea85b0563" + integrity sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA== + dependencies: + glob "^8.0.0" + readable-stream "^3.6.0" + highlight.js@^10.7.1: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -7835,24 +7556,57 @@ highlight.js@^10.7.1: hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" - integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" +hosted-git-info@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.2.1.tgz#0ba1c97178ef91f3ab30842ae63d6a272341156f" + integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== + dependencies: + lru-cache "^7.5.1" + +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +hpagent@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.2.tgz#cab39c66d4df2d4377dbd212295d878deb9bdaa9" + integrity sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ== + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -7865,15 +7619,10 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-call@^5.1.2: version "5.3.0" @@ -7887,25 +7636,6 @@ http-call@^5.1.2: parse-json "^4.0.0" tunnel-agent "^0.6.0" -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -7915,14 +7645,14 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + "@tootallnate/once" "2" + agent-base "6" + debug "4" http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" @@ -7932,26 +7662,18 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - -https-proxy-agent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" - integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: - agent-base "^4.3.0" - debug "^3.1.0" + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -7961,29 +7683,18 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" -husky@4.3.8: - version "4.3.8" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" - integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== - dependencies: - chalk "^4.0.0" - ci-info "^2.0.0" - compare-versions "^3.6.0" - cosmiconfig "^7.0.0" - find-versions "^4.0.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^5.0.0" - please-upgrade-node "^3.2.0" - slash "^3.0.0" - which-pm-runs "^1.0.0" - hyperlinker@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" @@ -8003,49 +7714,41 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= - -icss-utils@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13, ieee754@^1.1.8: +ieee754@^1.1.13, ieee754@^1.1.8, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== + dependencies: + minimatch "^5.0.1" -ignore-walk@^3.0.1, ignore-walk@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== +ignore-walk@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" + integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== dependencies: - minimatch "^3.0.4" + minimatch "^9.0.0" -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.0.4, ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== -immutable@4.0.0-rc.14: - version "4.0.0-rc.14" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.14.tgz#29ba96631ec10867d1348515ac4e6bdba462f071" - integrity sha512-pfkvmRKJSoW7JFx0QeYlAmT+kNYvn5j0u7bnpNq4N2RCvHSTlLT208G8jgaquNe+Q8kCPHKOSpxJkyvLDpYq0w== +immutable@5.0.0-beta.5: + version "5.0.0-beta.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.0-beta.5.tgz#57dcaeadefae61ebc2d3feb6ea5b584a65282b61" + integrity sha512-1RO6wxfJdh/uyWb2MTn3RuCPXYmpRiAhoKm8vEnA50+2Gy0j++6GBtu5q6sq2d4tpcL+e1sCHzk8NkWnRhT2/Q== -import-fresh@3.3.0, import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@3.3.0, import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -8053,31 +7756,15 @@ import-fresh@3.3.0, import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== +import-local@3.1.0, import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -8085,19 +7772,12 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== indent-string@^4.0.0: version "4.0.0" @@ -8107,9 +7787,9 @@ indent-string@^4.0.0: indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== -infer-owner@^1.0.3, infer-owner@^1.0.4: +infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -8117,12 +7797,12 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -8132,93 +7812,81 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" - integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== +ini@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +init-package-json@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== dependencies: - glob "^7.1.1" - npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" - promzard "^0.3.0" - read "~1.0.1" - read-package-json "1 || 2" - semver "2.x || 3.x || 4 || 5" - validate-npm-package-license "^3.0.1" - validate-npm-package-name "^3.0.0" + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^5.0.0" -inquirer@^6.2.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== +inquirer@^8.2.4: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" through "^2.3.6" + wrap-ansi "^6.0.1" int64-buffer@^0.1.9: version "0.1.10" resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.10.tgz#277b228a87d95ad777d07c13832022406a473423" - integrity sha1-J3siiofZWtd30HwTgyAiQGpHNCM= - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -invariant@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" + integrity sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA== inversify@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== -ip@1.1.5, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@2.0.1: +ip@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" + integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +ipaddr.js@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" is-arguments@^1.0.4: version "1.1.1" @@ -8231,14 +7899,7 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" @@ -8247,23 +7908,22 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@3.0.1, is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" is-ci@^2.0.0: version "2.0.0" @@ -8272,58 +7932,37 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.4.0, is-core-module@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-core-module@^2.12.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== dependencies: - has-tostringtag "^1.0.0" + hasown "^2.0.0" is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" -is-docker@^2.0.0: +is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== @@ -8331,7 +7970,7 @@ is-docker@^2.0.0: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -8340,27 +7979,22 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -8379,17 +8013,10 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-glob@^3.0.0, is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -8409,34 +8036,22 @@ is-interactive@^1.0.0: is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" @@ -8445,10 +8060,10 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.0, is-obj@^1.0.1: +is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" @@ -8462,12 +8077,7 @@ is-observable@^1.1.0: dependencies: symbol-observable "^1.1.0" -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.1, is-path-inside@^3.0.2: +is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -8475,7 +8085,7 @@ is-path-inside@^3.0.1, is-path-inside@^3.0.2: is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.0.0: version "2.1.0" @@ -8511,99 +8121,78 @@ is-reference@^1.1.2: dependencies: "@types/estree" "*" -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-relative-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-relative-path/-/is-relative-path-1.0.2.tgz#091b46a0d67c1ed0fe85f1f8cfdde006bb251d46" - integrity sha1-CRtGoNZ8HtD+hfH4z93gBrslHUY= + integrity sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA== is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-ssh@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" - integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ== +is-ssh@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== dependencies: - protocols "^1.1.0" + protocols "^2.0.1" + +is-stream@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== +is-typed-array@^1.1.3: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-url-superb@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" + integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== + is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-windows@^1.0.0, is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -8615,49 +8204,39 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: +istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== @@ -8667,32 +8246,62 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@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" + istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -8745,6 +8354,16 @@ jest-config@^26.6.3: micromatch "^4.0.2" pretty-format "^26.6.2" +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" @@ -8832,6 +8451,11 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -8952,9 +8576,9 @@ jest-mock@^26.6.2: "@types/node" "*" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^24.9.0: version "24.9.0" @@ -9148,35 +8772,37 @@ jest@26.6.3: jju@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - -jmespath@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" - integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== -joi@17.4.2: - version "17.4.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.2.tgz#02f4eb5cf88e515e614830239379dcbbe28ce7f7" - integrity sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw== +joi@17.12.1: + version "17.12.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.1.tgz#3347ecf4cd3301962d42191c021b165eef1f395b" + integrity sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.0" - "@sideway/formula" "^3.0.0" + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" -joycon@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615" - integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ== +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.14.1, js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.14.0: +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -9184,10 +8810,33 @@ js-yaml@3.14.1, js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +js2xmlparser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== + dependencies: + xmlcreate "^2.0.4" + +jsdoc@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.2.tgz#a1273beba964cf433ddf7a70c23fd02c3c60296e" + integrity sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg== + dependencies: + "@babel/parser" "^7.20.15" + "@jsdoc/salty" "^0.2.1" + "@types/markdown-it" "^12.2.3" + bluebird "^3.7.2" + catharsis "^0.9.0" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.2" + klaw "^3.0.0" + markdown-it "^12.3.2" + markdown-it-anchor "^8.4.1" + marked "^4.0.10" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" + underscore "~1.13.2" jsdom@^16.4.0: version "16.7.0" @@ -9230,19 +8879,19 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -9252,10 +8901,15 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" + integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== + json-parse-helpfulerror@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" - integrity sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= + integrity sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg== dependencies: jju "^1.1.0" @@ -9269,44 +8923,42 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.x, json5@^2.1.1, json5@^2.1.2, json5@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +json5@2.x, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.1, json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" +jsonc-parser@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -9322,32 +8974,17 @@ jsonfile@^6.0.1: jsonlines@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/jsonlines/-/jsonlines-0.1.1.tgz#4fcd246dc5d0e38691907c44ab002f782d1d94cc" - integrity sha1-T80kbcXQ44aRkHxEqwAveC0dlMw= + integrity sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA== jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +just-extend@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" + integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== keyv@^3.0.0: version "3.1.0" @@ -9356,87 +8993,143 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -keyv@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" - integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -kleur@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.0.0.tgz#6da4e7a800e33eb28c53fb91902d623450a980d6" - integrity sha512-D8qk4wvB8ofBeLAsRNwnCkjbwdrcKYsMC/56pFQMOSfmmYJkG1O9/oBgXzD05K7biYAwnHjMI2abZ3YiuMY0Pg== +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" -kleur@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" - integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== +kleur@4.1.5, kleur@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -latest-version@5.1.0, latest-version@^5.1.0: +latest-version@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== dependencies: package-json "^6.3.0" -lerna@3.22.1: - version "3.22.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" - integrity sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg== - dependencies: - "@lerna/add" "3.21.0" - "@lerna/bootstrap" "3.21.0" - "@lerna/changed" "3.21.0" - "@lerna/clean" "3.21.0" - "@lerna/cli" "3.18.5" - "@lerna/create" "3.22.0" - "@lerna/diff" "3.21.0" - "@lerna/exec" "3.21.0" - "@lerna/import" "3.22.0" - "@lerna/info" "3.21.0" - "@lerna/init" "3.21.0" - "@lerna/link" "3.21.0" - "@lerna/list" "3.21.0" - "@lerna/publish" "3.22.1" - "@lerna/run" "3.21.0" - "@lerna/version" "3.22.1" - import-local "^2.0.0" - npmlog "^4.1.2" - -leven@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +lerna@7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.4.2.tgz#03497125d7b7c8d463eebfe17a701b16bde2ad09" + integrity sha512-gxavfzHfJ4JL30OvMunmlm4Anw7d7Tq6tdVHzUukLdS9nWnxCN/QB21qR+VJYp5tcyXogHKbdUEGh6qmeyzxSA== + dependencies: + "@lerna/child-process" "7.4.2" + "@lerna/create" "7.4.2" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-angular "7.0.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" + dedent "0.7.0" + envinfo "7.8.1" + execa "5.0.0" + fs-extra "^11.1.1" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + import-local "3.1.0" + ini "^1.3.8" + init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + jest-diff ">=29.4.3 < 30" + js-yaml "4.1.0" + libnpmaccess "7.0.2" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.5" + npmlog "^6.0.2" + nx ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-pipe "3.1.0" + p-queue "6.6.2" + p-reduce "2.1.0" + p-waterfall "2.1.1" + pacote "^15.2.0" + pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.8" + signal-exit "3.0.7" + slash "3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + typescript ">=3 < 6" + upath "2.0.1" + uuid "^9.0.0" + validate-npm-package-license "3.0.4" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" leven@^3.1.0: version "3.1.0" @@ -9454,50 +9147,54 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -libnpmconfig@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0" - integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA== +libnpmaccess@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== dependencies: - figgy-pudding "^3.5.1" - find-up "^3.0.0" - ini "^1.3.5" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + +libnpmpublish@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.3.0.tgz#2ceb2b36866d75a6cd7b4aa748808169f4d17e37" + integrity sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" + semver "^7.3.7" + sigstore "^1.4.0" + ssri "^10.0.1" lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lines-and-columns@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== -lint-staged@10.5.4: - version "10.5.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" - integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== dependencies: - chalk "^4.1.0" - cli-truncate "^2.1.0" - commander "^6.2.0" - cosmiconfig "^7.0.0" - debug "^4.2.0" - dedent "^0.7.0" - enquirer "^2.3.6" - execa "^4.1.0" - listr2 "^3.2.2" - log-symbols "^4.0.0" - micromatch "^4.0.2" - normalize-path "^3.0.0" - please-upgrade-node "^3.2.0" - string-argv "0.3.1" - stringify-object "^3.3.0" + uc.micro "^1.0.1" listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + integrity sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA== listr-update-renderer@^0.5.0: version "0.5.0" @@ -9523,19 +9220,6 @@ listr-verbose-renderer@^0.5.0: date-fns "^1.27.2" figures "^2.0.0" -listr2@^3.2.2: - version "3.12.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.12.1.tgz#75e515b86c66b60baf253542cc0dced6b60fedaf" - integrity sha512-oB1DlXlCzGPbvWhqYBZUQEPJKqsmebQWofXG6Mpbe3uIvoNl8mctBEojyF13ZyqwQ91clCWXpwsWp+t98K4FOQ== - dependencies: - cli-truncate "^2.1.0" - colorette "^1.4.0" - log-update "^4.0.0" - p-map "^4.0.0" - rxjs "^6.6.7" - through "^2.3.8" - wrap-ansi "^7.0.0" - listr@0.14.3: version "0.14.3" resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" @@ -9551,52 +9235,30 @@ listr@0.14.3: p-map "^2.0.0" rxjs "^6.3.3" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= +load-json-file@6.2.0, load-json-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" pify "^3.0.0" strip-bom "^3.0.0" -load-json-file@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - 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" - -load-json-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" - integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== - dependencies: - graceful-fs "^4.1.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.0" - -loader-utils@^1.1.0, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== +loader-utils@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -9610,7 +9272,7 @@ loady@~0.0.1, loady@~0.0.5: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -9637,30 +9299,20 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - lodash.clonedeep@4.5.0, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.get@4.4.2, lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.isfunction@^3.0.8, lodash.isfunction@~3.0.8: version "3.0.9" @@ -9670,54 +9322,29 @@ lodash.isfunction@^3.0.8, lodash.isfunction@~3.0.8: lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.isnumber@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.set@4.3.2, lodash.set@^4.3.2: +lodash.set@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.template@^4.0.2, lodash.template@^4.4.0, lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" + integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@4, lodash@4.x, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.7.0: +lodash@4, lodash@4.x, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9743,7 +9370,7 @@ log-process-errors@5.1.2: log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== dependencies: chalk "^1.0.0" @@ -9754,7 +9381,7 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -log-symbols@^4.0.0, log-symbols@^4.1.0: +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -9765,46 +9392,21 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== dependencies: ansi-escapes "^3.0.0" cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== long@~3: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" + integrity sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg== lowdb@1.0.0: version "1.0.0" @@ -9834,6 +9436,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -9848,57 +9455,69 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lunr@^2.3.9: version "2.3.9" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -macos-release@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2" - integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== - -madge@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/madge/-/madge-4.0.1.tgz#d6d7899a83b7aa86e07074bd8a718a232029bcb2" - integrity sha512-bcZDGa+cweRJ0XFCWaVlPTJKw2lB+EBBhUsBOqGv84jvlC6G1syKxCiS15+KBarwsVXNEtEEAs30r7EYn4ccNw== +madge@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/madge/-/madge-6.1.0.tgz#9835bb53f2e00d184914c2b007b50736a964d297" + integrity sha512-irWhT5RpFOc6lkzGHKLihonCVgM0YtfNUh4IrFeW3EqHpnt/JHUG3z26j8PeJEktCGB4tmGOOOJi1Rl/ACWucQ== dependencies: - chalk "^4.1.0" - commander "^6.2.1" + chalk "^4.1.1" + commander "^7.2.0" commondir "^1.0.1" - debug "^4.0.1" - dependency-tree "^8.0.0" - detective-amd "^3.0.1" - detective-cjs "^3.1.1" - detective-es6 "^2.1.0" + debug "^4.3.1" + dependency-tree "^9.0.0" + detective-amd "^4.0.1" + detective-cjs "^4.0.0" + detective-es6 "^3.0.0" detective-less "^1.0.2" - detective-postcss "^4.0.0" - detective-sass "^3.0.1" - detective-scss "^2.0.1" - detective-stylus "^1.0.0" - detective-typescript "^6.0.0" - graphviz "0.0.9" - ora "^5.1.0" + detective-postcss "^6.1.0" + detective-sass "^4.0.1" + detective-scss "^3.0.0" + detective-stylus "^2.0.1" + detective-typescript "^9.0.0" + ora "^5.4.1" pluralize "^8.0.0" - precinct "^7.0.0" - pretty-ms "^7.0.0" + precinct "^8.1.0" + pretty-ms "^7.0.1" rc "^1.2.7" - typescript "^3.9.5" + stream-to-array "^2.3.0" + ts-graphviz "^1.5.0" walkdir "^0.4.1" magic-string@^0.25.2, magic-string@^0.25.3, magic-string@^0.25.5, magic-string@^0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: - sourcemap-codec "^1.4.4" + sourcemap-codec "^1.4.8" -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== +magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== dependencies: - pify "^3.0.0" + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-dir@4.0.0, make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" make-dir@^2.1.0: version "2.1.0" @@ -9920,83 +9539,98 @@ make-error@1.x: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" - integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== - dependencies: - agentkeepalive "^3.4.1" - cacache "^12.0.0" - http-cache-semantics "^3.8.1" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - node-fetch-npm "^2.0.2" - promise-retry "^1.1.1" - socks-proxy-agent "^4.0.0" - ssri "^6.0.0" - -make-fetch-happen@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" + agentkeepalive "^4.2.1" + cacache "^16.1.0" http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" + lru-cache "^7.7.1" + minipass "^3.1.6" minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - negotiator "^0.6.2" + negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0, map-obj@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" - integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" -marked@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.3.tgz#d81ff0f9e29cef0a177327fe009b460f31aa5862" - integrity sha512-4oIDhVSQ2s+xNCfek9OnZgCQR/WykGCom02JzIIvi4Pme+MIwPYqvGVW8CQWOXeoZu0TtVB6pTxIuoLm+dKqDA== +markdown-it-anchor@^8.4.1: + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== + +markdown-it@^12.3.2: + version "12.3.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +marked@^4.0.10, marked@^4.0.16: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== md5.js@^1.3.4: version "1.3.5" @@ -10007,55 +9641,12 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - -meow@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== -meow@^8.0.0: +meow@^8.0.0, meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== @@ -10072,19 +9663,12 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -10114,24 +9698,24 @@ micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.2" + picomatch "^2.3.1" -mime-db@1.49.0, mime-db@1.x.x: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.52.0, mime-db@1.x.x: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.49.0" + mime-db "1.52.0" mimic-fn@^1.0.0: version "1.2.0" @@ -10148,16 +9732,16 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== - mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -10171,16 +9755,51 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.0, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0, minimist-options@^4.0.2: +minimatch@^5.0.1, minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" + integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== @@ -10189,18 +9808,10 @@ minimist-options@4.1.0, minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -10209,16 +9820,27 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-fetch@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" + integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== dependencies: - minipass "^3.1.0" + minipass "^7.0.3" minipass-sized "^1.0.3" - minizlib "^2.0.0" + minizlib "^2.1.2" optionalDependencies: - encoding "^0.1.12" + encoding "^0.1.13" minipass-flush@^1.0.5: version "1.0.5" @@ -10235,7 +9857,7 @@ minipass-json-stream@^1.0.1: jsonparse "^1.3.1" minipass "^3.0.0" -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: +minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== @@ -10249,29 +9871,29 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== -minizlib@^2.0.0, minizlib@^2.1.1: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -10279,22 +9901,6 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -10308,49 +9914,38 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.1, mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkpath@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91" - integrity sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE= - -modify-values@^1.0.0: +modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== module-definition@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-3.3.1.tgz#fedef71667713e36988b93d0626a4fe7b35aebfc" - integrity sha512-kLidGPwQ2yq484nSD+D3JoJp4Etc0Ox9P0L34Pu/cU4X4HcG7k7p62XI5BBuvURWMRX3RPyuhOcBHbKus+UH4A== + version "3.4.0" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-3.4.0.tgz#953a3861f65df5e43e80487df98bb35b70614c2b" + integrity sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA== dependencies: - ast-module-types "^2.7.1" + ast-module-types "^3.0.0" node-source-walk "^4.0.0" +module-definition@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-4.1.0.tgz#148ff9348e3401867229dcbe5947f4f6d5ccd3a2" + integrity sha512-rHXi/DpMcD2qcKbPCTklDbX9lBKJrUSl971TW5l6nMpqKCIlzJqmQ8cfEF5M923h2OOLHPDVlh5pJxNyV+AJlw== + dependencies: + ast-module-types "^4.0.0" + node-source-walk "^5.0.1" + module-details-from-path@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" - integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is= + integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== -module-lookup-amd@^7.0.0: +module-lookup-amd@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz#d67c1a93f2ff8e38b8774b99a638e9a4395774b2" integrity sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ== @@ -10370,46 +9965,29 @@ moize@^5.4.4: fast-stringify "^1.1.0" micro-memoize "^2.1.1" -moment-timezone@0.5.33, moment-timezone@^0.5.x: - version "0.5.33" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" - integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== - dependencies: - moment ">= 2.9.0" - -moment@2.29.1, "moment@>= 2.9.0", moment@>=2.14.0: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= +moment-timezone@0.5.44, moment-timezone@^0.5.x: + version "0.5.44" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.44.tgz#a64a4e47b68a43deeab5ae4eb4f82da77cdf595f" + integrity sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw== dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" + moment "^2.29.4" -mri@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" - integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== +moment@>=2.14.0, moment@^2.29.4: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -10417,24 +9995,14 @@ ms@^2.0.0, ms@^2.1.1: msgpack-lite@0.1.26: version "0.1.26" resolved "https://registry.yarnpkg.com/msgpack-lite/-/msgpack-lite-0.1.26.tgz#dd3c50b26f059f25e7edee3644418358e2a9ad89" - integrity sha1-3TxQsm8FnyXn7e42REGDWOKprYk= + integrity sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw== dependencies: event-lite "^0.1.1" ieee754 "^1.1.8" int64-buffer "^0.1.9" isarray "^1.0.0" -multimatch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" - integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== - dependencies: - array-differ "^2.0.3" - array-union "^1.0.2" - arrify "^1.0.1" - minimatch "^3.0.4" - -multimatch@^5.0.0: +multimatch@5.0.0, multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== @@ -10445,17 +10013,17 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mute-stream@0.0.8, mute-stream@~0.0.4: +mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mz@^2.4.0, mz@^2.5.0, mz@^2.7.0: +mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + +mz@^2.4.0, mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== @@ -10465,14 +10033,14 @@ mz@^2.4.0, mz@^2.5.0, mz@^2.7.0: thenify-all "^1.0.0" nan@^2.13.1, nan@^2.13.2: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nanoid@^3.1.23: - version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanomatch@1.2.13, nanomatch@^1.2.9: version "1.2.13" @@ -10499,60 +10067,52 @@ napi-build-utils@^1.0.1: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== natural-orderby@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== -negotiator@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== - -netmask@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" - integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= - -ngrok@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ngrok/-/ngrok-3.4.1.tgz#ee20a912831e68a7ac86a6576c21fadbd8458df7" - integrity sha512-OTm6Nmi6JINPbzkZff8ysA2WqMeNDg3sOPMFHW2CpatVD5yJxmX1qdyLq3QYNACTKNB3/K9jTkG4wUVpAFX9Dw== +ngrok@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/ngrok/-/ngrok-4.3.3.tgz#c51a1c4af2271ac3c9092ede3b0975caf7833217" + integrity sha512-a2KApnkiG5urRxBPdDf76nNBQTnNNWXU0nXw0SsqsPI+Kmt2lGf9TdVYpYrHMnC+T9KhcNSWjCpWqBgC6QcFvw== dependencies: "@types/node" "^8.10.50" - "@types/request" "^2.48.2" - decompress-zip "^0.3.2" - request "^2.88.0" - request-promise-native "^1.0.7" - uuid "^3.3.2" + extract-zip "^2.0.1" + got "^11.8.5" + lodash.clonedeep "^4.5.0" + uuid "^7.0.0 || ^8.0.0" + yaml "^1.10.0" + optionalDependencies: + hpagent "^0.1.2" nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^4.0.4: - version "4.1.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" - integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== +nise@^5.1.5: + version "5.1.7" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.7.tgz#03ca96539efb306612eb60a8c5d6beeb208e27e5" + integrity sha512-wWtNUhkT7k58uvWTB/Gy26eA/EJKtPZFVAhEilN5UYVmmGRYOURbejRUyKm0Uu9XVEW7K5nBOZfR8VMB4QR2RQ== dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^6.0.0" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/text-encoding" "^0.7.2" + just-extend "^6.2.0" + path-to-regexp "^6.2.1" no-case@^3.0.4: version "3.0.4" @@ -10562,33 +10122,32 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -nock@13.1.3: - version "13.1.3" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.1.3.tgz#110b005965654a8ffb798e87bad18b467bff15f9" - integrity sha512-YKj0rKQWMGiiIO+Y65Ut8OEgYM3PplLU2+GAhnPmqZdBd6z5IskgdBqWmjzA6lH3RF0S2a3wiAlrMOF5Iv2Jeg== +nock@13.5.1: + version "13.5.1" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.1.tgz#4e40f9877ad0d43b7cdb474261c190f3715dd806" + integrity sha512-+s7b73fzj5KnxbKH4Oaqz07tQ8degcMilU4rrmnKvI//b0JMBU4wEXFQ8zqr+3+L4eWSfU3H/UoIVGUV0tue1Q== dependencies: debug "^4.1.0" json-stringify-safe "^5.0.1" - lodash.set "^4.3.2" propagate "^2.0.0" -node-abi@^2.21.0: - version "2.30.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" - integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== +node-abi@^3.3.0: + version "3.54.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.54.0.tgz#f6386f7548817acac6434c6cba02999c9aebcc69" + integrity sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA== dependencies: - semver "^5.4.1" - -node-addon-api@*: - version "4.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.1.0.tgz#f1722f1f60793584632ffffb79e12ca042c48bd0" - integrity sha512-Zz1o1BDX2VtduiAt6kgiUl8jX1Vm3NMboljFYKQJ6ee8AGfiTvM2mlZFI3xPbqjs80rCQgiVJI/DjQ/1QJ0HwA== + semver "^7.3.5" -node-addon-api@^3.0.2: +node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + node-cache@5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" @@ -10596,67 +10155,56 @@ node-cache@5.1.2: dependencies: clone "2.x" -node-fetch-npm@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" - integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: - encoding "^0.1.11" - json-parse-better-errors "^1.0.0" - safe-buffer "^5.1.1" + whatwg-url "^5.0.0" -node-fetch@^2.5.0, node-fetch@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.2.tgz#986996818b73785e47b1965cc34eb093a1d464d0" - integrity sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA== +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" -node-forge@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp@^5.0.2: - version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" - integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.1.2" - request "^2.88.0" - rimraf "^2.6.3" - semver "^5.7.1" - tar "^4.4.12" - which "^1.3.1" +node-gyp-build@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== -node-gyp@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== +node-gyp@^9.0.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" + exponential-backoff "^3.1.1" glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" + semver "^7.3.5" + tar "^6.1.2" which "^2.0.2" node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== node-notifier@^8.0.0: version "8.0.2" @@ -10670,18 +10218,30 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.70, node-releases@^1.1.75: - version "1.1.75" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" - integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== +node-releases@^1.1.70: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== -node-source-walk@^4.0.0, node-source-walk@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.2.0.tgz#c2efe731ea8ba9c03c562aa0a9d984e54f27bc2c" - integrity sha512-hPs/QMe6zS94f5+jG3kk9E7TNm4P2SulrKiLWMzKszBfNZvL/V6wseHlTd7IvfW0NZWqPtK3+9yYNr+3USGteA== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +node-source-walk@^4.0.0, node-source-walk@^4.2.0, node-source-walk@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.3.0.tgz#8336b56cfed23ac5180fe98f1e3bb6b11fd5317c" + integrity sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA== dependencies: "@babel/parser" "^7.0.0" +node-source-walk@^5.0.0, node-source-walk@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-5.0.2.tgz#0eb439ce378946ce531e07a6a0073d06288396dd" + integrity sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA== + dependencies: + "@babel/parser" "^7.21.4" + nodejs-tail@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nodejs-tail/-/nodejs-tail-1.1.1.tgz#afae29b4a2a11f094b73d7956ff75b1e1bbe3b62" @@ -10689,36 +10249,14 @@ nodejs-tail@1.1.1: dependencies: chokidar "3.4.3" -nopt@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== dependencies: - abbrev "1" + abbrev "^1.0.0" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -10728,7 +10266,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: +normalize-package-data@^3.0.0, normalize-package-data@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== @@ -10738,10 +10276,20 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" @@ -10755,215 +10303,261 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -normalize-url@^6.0.1, normalize-url@^6.1.0: +normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-bundled@^1.0.1, npm-bundled@^1.1.1: +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +npm-bundled@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" -npm-check-updates@9.2.4: - version "9.2.4" - resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-9.2.4.tgz#53d35b62943fdee2bf30d546b6ae6f1b847148f9" - integrity sha512-YXEIqKXzxOhtPWg670+JAp/jPtjfTdaBJVGSlWL3eHbUDY4O80ELQNGO/qDy8oxh3pOrxSdII7vNglDf4FDw4w== +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== dependencies: - chalk "^4.1.0" - cint "^8.2.1" - cli-table "^0.3.1" - commander "^6.2.0" + npm-normalize-package-bin "^3.0.0" + +npm-check-updates@16.14.14: + version "16.14.14" + resolved "https://registry.yarnpkg.com/npm-check-updates/-/npm-check-updates-16.14.14.tgz#754ceec1a14c8e2d435807c6290dc08f9607dff3" + integrity sha512-Y3ajS/Ep40jM489rLBdz9jehn/BMil5s9fA4PSr2ZJxxSmtLWCSmRqsI2IEZ9Nb3MTMu8a3s7kBs0l+JbjdkTA== + dependencies: + chalk "^5.3.0" + cli-table3 "^0.6.3" + commander "^10.0.1" + fast-memoize "^2.5.2" find-up "5.0.0" + fp-and-or "^0.1.4" get-stdin "^8.0.0" + globby "^11.0.4" + hosted-git-info "^5.1.0" + ini "^4.1.1" + js-yaml "^4.1.0" json-parse-helpfulerror "^1.0.3" jsonlines "^0.1.1" - libnpmconfig "^1.2.1" - lodash "^4.17.20" + lodash "^4.17.21" + make-fetch-happen "^11.1.1" + minimatch "^9.0.3" p-map "^4.0.0" - pacote "^11.1.11" + pacote "15.2.0" parse-github-url "^1.0.2" progress "^2.0.3" - prompts "^2.4.0" - rc-config-loader "^3.0.0" + prompts-ncu "^3.0.0" + rc-config-loader "^4.1.3" remote-git-tags "^3.0.0" - rimraf "^3.0.2" - semver "^7.3.2" + rimraf "^5.0.5" + semver "^7.5.4" semver-utils "^1.1.4" - spawn-please "^0.4.1" - update-notifier "^5.0.0" - -npm-install-checks@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" - integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + source-map-support "^0.5.21" + spawn-please "^2.0.2" + strip-ansi "^7.1.0" + strip-json-comments "^5.0.1" + untildify "^4.0.0" + update-notifier "^6.0.2" + +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: semver "^7.1.1" -npm-lifecycle@^3.1.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" - integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== - dependencies: - byline "^5.0.0" - graceful-fs "^4.1.15" - node-gyp "^5.0.2" - resolve-from "^4.0.0" - slide "^1.1.6" - uid-number "0.0.6" - umask "^1.1.0" - which "^1.3.1" - -npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: +npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" - integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== - dependencies: - hosted-git-info "^2.7.1" - osenv "^0.1.5" - semver "^5.6.0" - validate-npm-package-name "^3.0.0" +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== -npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2: - version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" - integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== +npm-package-arg@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" + integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== dependencies: - hosted-git-info "^4.0.1" - semver "^7.3.4" + hosted-git-info "^3.0.6" + semver "^7.0.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" -npm-packlist@^2.1.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" - integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== +npm-packlist@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" + integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== dependencies: - glob "^7.1.6" - ignore-walk "^3.0.3" - npm-bundled "^1.1.1" + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" npm-normalize-package-bin "^1.0.1" -npm-pick-manifest@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" - integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw== +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== dependencies: - figgy-pudding "^3.5.1" - npm-package-arg "^6.0.0" - semver "^5.4.1" + ignore-walk "^6.0.0" -npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" - integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== +npm-pick-manifest@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== dependencies: - npm-install-checks "^4.0.0" - npm-normalize-package-bin "^1.0.1" - npm-package-arg "^8.1.2" - semver "^7.3.4" + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" -npm-registry-fetch@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" - integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== dependencies: - make-fetch-happen "^9.0.1" - minipass "^3.1.3" - minipass-fetch "^1.3.0" + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.0.1, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== +npmlog@^6.0.0, npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" -nsfw@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.1.2.tgz#4fa841e7f7122b60b2e1f61187d1b57ad3403428" - integrity sha512-zGPdt32aJ5b1laK9rvgXQmXGAagrx3VkcMt0JePtu6wBfzC1o4xLCM3kq7FxZxUnxyxYhODyBYzpt3H16FhaGA== +nsfw@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.4.tgz#4ed94544a63fc843b7e3ccff6668dce13d27a33a" + integrity sha512-sTRNa7VYAiy5ARP8etIBfkIfxU0METW40UinDnv0epQMe1pzj285HdXKRKkdrV3rRzMNcuNZn2foTNszV0x+OA== dependencies: - node-addon-api "*" + node-addon-api "^5.0.0" number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +nx@16.10.0, "nx@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.10.0.tgz#b070461f7de0a3d7988bd78558ea84cda3543ace" + integrity sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg== + dependencies: + "@nrwl/tao" "16.10.0" + "@parcel/watcher" "2.0.4" + "@yarnpkg/lockfile" "^1.1.0" + "@yarnpkg/parsers" "3.0.0-rc.46" + "@zkochan/js-yaml" "0.0.6" + axios "^1.0.0" + chalk "^4.1.0" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^8.0.1" + dotenv "~16.3.1" + dotenv-expand "~10.0.0" + enquirer "~2.3.6" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^11.1.0" + glob "7.1.4" + ignore "^5.0.4" + jest-diff "^29.4.1" + js-yaml "4.1.0" + jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" + minimatch "3.0.5" + node-machine-id "1.1.12" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.5.3" + string-width "^4.2.3" + strong-log-transformer "^2.1.0" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^4.1.2" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nx/nx-darwin-arm64" "16.10.0" + "@nx/nx-darwin-x64" "16.10.0" + "@nx/nx-freebsd-x64" "16.10.0" + "@nx/nx-linux-arm-gnueabihf" "16.10.0" + "@nx/nx-linux-arm64-gnu" "16.10.0" + "@nx/nx-linux-arm64-musl" "16.10.0" + "@nx/nx-linux-x64-gnu" "16.10.0" + "@nx/nx-linux-x64-musl" "16.10.0" + "@nx/nx-win32-arm64-msvc" "16.10.0" + "@nx/nx-win32-x64-msvc" "16.10.0" object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-path@^0.11.5: - version "0.11.7" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.7.tgz#5f211161f34bb395e4b13a5f565b79d933b6f65d" - integrity sha512-T4evaK9VfGGQskXBDILcn6F90ZD+WO3OwRFFQ2rmZdUH4vQeDBpiolTpVlPY2yj5xSepyILTjDyM6UvbbdHMZw== + version "0.11.8" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" + integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== object-treeify@^1.1.4: version "1.1.33" @@ -10973,73 +10567,51 @@ object-treeify@^1.1.4: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" -octokit-pagination-methods@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -onigasm@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/onigasm/-/onigasm-2.2.5.tgz#cc4d2a79a0fa0b64caec1f4c7ea367585a676892" - integrity sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA== +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: - lru-cache "^5.1.1" - -opencollective-postinstall@^2.0.2, opencollective-postinstall@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" optionator@^0.8.1: version "0.8.3" @@ -11054,16 +10626,16 @@ optionator@^0.8.1: word-wrap "~1.2.3" optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ora@4.1.1: version "4.1.1" @@ -11079,7 +10651,7 @@ ora@4.1.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ora@^5.1.0: +ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -11094,38 +10666,10 @@ ora@^5.1.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-name@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== - dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4, osenv@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-all@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" - integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== - dependencies: - p-map "^2.0.0" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-cancelable@^1.0.0: version "1.1.0" @@ -11137,29 +10681,20 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== -p-event@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-finally@^2.0.0: version "2.0.1" @@ -11190,7 +10725,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -11215,50 +10750,42 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" - integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= - dependencies: - p-reduce "^1.0.0" - -p-map@^2.0.0, p-map@^2.1.0: +p-map-series@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== -p-map@^4.0.0: +p-map@4.0.0, p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" -p-pipe@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" - integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-queue@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-4.0.0.tgz#ed0eee8798927ed6f2c2f5f5b77fdb2061a5d346" - integrity sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg== +p-pipe@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: - eventemitter3 "^3.1.0" + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-timeout@^3.1.0: +p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== @@ -11268,44 +10795,19 @@ p-timeout@^3.1.0: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -p-waterfall@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00" - integrity sha1-ftlLPOszMngjU69qrhGqn8I1uwA= - dependencies: - p-reduce "^1.0.0" - -pac-proxy-agent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad" - integrity sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ== - dependencies: - agent-base "^4.2.0" - debug "^4.1.1" - get-uri "^2.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^3.0.0" - pac-resolver "^3.0.0" - raw-body "^2.2.0" - socks-proxy-agent "^4.0.1" - -pac-resolver@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" - integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== +p-waterfall@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== dependencies: - co "^4.6.0" - degenerator "^1.0.4" - ip "^1.1.5" - netmask "^1.0.6" - thunkify "^2.1.2" + p-reduce "^2.0.0" package-json@^6.3.0: version "6.5.0" @@ -11317,44 +10819,44 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + packet-reader@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== -pacote@^11.1.11: - version "11.3.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" - integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== - dependencies: - "@npmcli/git" "^2.1.0" - "@npmcli/installed-package-contents" "^1.0.6" - "@npmcli/promise-spawn" "^1.2.0" - "@npmcli/run-script" "^1.8.2" - cacache "^15.0.5" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.3" - mkdirp "^1.0.3" - npm-package-arg "^8.0.1" - npm-packlist "^2.1.4" - npm-pick-manifest "^6.0.0" - npm-registry-fetch "^11.0.0" +pacote@15.2.0, pacote@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json-fast "^2.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.1.0" - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" parent-module@^1.0.0: version "1.0.1" @@ -11366,34 +10868,22 @@ parent-module@^1.0.0: parent-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" - integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= - -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= + integrity sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ== parse-github-url@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11408,25 +10898,24 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== -parse-path@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" - integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse-path@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" + integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - qs "^6.9.4" - query-string "^6.13.8" + protocols "^2.0.0" -parse-url@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d" - integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== +parse-url@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== dependencies: - is-ssh "^1.3.0" - normalize-url "^6.1.0" - parse-path "^4.0.0" - protocols "^1.4.0" + parse-path "^7.0.0" parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" @@ -11456,32 +10945,20 @@ pascal-case@^3.1.2: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== password-prompt@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.2.tgz#85b2f93896c5bd9e9f2d6ff0627fa5af3dc00923" - integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA== - dependencies: - ansi-escapes "^3.1.0" - cross-spawn "^6.0.5" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + version "1.1.3" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" + integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== dependencies: - pinkie-promise "^2.0.0" + ansi-escapes "^4.3.2" + cross-spawn "^7.0.3" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -11491,38 +10968,35 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== +path-scurry@^1.10.1, path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== dependencies: - isarray "0.0.1" + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" +path-to-regexp@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== path-type@^3.0.0: version "3.0.0" @@ -11547,35 +11021,40 @@ pbkdf2@^3.0.9: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -pg-connection-string@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" - integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== pg-cursor@^2.5.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/pg-cursor/-/pg-cursor-2.7.1.tgz#0c545b70006589537232986fa06c03a799d8f22b" - integrity sha512-dtxtyvx4BcSammddki27KPBVA0sZ8AguLabgs7++gqaefX7dlQ5zaRlk1Gi5mvyO25aCmHFAZyNq9zYtPDwFTA== + version "2.10.3" + resolved "https://registry.yarnpkg.com/pg-cursor/-/pg-cursor-2.10.3.tgz#4b44fbaede168a4785def56b8ac195e7df354472" + integrity sha512-rDyBVoqPVnx/PTmnwQAYgusSeAKlTL++gmpf5klVK+mYMFEqsOc6VHHZnPKc/4lOvr4r6fiMuoxSFuBF1dx4FQ== pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" - integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== -pg-protocol@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0" - integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== +pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== pg-query-stream@3.4.2: version "3.4.2" @@ -11595,107 +11074,120 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" - integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== +pg@8.11.3: + version "8.11.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" + integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" - pg-connection-string "^2.5.0" - pg-pool "^3.4.1" - pg-protocol "^1.5.0" + pg-connection-string "^2.6.2" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" pg-types "^2.1.0" pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" pgpass@1.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" - integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== dependencies: - split2 "^3.1.1" + split2 "^4.1.0" -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -pify@^2.0.0, pify@^2.3.0: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= +pino-abstract-transport@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz#083d98f966262164504afb989bccd05f665937a8" + integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA== dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + readable-stream "^4.0.0" + split2 "^4.0.0" -pino-pretty@4.8.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.8.0.tgz#f2f3055bf222456217b14ffb04d8be0a0cc17fce" - integrity sha512-mhQfHG4rw5ZFpWL44m0Utjo4GC2+HMfdNvxyA8lLw0sIqn6fCf7uQe6dPckUcW/obly+OQHD7B/MTso6LNizYw== - dependencies: - "@hapi/bourne" "^2.0.0" - args "^5.0.1" - chalk "^4.0.0" - dateformat "^4.5.1" - fast-safe-stringify "^2.0.7" - jmespath "^0.15.0" - joycon "^2.2.5" +pino-abstract-transport@v1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" + integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-pretty@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-9.1.1.tgz#e7d64c1db98266ca428ab56567b844ba780cd0e1" + integrity sha512-iJrnjgR4FWQIXZkUF48oNgoRI9BpyMhaEmihonHeCnZ6F50ZHAS4YGfGBT/ZVNsPmd+hzkIPGzjKdY08+/yAXw== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.0" + fast-safe-stringify "^2.1.1" + help-me "^4.0.1" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" pump "^3.0.0" - readable-stream "^3.6.0" - rfdc "^1.3.0" - split2 "^3.1.1" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^3.0.0" strip-json-comments "^3.1.1" -pino-std-serializers@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" - integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== - -pino@6.13.2: - version "6.13.2" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.13.2.tgz#948a0fcadca668f3b5fb8a427f2854b08661eccf" - integrity sha512-vmD/cabJ4xKqo9GVuAoAEeQhra8XJ7YydPV/JyIP+0zDtFTu5JSKdtt8eksGVWKtTSrNGcRrzJ4/IzvUWep3FA== - dependencies: - fast-redact "^3.0.0" - fast-safe-stringify "^2.0.8" - fastify-warning "^0.2.0" - flatstr "^1.0.12" - pino-std-serializers "^3.1.0" - quick-format-unescaped "^4.0.3" - sonic-boom "^1.0.2" +pino-std-serializers@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== +pino@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.7.0.tgz#58621608a3d8540ae643cdd9194cdd94130c78d9" + integrity sha512-l9sA5uPxmZzwydhMWUcm1gI0YxNnYl8MfSr2h8cwLvOAzQLBLewzF247h/vqHe3/tt6fgtXeG9wdjjoetdI/vA== dependencies: - node-modules-regexp "^1.0.0" + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.0.0 + pino-std-serializers "^6.0.0" + process-warning "^2.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.1.0" + thread-stream "^2.0.0" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" @@ -11704,13 +11196,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - platform@^1.3.3: version "1.3.6" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" @@ -11731,62 +11216,7 @@ pluralize@8.0.0, pluralize@^8.0.0: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-modules@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.2.2.tgz#5e7777c5a8964ea176919d90b2e54ef891321ce5" - integrity sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg== - dependencies: - generic-names "^2.0.1" - icss-replace-symbols "^1.1.0" - lodash.camelcase "^4.3.0" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - string-hash "^1.1.1" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss-values-parser@^2.0.1: version "2.0.1" @@ -11797,14 +11227,23 @@ postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^8.1.10, postcss@^8.1.7: - version "8.3.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" - integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== +postcss-values-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz#636edc5b86c953896f1bb0d7a7a6615df00fb76f" + integrity sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw== + dependencies: + color-name "^1.1.4" + is-url-superb "^4.0.0" + quote-unquote "^1.0.0" + +postcss@^8.1.7, postcss@^8.4.23, postcss@^8.4.33: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map-js "^0.6.2" + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" postgres-array@~2.0.0: version "2.0.0" @@ -11814,7 +11253,7 @@ postgres-array@~2.0.0: postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" - integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== postgres-date@~1.0.4: version "1.0.7" @@ -11828,54 +11267,34 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prebuild-install@^6.0.1: - version "6.1.4" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" - integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== +prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== dependencies: - detect-libc "^1.0.3" + detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" mkdirp-classic "^0.5.3" napi-build-utils "^1.0.1" - node-abi "^2.21.0" - npmlog "^4.0.1" + node-abi "^3.3.0" pump "^3.0.0" rc "^1.2.7" - simple-get "^3.0.3" + simple-get "^4.0.0" tar-fs "^2.0.0" tunnel-agent "^0.6.0" -precinct@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/precinct/-/precinct-7.1.0.tgz#a0311e0b59029647eaf57c2d30b8efa9c85d129a" - integrity sha512-I1RkW5PX51/q6Xl39//D7x9NgaKNGHpR5DCNaoxP/b2+KbzzXDNhauJUMV17KSYkJA41CSpwYUPRtRoNxbshWA== - dependencies: - commander "^2.20.3" - debug "^4.3.1" - detective-amd "^3.0.1" - detective-cjs "^3.1.1" - detective-es6 "^2.2.0" - detective-less "^1.0.2" - detective-postcss "^4.0.0" - detective-sass "^3.0.1" - detective-scss "^2.0.1" - detective-stylus "^1.0.0" - detective-typescript "^6.0.0" - module-definition "^3.3.1" - node-source-walk "^4.2.0" - -precinct@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/precinct/-/precinct-8.1.0.tgz#6b8f2389ba2ca61c466731390b0d7e25da3fd996" - integrity sha512-oeZBR9IdER42Ef6Rz11z1oOUqicsI5J1Qffj6tYghKLhxN2UnHy7uE1axxNr0VZRevPK2HWkROk36uXrbJwHFA== +precinct@^8.1.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-8.3.1.tgz#94b99b623df144eed1ce40e0801c86078466f0dc" + integrity sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q== dependencies: commander "^2.20.3" - debug "^4.3.1" - detective-amd "^3.0.1" + debug "^4.3.3" + detective-amd "^3.1.0" detective-cjs "^3.1.1" - detective-es6 "^2.2.0" + detective-es6 "^2.2.1" detective-less "^1.0.2" detective-postcss "^4.0.0" detective-sass "^3.0.1" @@ -11885,6 +11304,24 @@ precinct@^8.0.0: module-definition "^3.3.1" node-source-walk "^4.2.0" +precinct@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-9.2.1.tgz#db0a67abff7b0a9a3b2b1ac33d170e8a5fcac7b2" + integrity sha512-uzKHaTyiVejWW7VJtHInb9KBUq9yl9ojxXGujhjhDmPon2wgZPBKQIKR+6csGqSlUeGXAA4MEFnU6DesxZib+A== + dependencies: + "@dependents/detective-less" "^3.0.1" + commander "^9.5.0" + detective-amd "^4.1.0" + detective-cjs "^4.1.0" + detective-es6 "^3.0.1" + detective-postcss "^6.1.1" + detective-sass "^4.1.1" + detective-scss "^3.0.1" + detective-stylus "^3.0.0" + detective-typescript "^9.1.1" + module-definition "^4.1.0" + node-source-walk "^5.0.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -11893,12 +11330,12 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -11940,23 +11377,47 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-ms@7.0.1, pretty-ms@^7.0.0: +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-ms@7.0.1, pretty-ms@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== dependencies: parse-ms "^2.1.0" +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + process-es6@0.11.6: version "0.11.6" resolved "https://registry.yarnpkg.com/process-es6/-/process-es6-0.11.6.tgz#c6bb389f9a951f82bd4eb169600105bd2ff9c778" - integrity sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g= + integrity sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.3.2.tgz#70d8a3251aab0eafe3a595d8ae2c5d2277f096a5" + integrity sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -11965,15 +11426,7 @@ progress@^2.0.0, progress@^2.0.3: promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= - dependencies: - err-code "^1.0.0" - retry "^0.10.0" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" @@ -11983,6 +11436,14 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +prompts-ncu@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/prompts-ncu/-/prompts-ncu-3.0.0.tgz#716feb4874fca3dbe00af0f3de17a15d43d2228d" + integrity sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA== + dependencies: + kleur "^4.0.1" + sisteransi "^1.0.5" + prompts@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" @@ -11991,20 +11452,20 @@ prompts@2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prompts@^2.0.1, prompts@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== dependencies: - read "1" + read "^2.0.0" propagate@^2.0.0: version "2.0.1" @@ -12014,12 +11475,28 @@ propagate@^2.0.0: proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +protobufjs-cli@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.1.2.tgz#b32a7dc6aa3866cc103278539561bb4758249c8b" + integrity sha512-8ivXWxT39gZN4mm4ArQyJrRgnIwZqffBWoLDsE21TmMcKI3XwJMV4lEF2WU02C4JAtgYYc2SfJIltelD8to35g== + dependencies: + chalk "^4.0.0" + escodegen "^1.13.0" + espree "^9.0.0" + estraverse "^5.1.0" + glob "^8.0.0" + jsdoc "^4.0.0" + minimist "^1.2.0" + semver "^7.1.2" + tmp "^0.2.1" + uglify-js "^3.7.7" -protobufjs@6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.2.tgz#b9cb6bd8ec8f87514592ba3fdfd28e93f33a469b" - integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ== +protobufjs@7.2.6: + version "7.2.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" + integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -12031,45 +11508,23 @@ protobufjs@6.10.2: "@protobufjs/path" "^1.1.2" "@protobufjs/pool" "^1.1.0" "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" "^13.7.0" - long "^4.0.0" - -protocols@^1.1.0, protocols@^1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" - integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== + "@types/node" ">=13.7.0" + long "^5.0.0" -protoduck@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" - integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== - dependencies: - genfun "^5.0.0" - -proxy-agent@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.1.tgz#7e04e06bf36afa624a1540be247b47c970bd3014" - integrity sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw== - dependencies: - agent-base "^4.2.0" - debug "4" - http-proxy-agent "^2.1.0" - https-proxy-agent "^3.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^3.0.1" - proxy-from-env "^1.0.0" - socks-proxy-agent "^4.0.1" +protocols@^2.0.0, protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== -proxy-from-env@^1.0.0: +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@3.0.0, pump@^3.0.0: version "3.0.0" @@ -12079,39 +11534,31 @@ pump@3.0.0, pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pump@^2.0.0: +pumpify@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" + integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== dependencies: - duplexify "^3.6.0" + duplexify "^4.1.1" inherits "^2.0.3" - pump "^2.0.0" + pump "^3.0.0" punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== dependencies: - escape-goat "^2.0.0" + escape-goat "^4.0.0" -q@^1.1.2, q@^1.5.1: +q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== qqjs@^0.3.10: version "0.3.11" @@ -12132,34 +11579,17 @@ qqjs@^0.3.10: tmp "^0.1.0" write-json-file "^4.1.1" -qs@^6.9.4: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== +qs@6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-ast@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/query-ast/-/query-ast-1.0.4.tgz#efa832e1270cc3e0ab42291716f73a7de1928c2a" - integrity sha512-KFJFSvODCBjIH5HbHvITj9EEZKYUU6VX0T5CuB1ayvjUoUaZkKMi6eeby5Tf8DMukyZHlJQOE1+f3vevKUe6eg== - dependencies: - invariant "2.2.4" - -query-string@^6.13.8: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" @@ -12167,14 +11597,9 @@ queue-microtask@^1.2.2: integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-format-unescaped@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz#6d6b66b8207aa2b35eef12be1421bb24c428f652" - integrity sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg== - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== quick-lru@^4.0.1: version "4.0.1" @@ -12186,6 +11611,16 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +quote-unquote@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" + integrity sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg== + +randombytes@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" + integrity sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg== + randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -12193,39 +11628,29 @@ randombytes@^2.0.1, randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -randomstring@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.1.5.tgz#6df0628f75cbd5932930d9fe3ab4e956a18518c3" - integrity sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM= +randomstring@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.3.0.tgz#1bf9d730066899e70aee3285573f84708278683d" + integrity sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg== dependencies: - array-uniq "1.0.2" - -rate-limiter-flexible@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/rate-limiter-flexible/-/rate-limiter-flexible-1.3.2.tgz#2e2e8730f76bc3c349e9941d1826d40603bcca55" - integrity sha512-f+xNvGn+52G4nZVok9VB3LTE1kfDmqbnWKRayX5n2k/LEQ7doWrYvzmzFVh7ltmLgwEdEzoYwxGaXlfCjFg4Ag== + randombytes "2.0.3" -raw-body@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" +rate-limiter-flexible@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rate-limiter-flexible/-/rate-limiter-flexible-4.0.1.tgz#79b0ce111abe9c5da41d6fddf7cca93cedd3a8fc" + integrity sha512-2/dGHpDFpeA0+755oUkW+EKyklqLS9lu0go9pDsbhqQjZcxfRyJ6LA4JI0+HAdZ2bemD/oOjUeZQB2lCZqXQfQ== -rc-config-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-3.0.0.tgz#1484ed55d6fb8b21057699c8426370f7529c52a7" - integrity sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ== +rc-config-loader@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-4.1.3.tgz#1352986b8a2d8d96d6fd054a5bb19a60c576876a" + integrity sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w== dependencies: - debug "^4.1.1" - js-yaml "^3.12.0" - json5 "^2.1.1" + debug "^4.3.4" + js-yaml "^4.1.0" + json5 "^2.2.2" require-from-string "^2.0.2" -rc@^1.2.7, rc@^1.2.8: +rc@1.2.8, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -12245,59 +11670,45 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -read-cmd-shim@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" - integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA== - dependencies: - graceful-fs "^4.1.2" - -read-last-lines@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/read-last-lines/-/read-last-lines-1.8.0.tgz#4f94d4345ece7b8083ebb71c5fcdf60bd7afb9cc" - integrity sha512-oPL0cnZkhsO2xF7DBrdzVhXSNajPP5TzzCim/2IAjeGb17ArLLTRriI/ceV6Rook3L27mvbrOvLlf9xYYnaftQ== - dependencies: - mz "^2.7.0" +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -read-package-json-fast@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" +read-cmd-shim@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== -"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: - version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== +read-last-lines@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/read-last-lines/-/read-last-lines-1.8.0.tgz#4f94d4345ece7b8083ebb71c5fcdf60bd7afb9cc" + integrity sha512-oPL0cnZkhsO2xF7DBrdzVhXSNajPP5TzzCim/2IAjeGb17ArLLTRriI/ceV6Rook3L27mvbrOvLlf9xYYnaftQ== dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" + mz "^2.7.0" -read-package-tree@^5.1.6: - version "5.3.1" - resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" - integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - util-promisify "^2.1.0" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= +read-package-json@6.0.4, read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -12311,19 +11722,10 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -12339,17 +11741,37 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@1, read@~1.0.1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= +read@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== + dependencies: + mute-stream "~1.0.0" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== dependencies: - mute-stream "~0.0.4" + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" -"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -12359,36 +11781,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x, readable-stream@^1.1.8: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -"readable-stream@2 || 3", readable-stream@3, readable-stream@3.6.0, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdirp@^3.5.0, readdirp@~3.6.0: +readdirp@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== @@ -12402,21 +11795,10 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== redent@^3.0.0: version "3.0.0" @@ -12429,19 +11811,24 @@ redent@^3.0.0: redeyed@~2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== dependencies: esprima "~4.0.0" -reflect-metadata@0.1.13, reflect-metadata@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +reflect-metadata@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.1.tgz#8d5513c0f5ef2b4b9c3865287f3c0940c1f67f74" + integrity sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw== -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== +reflect-metadata@^0.1.13: + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -12450,15 +11837,15 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -12475,24 +11862,31 @@ regexpp@^3.0.0, regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== dependencies: - rc "^1.2.8" + rc "1.2.8" + +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" registry-url@^5.0.0: version "5.1.0" @@ -12501,15 +11895,17 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -12521,7 +11917,7 @@ remote-git-tags@^3.0.0: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== repeat-element@^1.1.2: version "1.1.4" @@ -12531,61 +11927,12 @@ repeat-element@^1.1.2: repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.0, request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -12593,13 +11940,13 @@ require-from-string@^2.0.2: integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-in-the-middle@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz#b768f800377b47526d026bbf5a7f727f16eb412f" - integrity sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz#4b71e3cc7f59977100af9beb76bf2d056a5a6de2" + integrity sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg== dependencies: debug "^4.1.1" module-details-from-path "^1.0.3" - resolve "^1.12.0" + resolve "^1.22.1" require-main-filename@^2.0.0: version "2.0.0" @@ -12609,7 +11956,7 @@ require-main-filename@^2.0.0: require-package-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" - integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= + integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== requirejs-config-file@^4.0.0: version "4.0.0" @@ -12624,18 +11971,23 @@ requirejs@^2.3.5: resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== -resolve-alpn@^1.0.0: +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +requizzle@^0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" + integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw== + dependencies: + lodash "^4.17.21" + +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -12648,16 +12000,19 @@ resolve-dependency-path@^2.0.0: resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz#11700e340717b865d216c66cabeb4a2a3c696736" integrity sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w== +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -12673,34 +12028,42 @@ resolve-global@1.0.0, resolve-global@^1.0.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.21.0, resolve@^1.22.1, resolve@^1.22.3: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: lowercase-keys "^2.0.0" +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -12718,39 +12081,43 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rimraf@5.0.5, rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== dependencies: - glob "^7.1.3" + glob "^9.2.0" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -12800,17 +12167,17 @@ rollup@2.18.0: optionalDependencies: fsevents "~2.1.2" -rotating-file-stream@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/rotating-file-stream/-/rotating-file-stream-2.1.5.tgz#6490d0a09e11dd4d441aa5d4d3676debed4a44e4" - integrity sha512-wnYazkT8oD5HXTj44WhB030aKo74OyICrPz/QKCUah59QD7Np4OhdoTC0WNZfhMx1ClsZp4lYMlAdof+DIkZ1Q== +rotating-file-stream@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/rotating-file-stream/-/rotating-file-stream-3.2.1.tgz#1d0a536d75884eedc3a677f5b0871fdc69f97d22" + integrity sha512-n2B18CJb+n2VA5Tdle+1NP2toEcRv68CjAOBjHmwcyswNwMVsrN3gVRZ9ymH3sapaiGY8jc9OhhV5b6I5rAeiA== rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: +run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -12822,21 +12189,21 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.1, rxjs@^6.6.7: +rxjs@^6.3.3, rxjs@^6.5.1: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@*, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -12849,11 +12216,16 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -12880,17 +12252,10 @@ sass-lookup@^3.0.0: dependencies: commander "^2.16.0" -sass@^1.29.0: - version "1.40.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.40.1.tgz#55d3fc38fe9dc579e7324ce0eb9185bede7992a9" - integrity sha512-M6WskYLzTfdZdb09W9SftIScjudL8jNkhdh9z96U+olQaKIcw2Knb6QLL9bUhnuSm4VD+1yJVaO2/ENDPMTtAQ== - dependencies: - chokidar ">=3.0.0 <4.0.0" - sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== saxes@^5.0.1: version "5.0.1" @@ -12908,62 +12273,62 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -scss-parser@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.5.tgz#2297d688a4c300e94552f72c41fd7de092d19c4b" - integrity sha512-RZOtvCmCnwkDo7kdcYBi807Y5EoTIxJ34AgEgJNDmOH1jl0/xG0FyYZFbH6Ga3Iwu7q8LSdxJ4C5UkzNXjQxKQ== - dependencies: - invariant "2.2.4" +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + +semaphore@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== dependencies: - semver "^6.3.0" - -semver-regex@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.3.tgz#b2bcc6f97f63269f286994e297e229b6245d0dc3" - integrity sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ== + semver "^7.3.5" semver-utils@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/semver-utils/-/semver-utils-1.1.4.tgz#cf0405e669a57488913909fc1c3f29bf2a4871e2" integrity sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA== -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@6.3.0, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@7.x, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +semver@7.5.4, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@~7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -12971,10 +12336,21 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -12986,11 +12362,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -13009,7 +12380,7 @@ shallow-clone@^3.0.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -13023,7 +12394,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -13035,13 +12406,13 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -shiki@^0.9.8: - version "0.9.11" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.9.11.tgz#07d75dab2abb6dc12a01f79a397cb1c391fa22d8" - integrity sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw== +shiki@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" + integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== dependencies: jsonc-parser "^3.0.0" - onigasm "^2.2.5" + vscode-oniguruma "^1.6.1" vscode-textmate "5.2.0" shimmer@^1.1.0, shimmer@^1.2.0: @@ -13058,65 +12429,72 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^1.3.0, sigstore@^1.4.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" + make-fetch-happen "^11.0.1" simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== -simple-get@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: - decompress-response "^4.2.0" + decompress-response "^6.0.0" once "^1.3.1" simple-concat "^1.0.0" -sinon@9.2.4: - version "9.2.4" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b" - integrity sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg== +sinon@17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.1.tgz#26b8ef719261bf8df43f925924cccc96748e407a" + integrity sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g== dependencies: - "@sinonjs/commons" "^1.8.1" - "@sinonjs/fake-timers" "^6.0.1" - "@sinonjs/samsam" "^5.3.1" - diff "^4.0.2" - nise "^4.0.4" - supports-color "^7.1.0" + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/samsam" "^8.0.0" + diff "^5.1.0" + nise "^5.1.5" + supports-color "^7.2.0" sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@3.0.0, slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" + integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== slice-ansi@^4.0.0: version "4.0.0" @@ -13127,12 +12505,7 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slide@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - -smart-buffer@^4.1.0: +smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -13167,58 +12540,34 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socks-proxy-agent@^4.0.0, socks-proxy-agent@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks-proxy-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.0.0.tgz#9f8749cdc05976505fa9f9a958b1818d0e60573b" - integrity sha512-FIgZbQWlnjVEQvMkylz64/rUggGtrKstPnx8OZyYFG0tAFR8CSBtpXxSwbFLHyeXFn/cunFL7MpuSOvDSOPo9g== +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== dependencies: agent-base "^6.0.2" - debug "^4.3.1" - socks "^2.6.1" - -socks@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" - integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== - dependencies: - ip "^1.1.5" - smart-buffer "^4.1.0" - -socks@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" - integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== - dependencies: - ip "1.1.5" - smart-buffer "^4.1.0" + debug "^4.3.3" + socks "^2.6.2" -sonic-boom@^1.0.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" - integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: - atomic-sleep "^1.0.0" - flatstr "^1.0.12" + ip "^2.0.0" + smart-buffer "^4.2.0" -sonic-boom@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.2.3.tgz#4b97146c4986481b5245aec371bde025415db532" - integrity sha512-dm32bzlBchhXoJZe0yLY/kdYsHtXhZphidIcCzJib1aEjfciZyvHJ3NjA1zh6jJCO/OBLfdjc5iw6jLS/Go2fg== +sonic-boom@^3.0.0, sonic-boom@^3.1.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.0.tgz#e442c5c23165df897d77c3c14ef3ca40dec66a66" + integrity sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA== dependencies: atomic-sleep "^1.0.0" sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" @@ -13229,10 +12578,10 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-resolve@^0.5.0: version "0.5.3" @@ -13245,10 +12594,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== +source-map-support@^0.5.21, source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -13261,40 +12610,42 @@ source-map-url@^0.4.0: source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -sourcemap-codec@^1.4.4: +sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -spawn-please@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-0.4.1.tgz#bd1ac03c7736a45c0bf3d0e7ab8b3169aef321d5" - integrity sha512-YJwFL/shPyY5fddOU1XXkShCDNVkMDGKsGlpB91FKOkRGa+pVAe+A5/CUUwLrZ3e89prqbTXaGapCzTlmc3HaA== +spawn-please@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/spawn-please/-/spawn-please-2.0.2.tgz#41912d82fe9504dd5a5424d2b4834e9a6cea56e0" + integrity sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw== + dependencies: + cross-spawn "^7.0.3" spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.4.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" + integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -13305,14 +12656,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" - integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -13321,21 +12667,19 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@3.2.2, split2@^3.0.0, split2@^3.1.1: +split2@4.2.0, split2@^4.0.0, split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +split2@^3.0.0, split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split@^1.0.0: +split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== @@ -13345,34 +12689,19 @@ split@^1.0.0: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.0, ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== dependencies: - figgy-pudding "^3.5.1" + minipass "^7.0.3" -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== +ssri@^9.0.0, ssri@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== dependencies: minipass "^3.1.1" @@ -13384,64 +12713,38 @@ stack-utils@^1.0.1: escape-string-regexp "^2.0.0" stack-utils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - steno@^0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" - integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs= + integrity sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w== dependencies: graceful-fs "^4.1.3" -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= - -string-argv@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== -string-hash@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= +stream-to-array@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + integrity sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA== + dependencies: + any-promise "^1.1.0" string-length@^4.0.1: version "4.0.2" @@ -13451,16 +12754,34 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -13477,43 +12798,22 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -13521,7 +12821,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-object@^3.2.1, stringify-object@^3.3.0: +stringify-object@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -13530,17 +12830,24 @@ stringify-object@^3.2.1, stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" @@ -13551,24 +12858,24 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -13578,25 +12885,13 @@ strip-bom@^4.0.0: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -13609,12 +12904,17 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" + integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strong-log-transformer@^2.0.0: +strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== @@ -13634,7 +12934,7 @@ stylus-lookup@^3.0.1: supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^5.3.0: version "5.5.0" @@ -13643,7 +12943,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -13658,13 +12958,18 @@ supports-color@^8.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -13676,16 +12981,15 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" - lodash.clonedeep "^4.5.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tapable@^2.2.0: version "2.2.1" @@ -13702,7 +13006,7 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" -tar-stream@^2.1.4: +tar-stream@^2.1.4, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -13713,7 +13017,7 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar@6.1.11, tar@^6.0.2, tar@^6.1.0: +tar@6.1.11: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== @@ -13725,40 +13029,22 @@ tar@6.1.11, tar@^6.0.2, tar@^6.1.0: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== +tar@6.2.0, tar@^6.1.11, tar@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" -temp-dir@^1.0.0: +temp-dir@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -temp-write@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" - integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= - dependencies: - graceful-fs "^4.1.2" - is-stream "^1.1.0" - make-dir "^1.0.0" - pify "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.0.1" - -temp@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.4.0.tgz#671ad63d57be0fe9d7294664b3fc400636678a60" - integrity sha1-ZxrWPVe+D+nXKUZks/xABjZnimA= + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== term-size@^2.1.0: version "2.2.1" @@ -13774,12 +13060,13 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser@^5.0.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.8.0.tgz#c6d352f91aed85cc6171ccb5e84655b77521d947" - integrity sha512-f0JH+6yMpneYcRJN314lZrSwu9eKkUFEHLN/kNy8ceh8gaRiLgFPJqrB9HsXjhEGdv4e/ekjTOFxIlL6xlma8A== + version "5.27.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" + integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" - source-map "~0.7.2" source-map-support "~0.5.20" test-exclude@^6.0.0: @@ -13799,12 +13086,12 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" @@ -13815,12 +13102,19 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +thread-stream@^2.0.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351" + integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== + dependencies: + real-require "^0.2.0" + throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -13828,14 +13122,6 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -13843,15 +13129,10 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunkify@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" - integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tiny-secp256k1@^1.1.3: version "1.1.6" @@ -13864,7 +13145,7 @@ tiny-secp256k1@^1.1.3: elliptic "^6.4.0" nan "^2.13.2" -tmp@0.2.1: +tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -13885,7 +13166,7 @@ tmp@^0.1.0: dependencies: rimraf "^2.6.3" -tmpl@1.0.x: +tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -13893,12 +13174,12 @@ tmpl@1.0.x: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" @@ -13910,7 +13191,7 @@ to-readable-stream@^1.0.0: to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -13932,41 +13213,15 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -touch@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d" - integrity sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0= - dependencies: - nopt "~1.0.10" - -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^2.1.0: version "2.1.0" @@ -13975,26 +13230,21 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +ts-graphviz@^1.5.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-1.8.1.tgz#5d95e58120be8b571847331516327d4840cc44f7" + integrity sha512-54/fe5iu0Jb6X0pmDmzsA2UHLfyHjUEUwfHtZcEOR0fZ6Myf+dFoO6eNsyL8CBDMJ9u7WWEewduVaiaXlvjSVw== + ts-jest@26.5.6: version "26.5.6" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" @@ -14011,20 +13261,39 @@ ts-jest@26.5.6: semver "7.x" yargs-parser "20.x" +tsconfig-paths@^3.10.1: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.1, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" @@ -14033,18 +13302,22 @@ tsutils@^3.17.1, tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -14055,7 +13328,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -14069,11 +13342,6 @@ type-fest@0.21.3, type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - type-fest@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.17.0.tgz#268bb55d38701ce3915f60a4367a1e9f28672deb" @@ -14089,10 +13357,10 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== type-fest@^0.6.0: version "0.6.0" @@ -14104,6 +13372,16 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + typechecker@^6.2.0: version "6.4.0" resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-6.4.0.tgz#c087dc744c5a0f17524d58a17eb31a9660ab7324" @@ -14124,26 +13402,18 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typedoc-default-themes@^0.12.10: - version "0.12.10" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz#614c4222fe642657f37693ea62cad4dafeddf843" - integrity sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA== + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typedoc@0.21.9: - version "0.21.9" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.21.9.tgz#6fbdc7152024a00f03af53a0ca40f44e91f0f129" - integrity sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA== +typedoc@0.22.17: + version "0.22.17" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.17.tgz#bc51cc95f569040112504300831cdac4f8089b7b" + integrity sha512-h6+uXHVVCPDaANzjwzdsj9aePBjZiBTpiMpBBeyh1zcN2odVsDCNajz8zyKnixF93HJeGpl34j/70yoEE5BfNg== dependencies: - glob "^7.1.7" - handlebars "^4.7.7" + glob "^8.0.3" lunr "^2.3.9" - marked "^3.0.2" - minimatch "^3.0.0" - progress "^2.0.3" - shiki "^0.9.8" - typedoc-default-themes "^0.12.10" + marked "^4.0.16" + minimatch "^5.1.0" + shiki "^0.10.1" typeforce@^1.11.5: version "1.18.0" @@ -14171,16 +13441,26 @@ typeorm@0.2.25: yargonaut "^1.1.2" yargs "^13.2.1" -typescript@3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +typescript@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.6.tgz#1becd85d77567c3c741172339e93ce2e69932138" + integrity sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow== -typescript@^3.9.5, typescript@^3.9.7: +"typescript@>=3 < 6": + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +typescript@^3.9.10, typescript@^3.9.7: version "3.9.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== +typescript@^4.0.0, typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + typesync@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/typesync/-/typesync-0.8.0.tgz#695e8f2b36109f6cf4b8a5d9dbcfca1e3afa455c" @@ -14196,34 +13476,29 @@ typesync@0.8.0: semver "^7.3.2" ua-parser-js@^0.7.27: - version "0.7.28" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" - integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + version "0.7.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832" + integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA== -uglify-js@^3.1.4: - version "3.14.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" - integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -uid-number@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= +uglify-js@^3.1.4, uglify-js@^3.7.7: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== -umask@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= +underscore@~1.13.2: + version "1.13.6" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -14238,15 +13513,15 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== union-value@^1.0.0: version "1.0.1" @@ -14261,88 +13536,108 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: - unique-slug "^2.0.0" + unique-slug "^3.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: imurmurhash "^0.1.4" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== dependencies: - crypto-random-string "^2.0.0" + imurmurhash "^0.1.4" -universal-user-agent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" - integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: - os-name "^3.1.0" + crypto-random-string "^4.0.0" universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== -update-notifier@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== +upath@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" uri-js@^4.2.2: version "4.4.1" @@ -14354,31 +13649,32 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util-promisify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= - dependencies: - object.getownpropertydescriptors "^2.0.3" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@0.12.4: version "0.12.4" @@ -14392,21 +13688,31 @@ util@0.12.4: safe-buffer "^5.1.2" which-typed-array "^1.1.2" -uuid@8.3.2, uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@9.0.1, uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.0.3: +"uuid@^7.0.0 || ^8.0.0", uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +v8-compile-cache@^2.0.3: + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + v8-to-istanbul@^7.0.0: version "7.1.2" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" @@ -14416,7 +13722,7 @@ v8-to-istanbul@^7.0.0: convert-source-map "^1.6.0" source-map "^0.7.3" -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: +validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -14424,21 +13730,24 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@5.0.0, validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" +vscode-oniguruma@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@5.2.0: version "5.2.0" @@ -14465,23 +13774,23 @@ walkdir@^0.4.1: integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - makeerror "1.0.x" + makeerror "1.0.12" wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" @@ -14505,14 +13814,13 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + tr46 "~0.0.3" + webidl-conversions "^3.0.0" whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" @@ -14523,40 +13831,23 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: tr46 "^2.1.0" webidl-conversions "^6.1.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== +which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" -which@^1.2.9, which@^1.3.1: +which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -14570,12 +13861,19 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" widest-line@^3.1.0: version "3.1.0" @@ -14584,44 +13882,44 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + wif@2.0.6, wif@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" - integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ= + integrity sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ== dependencies: bs58check "<3.0.0" -windows-release@^3.1.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" - integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== - dependencies: - execa "^1.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - -wrap-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131" - integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg== + integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== dependencies: - ansi-styles "^3.2.0" string-width "^2.1.1" strip-ansi "^4.0.0" @@ -14634,7 +13932,7 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -14652,12 +13950,29 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" -write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: +write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -14666,7 +13981,7 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -14676,18 +13991,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-json-file@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" - integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= - dependencies: - detect-indent "^5.0.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - pify "^3.0.0" - sort-keys "^2.0.0" - write-file-atomic "^2.0.0" - write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" @@ -14712,35 +14015,34 @@ write-json-file@^4.1.1: sort-keys "^4.0.0" write-file-atomic "^3.0.0" -write-pkg@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" - integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== +write-pkg@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== dependencies: sort-keys "^2.0.0" - write-json-file "^2.2.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" -ws@7.5.5, ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== +ws@7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^6.0.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xcase@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xcase/-/xcase-2.0.1.tgz#c7fa72caa0f440db78fd5673432038ac984450b9" - integrity sha1-x/pyyqD0QNt4/VZzQyA4rJhEULk= + integrity sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw== -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== xml-name-validator@^3.0.0: version "3.0.0" @@ -14765,16 +14067,21 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= +xmlcreate@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== xstate@4.23.4: version "4.23.4" resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.23.4.tgz#b894205ac46bb3acc09755907d3e57c81c86e80e" integrity sha512-lWaUvyrd0HGhosyKnf8i9wBlszVaS+/uIs0EfnuPYNsZIh1BW9ed4bZ64P57wVYk2uln7v3u+Mv98FC+r8xrxQ== +xstate@4.38.3: + version "4.38.3" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.3.tgz#4e15e7ad3aa0ca1eea2010548a5379966d8f1075" + integrity sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -14790,7 +14097,7 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -14814,11 +14121,21 @@ yargonaut@^1.1.2: figlet "^1.1.1" parent-require "^1.0.0" -yargs-parser@20.2.9, yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@21.1.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -14827,15 +14144,7 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^15.0.1: - version "15.0.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" - integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2, yargs-parser@^18.1.3: +yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -14843,6 +14152,19 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs@16.2.0, yargs@^16.0.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^13.2.1: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -14859,23 +14181,6 @@ yargs@^13.2.1: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^14.2.2: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" - yargs@^15.1.0, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -14893,18 +14198,26 @@ yargs@^15.1.0, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.0.0, yargs@^16.1.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.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.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yocto-queue@^0.1.0: version "0.1.0"