From fb28d0e3ed022bd724dcc178afad1660f4225957 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 10:32:52 +1100 Subject: [PATCH 01/21] chore: up deps; tsconfig --- .github/workflows/verify.yml | 52 +- biome.json | 24 +- package.json | 29 +- pnpm-lock.yaml | 1861 ++++++--------------------------- src/README.md | 96 -- src/exports/index.ts | 4 +- src/exports/instances.test.ts | 2 - src/exports/instances.ts | 10 +- src/exports/processes.ts | 2 +- src/instance.ts | 4 +- src/instances/alto.test.ts | 4 +- src/instances/anvil.test.ts | 2 +- src/instances/rundler.test.ts | 22 +- src/instances/rundler.ts | 506 ++++----- src/instances/silius.test.ts | 108 -- src/instances/silius.ts | 347 ------ src/instances/stackup.test.ts | 106 -- src/instances/stackup.ts | 162 --- src/package.json | 7 +- src/pool.test.ts | 8 +- src/pool.ts | 7 +- src/processes/execa.test.ts | 9 +- src/processes/execa.ts | 2 +- src/server.test.ts | 89 +- src/server.ts | 2 +- src/utils.test.ts | 12 +- src/utils.ts | 2 +- test/utils.ts | 29 +- tsconfig.base.json | 43 - tsconfig.build.json | 16 - tsconfig.json | 41 +- 31 files changed, 695 insertions(+), 2913 deletions(-) delete mode 100644 src/instances/silius.test.ts delete mode 100644 src/instances/silius.ts delete mode 100644 src/instances/stackup.test.ts delete mode 100644 src/instances/stackup.ts delete mode 100644 tsconfig.base.json delete mode 100644 tsconfig.build.json diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 067c0fc..03f70e7 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -48,37 +48,31 @@ jobs: - name: Check types run: pnpm typecheck - # test: - # name: Test - # runs-on: ubuntu-latest - # steps: - # - name: Clone repository - # uses: actions/checkout@v4 + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone repository + uses: actions/checkout@v4 - # - name: Install dependencies - # uses: wevm/actions/.github/actions/pnpm@main - # with: - # node-version: 22 + - name: Install dependencies + uses: wevm/actions/.github/actions/pnpm@main + with: + node-version: 22 - # - name: Set up Foundry - # uses: foundry-rs/foundry-toolchain@v1 + - name: Set up Foundry + uses: foundry-rs/foundry-toolchain@v1 - # - name: Set up Rundler - # uses: jaxxstorm/action-install-gh-release@v1.12.0 - # with: - # repo: alchemyplatform/rundler - # platform: linux + - name: Set up Rundler + uses: jaxxstorm/action-install-gh-release@v1.12.0 + with: + repo: alchemyplatform/rundler + platform: linux - # - name: Set up Docker - # uses: docker/setup-docker-action@v4 - - # - name: Pull Silius - # run: docker pull ghcr.io/silius-rs/silius:latest - - # - name: Pull Stackup - # run: docker pull stackupwallet/stackup-bundler:latest + - name: Set up Docker + uses: docker/setup-docker-action@v4 - # - name: Run tests - # run: pnpm test - # env: - # VITE_FORK_URL: ${{ secrets.VITE_FORK_URL }} + - name: Run tests + run: pnpm test + env: + VITE_FORK_URL: ${{ secrets.VITE_FORK_URL }} diff --git a/biome.json b/biome.json index f0293ad..c311831 100644 --- a/biome.json +++ b/biome.json @@ -1,17 +1,16 @@ { - "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.8/schema.json", "files": { - "ignore": [ - "coverage", - "node_modules", - "src/_lib", - "tsconfig.json", - "tsconfig.*.json" + "includes": [ + "**", + "!**/coverage", + "!**/node_modules", + "!**/src/_lib", + "!**/tsconfig.json", + "!**/tsconfig.*.json" ] }, - "organizeImports": { - "enabled": true - }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, "formatter": { "enabled": true, "indentStyle": "space", @@ -22,7 +21,8 @@ "rules": { "recommended": true, "complexity": { - "noBannedTypes": "off" + "noBannedTypes": "off", + "useLiteralKeys": "off" }, "style": { "noNonNullAssertion": "off" @@ -36,7 +36,7 @@ "javascript": { "formatter": { "quoteStyle": "single", - "trailingComma": "all", + "trailingCommas": "all", "semicolons": "asNeeded" } } diff --git a/package.json b/package.json index 8b2940c..865f457 100644 --- a/package.json +++ b/package.json @@ -6,27 +6,24 @@ "changeset": "changeset", "changeset:release": "pnpm build && changeset publish", "changeset:version": "changeset version && pnpm install --lockfile-only && pnpm format", - "clean": "rimraf src/_lib src/tsconfig.build.tsbuildinfo", - "format": "biome format . --write", - "lint": "biome check . --apply", - "postinstall": "pnpm build", + "check": "biome check .", + "check:types": "tsc --noEmit", + "clean": "rm -rf src/_lib src/tsconfig.build.tsbuildinfo", "test": "vitest --testTimeout 10000", - "test:cov": "vitest --coverage", - "typecheck": "tsc --noEmit" + "test:cov": "vitest --coverage" }, "devDependencies": { - "@biomejs/biome": "^1.7.3", - "@changesets/changelog-github": "^0.5.0", - "@changesets/cli": "^2.27.3", + "@biomejs/biome": "^2.3.8", + "@changesets/changelog-github": "^0.5.2", + "@changesets/cli": "^2.29.8", "@pimlico/alto": "0.0.15", - "@types/http-proxy": "^1.17.14", - "@types/node": "^20.14.0", - "@types/ws": "^8.5.10", + "@types/http-proxy": "^1.17.17", + "@types/node": "^24.10.2", + "@types/ws": "^8.18.1", "@vitest/coverage-v8": "^1.6.0", - "rimraf": "^5.0.7", - "typescript": "^5.4.5", + "typescript": "^5.9.3", "vitest": "^1.6.0", - "ws": "^8.17.0" + "ws": "^8.18.3" }, - "packageManager": "pnpm@9.1.0" + "packageManager": "pnpm@10.25.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84146b3..909c791 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,41 +9,38 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: ^1.7.3 - version: 1.7.3 + specifier: ^2.3.8 + version: 2.3.8 '@changesets/changelog-github': - specifier: ^0.5.0 - version: 0.5.0 + specifier: ^0.5.2 + version: 0.5.2 '@changesets/cli': - specifier: ^2.27.3 - version: 2.27.3 + specifier: ^2.29.8 + version: 2.29.8(@types/node@24.10.2) '@pimlico/alto': specifier: 0.0.15 - version: 0.0.15(typescript@5.4.5) + version: 0.0.15(typescript@5.9.3) '@types/http-proxy': - specifier: ^1.17.14 - version: 1.17.14 + specifier: ^1.17.17 + version: 1.17.17 '@types/node': - specifier: ^20.14.0 - version: 20.14.0 + specifier: ^24.10.2 + version: 24.10.2 '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 + specifier: ^8.18.1 + version: 8.18.1 '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.14.0)) - rimraf: - specifier: ^5.0.7 - version: 5.0.7 + version: 1.6.0(vitest@1.6.0(@types/node@24.10.2)) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.0) + version: 1.6.0(@types/node@24.10.2) ws: - specifier: ^8.17.0 - version: 8.17.0 + specifier: ^8.18.3 + version: 8.18.3 src: dependencies: @@ -75,26 +72,14 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.6': resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.6': resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.24.6': resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} engines: {node: '>=6.0.0'} @@ -111,116 +96,119 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@1.7.3': - resolution: {integrity: sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==} + '@biomejs/biome@2.3.8': + resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.7.3': - resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} + '@biomejs/cli-darwin-arm64@2.3.8': + resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.7.3': - resolution: {integrity: sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==} + '@biomejs/cli-darwin-x64@2.3.8': + resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.7.3': - resolution: {integrity: sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==} + '@biomejs/cli-linux-arm64-musl@2.3.8': + resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.7.3': - resolution: {integrity: sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==} + '@biomejs/cli-linux-arm64@2.3.8': + resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.7.3': - resolution: {integrity: sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==} + '@biomejs/cli-linux-x64-musl@2.3.8': + resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.7.3': - resolution: {integrity: sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==} + '@biomejs/cli-linux-x64@2.3.8': + resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.7.3': - resolution: {integrity: sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==} + '@biomejs/cli-win32-arm64@2.3.8': + resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.7.3': - resolution: {integrity: sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==} + '@biomejs/cli-win32-x64@2.3.8': + resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - '@changesets/apply-release-plan@7.0.1': - resolution: {integrity: sha512-aPdSq/R++HOyfEeBGjEe6LNG8gs0KMSyRETD/J2092OkNq8mOioAxyKjMbvVUdzgr/HTawzMOz7lfw339KnsCA==} + '@changesets/apply-release-plan@7.0.14': + resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} - '@changesets/assemble-release-plan@6.0.0': - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/changelog-github@0.5.0': - resolution: {integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==} + '@changesets/changelog-github@0.5.2': + resolution: {integrity: sha512-HeGeDl8HaIGj9fQHo/tv5XKQ2SNEi9+9yl1Bss1jttPqeiASRXhfi0A2wv8yFKCp07kR1gpOI5ge6+CWNm1jPw==} - '@changesets/cli@2.27.3': - resolution: {integrity: sha512-ve/VpWApILlSs8cr0okNx5C2LKRawI9XZgvfmf58S8sar2nhx5DPJREFXYZBahs0FeTfvH0rdVl+nGe8QF45Ig==} + '@changesets/cli@2.29.8': + resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} hasBin: true - '@changesets/config@3.0.0': - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.1.2': + resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.0.0': - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-github-info@0.6.0': - resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + '@changesets/get-github-info@0.7.0': + resolution: {integrity: sha512-+i67Bmhfj9V4KfDeS1+Tz3iF32btKZB2AAx+cYMqDSRFP7r3/ZdGbjCo+c6qkyViN9ygDuBjzageuPGJtKGe5A==} - '@changesets/get-release-plan@4.0.0': - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.14': + resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.1': - resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} @@ -384,6 +372,15 @@ packages: engines: {node: '>=6'} hasBin: true + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -843,11 +840,8 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/http-proxy@1.17.14': - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -855,14 +849,8 @@ packages: '@types/node@18.19.34': resolution: {integrity: sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==} - '@types/node@20.14.0': - resolution: {integrity: sha512-5cHBxFGJx6L4s56Bubp4fglrEpmyJypsqI6RgzMfBHWUJQGWAAi8cWcgetEbZXHYXo9C2Fa4EEds/uSyS4cxmA==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/node@24.10.2': + resolution: {integrity: sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==} '@types/shimmer@1.0.5': resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} @@ -870,8 +858,8 @@ packages: '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@vitest/coverage-v8@1.6.0': resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} @@ -966,10 +954,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -985,26 +969,13 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -1015,10 +986,6 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - avvio@8.3.2: resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} @@ -1045,9 +1012,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1059,35 +1023,15 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -1103,31 +1047,18 @@ packages: cjs-module-lexer@1.3.1: resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1148,37 +1079,13 @@ packages: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - - csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - - csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - - csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -1195,29 +1102,10 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -1265,36 +1153,6 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -1304,10 +1162,6 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -1341,10 +1195,6 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-content-type-parse@1.1.0: resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} @@ -1402,13 +1252,6 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -1418,9 +1261,6 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -1448,13 +1288,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1462,10 +1295,6 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -1482,10 +1311,6 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1499,53 +1324,17 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1553,9 +1342,6 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -1563,8 +1349,9 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} @@ -1574,8 +1361,8 @@ packages: resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} engines: {node: '>=18.18.0'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -1594,10 +1381,6 @@ packages: import-in-the-middle@1.7.1: resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1605,10 +1388,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - ioredis@5.6.0: resolution: {integrity: sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==} engines: {node: '>=12.22.0'} @@ -1617,35 +1396,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1658,34 +1411,14 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1694,36 +1427,18 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@2.0.0: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1756,9 +1471,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} @@ -1766,8 +1478,9 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true json-schema-ref-resolver@1.0.1: resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} @@ -1778,27 +1491,12 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} light-my-request@5.13.0: resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -1810,10 +1508,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -1842,9 +1536,6 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - luxon@3.6.1: resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} @@ -1859,18 +1550,6 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1882,14 +1561,14 @@ packages: resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1897,10 +1576,6 @@ packages: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1912,10 +1587,6 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} - mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -1927,6 +1598,10 @@ packages: module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1955,24 +1630,10 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -1990,10 +1651,6 @@ packages: peerDependencies: '@opentelemetry/api': ^1.6.0 - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -2013,10 +1670,6 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-limit@5.0.0: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} @@ -2025,10 +1678,6 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -2037,9 +1686,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} @@ -2081,6 +1729,13 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} @@ -2113,25 +1768,13 @@ packages: resolution: {integrity: sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==} hasBin: true - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - pkg-types@1.1.1: resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -2164,9 +1807,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -2174,27 +1814,18 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -2211,10 +1842,6 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -2226,10 +1853,6 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2242,9 +1865,6 @@ packages: resolution: {integrity: sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==} engines: {node: '>=8.6.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -2280,17 +1900,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex2@3.1.0: resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} @@ -2304,41 +1916,18 @@ packages: secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@7.6.2: resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -2346,16 +1935,9 @@ packages: shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2364,11 +1946,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} @@ -2379,20 +1956,8 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} @@ -2413,9 +1978,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2424,17 +1986,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2458,10 +2009,6 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2469,10 +2016,6 @@ packages: strip-literal@2.1.0: resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2513,10 +2056,6 @@ packages: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -2532,68 +2071,31 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@4.39.0: resolution: {integrity: sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==} engines: {node: '>=16'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2608,9 +2110,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - viem@2.24.3: resolution: {integrity: sha512-FAoW0hqqpGOlZvfL6GbizDNUd6ZvUyNYYF8HouXbGATrO0RLLh28MOElFNF63hg++uZi2R/EcISs0bvY185z8g==} peerDependencies: @@ -2677,33 +2176,12 @@ packages: jsdom: optional: true - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2714,10 +2192,6 @@ packages: engines: {node: '>=8'} hasBin: true - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2729,8 +2203,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2741,8 +2215,8 @@ packages: utf-8-validate: optional: true - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2753,40 +2227,22 @@ packages: utf-8-validate: optional: true - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} @@ -2813,24 +2269,10 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.2': - dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.1 - '@babel/helper-string-parser@7.24.6': {} - '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-identifier@7.24.6': {} - '@babel/highlight@7.24.5': - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - '@babel/parser@7.24.6': dependencies: '@babel/types': 7.24.6 @@ -2847,48 +2289,48 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@1.7.3': + '@biomejs/biome@2.3.8': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.7.3 - '@biomejs/cli-darwin-x64': 1.7.3 - '@biomejs/cli-linux-arm64': 1.7.3 - '@biomejs/cli-linux-arm64-musl': 1.7.3 - '@biomejs/cli-linux-x64': 1.7.3 - '@biomejs/cli-linux-x64-musl': 1.7.3 - '@biomejs/cli-win32-arm64': 1.7.3 - '@biomejs/cli-win32-x64': 1.7.3 - - '@biomejs/cli-darwin-arm64@1.7.3': + '@biomejs/cli-darwin-arm64': 2.3.8 + '@biomejs/cli-darwin-x64': 2.3.8 + '@biomejs/cli-linux-arm64': 2.3.8 + '@biomejs/cli-linux-arm64-musl': 2.3.8 + '@biomejs/cli-linux-x64': 2.3.8 + '@biomejs/cli-linux-x64-musl': 2.3.8 + '@biomejs/cli-win32-arm64': 2.3.8 + '@biomejs/cli-win32-x64': 2.3.8 + + '@biomejs/cli-darwin-arm64@2.3.8': optional: true - '@biomejs/cli-darwin-x64@1.7.3': + '@biomejs/cli-darwin-x64@2.3.8': optional: true - '@biomejs/cli-linux-arm64-musl@1.7.3': + '@biomejs/cli-linux-arm64-musl@2.3.8': optional: true - '@biomejs/cli-linux-arm64@1.7.3': + '@biomejs/cli-linux-arm64@2.3.8': optional: true - '@biomejs/cli-linux-x64-musl@1.7.3': + '@biomejs/cli-linux-x64-musl@2.3.8': optional: true - '@biomejs/cli-linux-x64@1.7.3': + '@biomejs/cli-linux-x64@2.3.8': optional: true - '@biomejs/cli-win32-arm64@1.7.3': + '@biomejs/cli-win32-arm64@2.3.8': optional: true - '@biomejs/cli-win32-x64@1.7.3': + '@biomejs/cli-win32-x64@2.3.8': optional: true - '@changesets/apply-release-plan@7.0.1': + '@changesets/apply-release-plan@7.0.14': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/config': 3.0.0 + '@changesets/config': 3.1.2 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/types': 6.0.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -2898,151 +2340,147 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.2 - '@changesets/assemble-release-plan@6.0.0': + '@changesets/assemble-release-plan@6.0.9': dependencies: - '@babel/runtime': 7.24.5 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.2 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/changelog-github@0.5.0': + '@changesets/changelog-github@0.5.2': dependencies: - '@changesets/get-github-info': 0.6.0 - '@changesets/types': 6.0.0 + '@changesets/get-github-info': 0.7.0 + '@changesets/types': 6.1.0 dotenv: 8.6.0 transitivePeerDependencies: - encoding - '@changesets/cli@2.27.3': + '@changesets/cli@2.29.8(@types/node@24.10.2)': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/apply-release-plan': 7.0.1 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 + '@changesets/apply-release-plan': 7.0.14 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.2 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.1 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.14 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@24.10.2) '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 ansi-colors: 4.1.3 - chalk: 2.4.2 ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 + mri: 1.2.0 p-limit: 2.3.0 - preferred-pm: 3.1.3 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.2 - spawndamnit: 2.0.0 + spawndamnit: 3.0.1 term-size: 2.2.1 - tty-table: 4.2.3 + transitivePeerDependencies: + - '@types/node' - '@changesets/config@3.0.0': + '@changesets/config@3.1.2': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.6 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.0.0': + '@changesets/get-dependents-graph@2.1.3': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 + picocolors: 1.1.1 semver: 7.6.2 - '@changesets/get-github-info@0.6.0': + '@changesets/get-github-info@0.7.0': dependencies: dataloader: 1.4.0 node-fetch: 2.7.0 transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.0': + '@changesets/get-release-plan@4.0.14': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.0': + '@changesets/git@3.0.4': dependencies: - '@babel/runtime': 7.24.5 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.6 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 - '@changesets/logger@0.1.0': + '@changesets/logger@0.1.1': dependencies: - chalk: 2.4.2 + picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.2': dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 - '@changesets/pre@2.0.0': + '@changesets/pre@2.0.2': dependencies: - '@babel/runtime': 7.24.5 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.0': + '@changesets/read@0.6.6': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - chalk: 2.4.2 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.2 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.1': + '@changesets/write@0.4.0': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.3 prettier: 2.8.8 '@esbuild/aix-ppc64@0.20.2': @@ -3134,7 +2572,7 @@ snapshots: dependencies: duplexify: 4.1.3 fastify-plugin: 4.5.1 - ws: 8.17.0 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -3151,6 +2589,13 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 + '@inquirer/external-editor@1.0.3(@types/node@24.10.2)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.10.2 + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -3494,7 +2939,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.30.0': {} - '@pimlico/alto@0.0.15(typescript@5.4.5)': + '@pimlico/alto@0.0.15(typescript@5.9.3)': dependencies: '@fastify/websocket': 10.0.1 '@opentelemetry/api': 1.9.0 @@ -3511,8 +2956,8 @@ snapshots: '@pimlico/opentelemetry-instrumentation-viem': 0.0.4(@opentelemetry/api@1.9.0) '@sentry/node': 7.116.0 '@types/node': 18.19.34 - '@types/ws': 8.5.10 - abitype: 0.8.11(typescript@5.4.5)(zod@3.23.8) + '@types/ws': 8.18.1 + abitype: 0.8.11(typescript@5.9.3)(zod@3.23.8) async-mutex: 0.4.1 bull: 4.16.5 dotenv: 16.4.5 @@ -3524,7 +2969,7 @@ snapshots: pino-pretty: 10.3.1 prom-client: 14.2.0 type-fest: 4.39.0 - viem: 2.24.3(typescript@5.4.5)(zod@3.23.8) + viem: 2.24.3(typescript@5.9.3)(zod@3.23.8) yargs: 17.7.2 zod: 3.23.8 zod-validation-error: 1.5.0(zod@3.23.8) @@ -3668,11 +3113,9 @@ snapshots: '@types/estree@1.0.5': {} - '@types/http-proxy@1.17.14': + '@types/http-proxy@1.17.17': dependencies: - '@types/node': 20.14.0 - - '@types/minimist@1.2.5': {} + '@types/node': 24.10.2 '@types/node@12.20.55': {} @@ -3680,23 +3123,19 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.14.0': + '@types/node@24.10.2': dependencies: - undici-types: 5.26.5 - - '@types/normalize-package-data@2.4.4': {} - - '@types/semver@7.5.8': {} + undici-types: 7.16.0 '@types/shimmer@1.0.5': {} '@types/shimmer@1.2.0': {} - '@types/ws@8.5.10': + '@types/ws@8.18.1': dependencies: - '@types/node': 20.14.0 + '@types/node': 24.10.2 - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.0))': + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@24.10.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -3711,7 +3150,7 @@ snapshots: std-env: 3.7.0 strip-literal: 2.1.0 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.14.0) + vitest: 1.6.0(@types/node@24.10.2) transitivePeerDependencies: - supports-color @@ -3744,15 +3183,15 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - abitype@0.8.11(typescript@5.4.5)(zod@3.23.8): + abitype@0.8.11(typescript@5.9.3)(zod@3.23.8): dependencies: - typescript: 5.4.5 + typescript: 5.9.3 optionalDependencies: zod: 3.23.8 - abitype@1.0.8(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.8(typescript@5.9.3)(zod@3.23.8): optionalDependencies: - typescript: 5.4.5 + typescript: 5.9.3 zod: 3.23.8 abort-controller@3.0.0: @@ -3796,10 +3235,6 @@ snapshots: ansi-regex@6.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -3812,33 +3247,10 @@ snapshots: dependencies: sprintf-js: 1.0.3 - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + argparse@2.0.1: {} array-union@2.1.0: {} - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} - assertion-error@1.1.0: {} async-mutex@0.4.1: @@ -3847,10 +3259,6 @@ snapshots: atomic-sleep@1.0.0: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - avvio@8.3.2: dependencies: '@fastify/error': 3.4.1 @@ -3879,10 +3287,6 @@ snapshots: dependencies: fill-range: 7.1.1 - breakword@1.0.6: - dependencies: - wcwidth: 1.0.1 - buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -3902,22 +3306,6 @@ snapshots: cac@6.7.14: {} - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - chai@4.4.1: dependencies: assertion-error: 1.1.0 @@ -3928,20 +3316,9 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - change-case@5.4.4: {} - chardet@0.7.0: {} + chardet@2.1.1: {} check-error@1.0.3: dependencies: @@ -3953,32 +3330,18 @@ snapshots: cjs-module-lexer@1.3.1: {} - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone@1.0.4: {} - cluster-key-slot@1.1.2: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} colorette@2.0.20: {} @@ -3993,48 +3356,17 @@ snapshots: dependencies: luxon: 3.6.1 - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} - - csv-stringify@5.6.5: {} - - csv@5.5.3: - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: + cross-spawn@7.0.6: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 dataloader@1.4.0: {} @@ -4044,33 +3376,10 @@ snapshots: dependencies: ms: 2.1.2 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - denque@2.1.0: {} detect-indent@6.1.0: {} @@ -4110,85 +3419,6 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 @@ -4217,8 +3447,6 @@ snapshots: escalade@3.1.2: {} - escape-string-regexp@1.0.5: {} - esprima@4.0.1: {} estree-walker@3.0.3: @@ -4262,12 +3490,6 @@ snapshots: extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-content-type-parse@1.1.0: {} fast-copy@3.0.2: {} @@ -4348,22 +3570,8 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - find-yarn-workspace-root2@1.2.16: - dependencies: - micromatch: 4.0.6 - pkg-dir: 4.2.0 - follow-redirects@1.15.6: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 @@ -4390,27 +3598,10 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - get-caller-file@2.0.5: {} get-func-name@2.0.2: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-port@5.1.1: {} get-port@7.1.0: {} @@ -4422,12 +3613,6 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4449,11 +3634,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -4463,42 +3643,16 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - - hard-rejection@2.1.0: {} - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - hasown@2.0.2: dependencies: function-bind: 1.1.2 help-me@5.0.0: {} - hosted-git-info@2.8.9: {} - html-escaper@2.0.2: {} http-proxy@1.18.1: @@ -4509,13 +3663,13 @@ snapshots: transitivePeerDependencies: - debug - human-id@1.0.2: {} + human-id@4.1.3: {} human-signals@5.0.0: {} human-signals@7.0.0: {} - iconv-lite@0.4.24: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 @@ -4539,8 +3693,6 @@ snapshots: cjs-module-lexer: 1.3.1 module-details-from-path: 1.0.3 - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -4548,12 +3700,6 @@ snapshots: inherits@2.0.4: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - ioredis@5.6.0: dependencies: '@ioredis/commands': 1.2.0 @@ -4570,36 +3716,10 @@ snapshots: ipaddr.js@1.9.1: {} - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - is-core-module@2.13.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -4608,57 +3728,22 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-plain-obj@1.1.0: {} - is-plain-obj@4.1.0: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-stream@3.0.0: {} is-stream@4.0.1: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-unicode-supported@2.0.0: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-windows@1.0.2: {} - isarray@2.0.5: {} - isexe@2.0.0: {} isows@1.0.6(ws@8.18.1): @@ -4694,8 +3779,6 @@ snapshots: joycon@3.1.1: {} - js-tokens@4.0.0: {} - js-tokens@9.0.0: {} js-yaml@3.14.1: @@ -4703,7 +3786,9 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - json-parse-even-better-errors@2.3.1: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 json-schema-ref-resolver@1.0.1: dependencies: @@ -4715,10 +3800,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - kind-of@6.0.3: {} - - kleur@4.1.5: {} - lie@3.1.1: dependencies: immediate: 3.0.6 @@ -4729,15 +3810,6 @@ snapshots: process-warning: 3.0.0 set-cookie-parser: 2.6.0 - lines-and-columns@1.2.4: {} - - load-yaml-file@0.2.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - local-pkg@0.5.0: dependencies: mlly: 1.7.0 @@ -4751,10 +3823,6 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash.camelcase@4.3.0: {} lodash.defaults@4.2.0: {} @@ -4775,11 +3843,6 @@ snapshots: lru-cache@10.2.2: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - luxon@3.6.1: {} magic-string@0.30.10: @@ -4796,24 +3859,6 @@ snapshots: dependencies: semver: 7.6.2 - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -4823,9 +3868,12 @@ snapshots: braces: 3.0.3 picomatch: 4.0.2 - mimic-fn@4.0.0: {} + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 - min-indent@1.0.1: {} + mimic-fn@4.0.0: {} minimatch@3.1.2: dependencies: @@ -4835,12 +3883,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} minipass@7.1.1: {} @@ -4850,8 +3892,6 @@ snapshots: minipass: 7.1.1 rimraf: 5.0.7 - mixme@0.5.10: {} - mkdirp@3.0.1: {} mlly@1.7.0: @@ -4863,6 +3903,8 @@ snapshots: module-details-from-path@1.0.3: {} + mri@1.2.0: {} + ms@2.1.2: {} msgpackr-extract@3.0.3: @@ -4892,28 +3934,10 @@ snapshots: detect-libc: 2.0.3 optional: true - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - object-inspect@1.13.1: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - on-exit-leak-free@2.1.2: {} once@1.4.0: @@ -4932,21 +3956,19 @@ snapshots: transitivePeerDependencies: - supports-color - os-tmpdir@1.0.2: {} - outdent@0.5.0: {} - ox@0.6.9(typescript@5.4.5)(zod@3.23.8): + ox@0.6.9(typescript@5.9.3)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.4.5)(zod@3.23.8) + abitype: 1.0.8(typescript@5.9.3)(zod@3.23.8) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.4.5 + typescript: 5.9.3 transitivePeerDependencies: - zod @@ -4958,10 +3980,6 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-limit@5.0.0: dependencies: yocto-queue: 1.0.0 @@ -4970,20 +3988,13 @@ snapshots: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@2.1.0: {} p-try@2.2.0: {} - parse-json@5.2.0: + package-manager-detector@0.2.11: dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + quansync: 0.2.11 parse-ms@4.0.0: {} @@ -5010,6 +4021,10 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + picomatch@4.0.2: {} pify@4.0.1: {} @@ -5075,31 +4090,18 @@ snapshots: sonic-boom: 4.0.1 thread-stream: 3.0.2 - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - pkg-types@1.1.1: dependencies: confbox: 0.1.7 mlly: 1.7.0 pathe: 1.1.2 - possible-typed-array-names@1.0.0: {} - postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - preferred-pm@3.1.3: - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - prettier@2.8.8: {} pretty-format@29.7.0: @@ -5132,7 +4134,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.0 + '@types/node': 24.10.2 long: 5.2.3 proxy-addr@2.0.7: @@ -5140,8 +4142,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - pseudomap@1.0.2: {} - pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -5149,27 +4149,14 @@ snapshots: punycode@2.3.1: {} + quansync@0.2.11: {} + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} - quick-lru@4.0.1: {} - react-is@18.3.1: {} - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -5193,11 +4180,6 @@ snapshots: real-require@0.2.0: {} - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -5206,13 +4188,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -5225,8 +4200,6 @@ snapshots: transitivePeerDependencies: - supports-color - require-main-filename@2.0.0: {} - requires-port@1.0.0: {} resolve-from@5.0.0: {} @@ -5273,21 +4246,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-regex2@3.1.0: dependencies: ret: 0.4.3 @@ -5298,68 +4258,24 @@ snapshots: secure-json-parse@2.7.0: {} - semver@5.7.2: {} - semver@7.6.2: {} - set-blocking@2.0.0: {} - set-cookie-parser@2.6.0: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} shimmer@1.2.1: {} - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} slash@3.0.0: {} - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 @@ -5370,24 +4286,10 @@ snapshots: source-map-js@1.2.0: {} - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-license-ids@3.0.17: {} + cross-spawn: 7.0.6 + signal-exit: 4.1.0 split2@4.2.0: {} @@ -5401,10 +4303,6 @@ snapshots: stream-shift@1.0.3: {} - stream-transform@2.1.3: - dependencies: - mixme: 0.5.10 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -5417,25 +4315,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -5454,20 +4333,12 @@ snapshots: strip-final-newline@4.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@3.1.1: {} strip-literal@2.1.0: dependencies: js-tokens: 9.0.0 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -5509,10 +4380,6 @@ snapshots: tinyspy@2.2.1: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -5523,75 +4390,20 @@ snapshots: tr46@0.0.3: {} - trim-newlines@3.0.1: {} - tslib@2.6.3: {} - tty-table@4.2.3: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - type-detect@4.0.8: {} - type-fest@0.13.1: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - type-fest@4.39.0: {} - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typescript@5.4.5: {} + typescript@5.9.3: {} ufo@1.5.3: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} + undici-types@7.16.0: {} + universalify@0.1.2: {} uri-js@4.4.1: @@ -5602,35 +4414,30 @@ snapshots: uuid@8.3.2: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - viem@2.24.3(typescript@5.4.5)(zod@3.23.8): + viem@2.24.3(typescript@5.9.3)(zod@3.23.8): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.4.5)(zod@3.23.8) + abitype: 1.0.8(typescript@5.9.3)(zod@3.23.8) isows: 1.0.6(ws@8.18.1) - ox: 0.6.9(typescript@5.4.5)(zod@3.23.8) + ox: 0.6.9(typescript@5.9.3)(zod@3.23.8) ws: 8.18.1 optionalDependencies: - typescript: 5.4.5 + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-node@1.6.0(@types/node@20.14.0): + vite-node@1.6.0(@types/node@24.10.2): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.2.11(@types/node@20.14.0) + vite: 5.2.11(@types/node@24.10.2) transitivePeerDependencies: - '@types/node' - less @@ -5641,16 +4448,16 @@ snapshots: - supports-color - terser - vite@5.2.11(@types/node@20.14.0): + vite@5.2.11(@types/node@24.10.2): dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.17.2 optionalDependencies: - '@types/node': 20.14.0 + '@types/node': 24.10.2 fsevents: 2.3.3 - vitest@1.6.0(@types/node@20.14.0): + vitest@1.6.0(@types/node@24.10.2): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -5669,11 +4476,11 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.14.0) - vite-node: 1.6.0(@types/node@20.14.0) + vite: 5.2.11(@types/node@24.10.2) + vite-node: 1.6.0(@types/node@24.10.2) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.14.0 + '@types/node': 24.10.2 transitivePeerDependencies: - less - lightningcss @@ -5683,10 +4490,6 @@ snapshots: - supports-color - terser - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -5694,33 +4497,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-module@2.0.1: {} - - which-pm@2.0.0: - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -5730,12 +4506,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5750,39 +4520,16 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.0: {} - ws@8.18.1: {} - y18n@4.0.3: {} + ws@8.18.3: {} y18n@5.0.8: {} - yallist@2.1.2: {} - yallist@5.0.0: {} - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - yargs-parser@21.1.1: {} - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -5793,8 +4540,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} yoctocolors@2.0.2: {} diff --git a/src/README.md b/src/README.md index 0678505..e1319bb 100644 --- a/src/README.md +++ b/src/README.md @@ -36,16 +36,6 @@ Prool is a library that provides programmatic HTTP testing instances for Ethereum. It is designed to be used in testing environments (e.g. [Vitest](https://vitest.dev/)) where you need to interact with an Ethereum server instance (e.g. Execution Node, 4337 Bundler, Indexer, etc) over HTTP or WebSocket. -Prool contains a set of pre-configured instances that can be used to simulate Ethereum server environments, being: - -- **Local Execution Nodes:** [`anvil`](#anvil-execution-node) -- **Bundler Nodes:** [`alto`](#alto-bundler-node), [`rundler`](#rundler-bundler-node), [`silius`](#silius-bundler-node), [`stackup`](#stackup-bundler-node) -- **Indexer Nodes:** `ponder`⚠️ - -⚠️ = soon - -You can also create your own custom instances by using the [`defineInstance` function](#defineinstance). - ## Table of Contents - [Install](#install) @@ -53,8 +43,6 @@ You can also create your own custom instances by using the [`defineInstance` fun - [Anvil (Execution Node)](#anvil-execution-node) - [Alto (Bundler Node)](#alto-bundler-node) - [Rundler (Bundler Node)](#rundler-bundler-node) - - [Silius (Bundler Node)](#silius-bundler-node) - - [Stackup (Bundler Node)](#stackup-bundler-node) - [Reference](#reference) - [`createServer`](#createserver) - [`defineInstance`](#defineinstance) @@ -189,90 +177,6 @@ await bundlerServer.start() See [RundlerParameters](). -### Silius (Bundler Node) - -#### Requirements - -- [Docker](https://docs.docker.com/get-docker/) -- Silius Docker Image: `docker pull silius-rs/silius` - -#### Usage - -```ts -import { createServer } from 'prool' -import { anvil, silius } from 'prool/instances' - -const executionServer = createServer({ - instance: anvil(), - port: 8545 -}) -await executionServer.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" - -const bundlerServer = createServer({ - instance: (key) => silius({ - ethClientAddress: `http://localhost:8545/${key}`, - mnemonicPath: './keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', - }) -}) -await bundlerServer.start() -// Instances accessible at: -// "http://localhost:4000/1" (→ http://localhost:8545/1) -// "http://localhost:4000/2" (→ http://localhost:8545/2) -// "http://localhost:4000/3" (→ http://localhost:8545/3) -// "http://localhost:4000/n" (→ http://localhost:8545/n) -``` - -#### Parameters - -See [`SiliusParameters`](). - -### Stackup (Bundler Node) - -#### Requirements - -- [Docker](https://docs.docker.com/get-docker/) -- Stackup Docker Image: `docker pull stackupwallet/stackup-bundler:latest` - -#### Usage - -```ts -import { createServer } from 'prool' -import { anvil, stackup } from 'prool/instances' - -const executionServer = createServer({ - instance: anvil(), - port: 8545 -}) -await executionServer.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" - -const bundlerServer = createServer({ - instance: (key) => stackup({ - ethClientUrl: `http://localhost:8545/${key}`, - privateKey: '0x...', - }) -}) -await bundlerServer.start() -// Instances accessible at: -// "http://localhost:4337/1" (→ http://localhost:8545/1) -// "http://localhost:4337/2" (→ http://localhost:8545/2) -// "http://localhost:4337/3" (→ http://localhost:8545/3) -// "http://localhost:4337/n" (→ http://localhost:8545/n) -``` - -#### Parameters - -See [`StackupParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/stackup.ts#L5). - ## Reference ### `createServer` diff --git a/src/exports/index.ts b/src/exports/index.ts index 691d07c..0474562 100644 --- a/src/exports/index.ts +++ b/src/exports/index.ts @@ -1,17 +1,17 @@ export { type DefineInstanceFn, type DefineInstanceReturnType, + defineInstance, type Instance, type InstanceOptions, type InstanceStartOptions, - defineInstance, } from '../instance.js' export { type DefinePoolParameters, type DefinePoolReturnType, - type Pool, definePool, + type Pool, } from '../pool.js' export { diff --git a/src/exports/instances.test.ts b/src/exports/instances.test.ts index d58d744..853a359 100644 --- a/src/exports/instances.test.ts +++ b/src/exports/instances.test.ts @@ -7,8 +7,6 @@ test('exports', () => { "alto", "anvil", "rundler", - "silius", - "stackup", "defineInstance", ] `) diff --git a/src/exports/instances.ts b/src/exports/instances.ts index c944cb5..e423e86 100644 --- a/src/exports/instances.ts +++ b/src/exports/instances.ts @@ -1,13 +1,11 @@ -export { alto, type AltoParameters } from '../instances/alto.js' -export { anvil, type AnvilParameters } from '../instances/anvil.js' -export { rundler, type RundlerParameters } from '../instances/rundler.js' -export { silius, type SiliusParameters } from '../instances/silius.js' -export { stackup, type StackupParameters } from '../instances/stackup.js' export { - defineInstance, type DefineInstanceFn, type DefineInstanceReturnType, + defineInstance, type Instance, type InstanceOptions, type InstanceStartOptions, } from '../instance.js' +export { type AltoParameters, alto } from '../instances/alto.js' +export { type AnvilParameters, anvil } from '../instances/anvil.js' +export { type RundlerParameters, rundler } from '../instances/rundler.js' diff --git a/src/exports/processes.ts b/src/exports/processes.ts index 7d546fd..06d8a70 100644 --- a/src/exports/processes.ts +++ b/src/exports/processes.ts @@ -3,6 +3,6 @@ export { type ExecaProcess, type ExecaReturnType, type ExecaStartOptions, - type Process_internal, execa, + type Process_internal, } from '../processes/execa.js' diff --git a/src/instance.ts b/src/instance.ts index 208c97c..49142cc 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -153,9 +153,11 @@ export function defineInstance< const parameters = parametersOrOptions as parameters const options = options_ || parametersOrOptions || {} + const instance = fn(parameters) const { _internal, host, name, port, start, stop } = { - ...fn(parameters), + ...instance, ...createParameters, + port: instance.port, } const { messageBuffer = 20, timeout } = options diff --git a/src/instances/alto.test.ts b/src/instances/alto.test.ts index 0c8abdf..5f6a21e 100644 --- a/src/instances/alto.test.ts +++ b/src/instances/alto.test.ts @@ -21,7 +21,7 @@ const defineInstance = (parameters: Partial = {}) => { beforeAll(() => anvil({ - forkUrl: process.env.VITE_FORK_URL ?? 'https://eth.merkle.io', + forkUrl: process.env['VITE_FORK_URL'] ?? 'https://eth.merkle.io', port, }).start(), ) @@ -100,7 +100,7 @@ test.skip('behavior: can subscribe to stderr', async () => { test('behavior: exit', async () => { const instance = defineInstance() - let exitCode: number | null | undefined = undefined + let exitCode: number | null | undefined instance.on('exit', (code) => { exitCode = code }) diff --git a/src/instances/anvil.test.ts b/src/instances/anvil.test.ts index d543690..96ade15 100644 --- a/src/instances/anvil.test.ts +++ b/src/instances/anvil.test.ts @@ -100,7 +100,7 @@ test.skip('behavior: starts anvil with custom options', async () => { test('behavior: exit', async () => { const instance = defineInstance({ timestamp }) - let exitCode: number | null | undefined = undefined + let exitCode: number | null | undefined instance.on('exit', (code) => { exitCode = code }) diff --git a/src/instances/rundler.test.ts b/src/instances/rundler.test.ts index 0a18d1e..0c7be6b 100644 --- a/src/instances/rundler.test.ts +++ b/src/instances/rundler.test.ts @@ -76,12 +76,12 @@ test('behavior: can subscribe to stderr', async () => { const instance_1 = defineInstance({ rpc: { - port: 1338, + port: 1339, }, }) const instance_2 = defineInstance({ rpc: { - port: 1338, + port: 1339, }, }) @@ -91,21 +91,3 @@ test('behavior: can subscribe to stderr', async () => { 'Failed to start process "rundler"', ) }) - -test('behavior: exit', async () => { - const instance = defineInstance() - - let exitCode: number | null | undefined = undefined - instance.on('exit', (code) => { - exitCode = code - }) - - await instance.start() - expect(instance.status).toEqual('started') - - instance._internal.process.kill() - - await new Promise((res) => setTimeout(res, 100)) - expect(instance.status).toEqual('stopped') - expect(typeof exitCode !== 'undefined').toBeTruthy() -}) diff --git a/src/instances/rundler.ts b/src/instances/rundler.ts index b9ddf1e..c76677a 100644 --- a/src/instances/rundler.ts +++ b/src/instances/rundler.ts @@ -10,44 +10,44 @@ export type RundlerParameters = { * * @default rundler */ - binary?: string + binary?: string | undefined /** * The version of the entrypoint to use * * @default 0.6.0 */ - entryPointVersion?: '0.6.0' | '0.7.0' + entryPointVersion?: '0.6.0' | '0.7.0' | undefined /** * Network to look up a hardcoded chain spec. * @default dev */ - network?: string + network?: string | undefined /** * Path to a chain spec TOML file. */ - chainSpec?: string + chainSpec?: string | undefined /** * EVM Node HTTP URL to use. * * @default http://localhost:8545 */ - nodeHttp?: string + nodeHttp?: string | undefined /** * Maximum verification gas. * @default 5000000 */ - maxVerificationGas?: number + maxVerificationGas?: number | undefined /** * Maximum bundle gas. * @default 25000000 */ - maxBundleGas?: number + maxBundleGas?: number | undefined /** * Minimum stake value. @@ -59,300 +59,318 @@ export type RundlerParameters = { * Minimum unstake delay. * @default 84600 */ - minUnstakeDelay?: number + minUnstakeDelay?: number | undefined /** * Number of blocks to search when calling eth_getUserOperationByHash. * @default 100 */ - userOperationEventBlockDistance?: number + userOperationEventBlockDistance?: number | undefined /** * Maximum gas for simulating handle operations. * @default 20000000 */ - maxSimulateHandleOpsGas?: number + maxSimulateHandleOpsGas?: number | undefined /** * The gas fee to use during verification estimation. * @default 1000000000000 10K gwei */ - verificationEstimationGasFee?: number + verificationEstimationGasFee?: number | undefined /** * Bundle transaction priority fee overhead over network value. * @default 0 */ - bundlePriorityFeeOverheadPercent?: number + bundlePriorityFeeOverheadPercent?: number | undefined /** * Priority fee mode kind. * Possible values are base_fee_percent and priority_fee_increase_percent. * @default priority_fee_increase_percent */ - priorityFeeModeKind?: 'base_fee_percent' | 'priority_fee_increase_percent' + priorityFeeModeKind?: + | 'base_fee_percent' + | 'priority_fee_increase_percent' + | undefined /** * Priority fee mode value. * @default 0 */ - priorityFeeModeValue?: number + priorityFeeModeValue?: number | undefined /** * Percentage of the current network fees a user operation must have in order to be accepted into the mempool. * @default 100 */ - baseFeeAcceptPercent?: number + baseFeeAcceptPercent?: number | undefined /** * AWS region. * @default us-east-1 */ - awsRegion?: string + awsRegion?: string | undefined /** * Interval at which the builder polls an RPC node for new blocks and mined transactions. * @default 100 */ - ethPollIntervalMillis?: number + ethPollIntervalMillis?: number | undefined /** * Flag for unsafe bundling mode. When set Rundler will skip checking simulation rules (and any debug_traceCall). * * @default true */ - unsafe?: boolean + unsafe?: boolean | undefined /** * Path to the mempool configuration file. * This path can either be a local file path or an S3 url. */ - mempoolConfigPath?: string - - metrics?: { - /** - * Port to listen on for metrics requests. - * @default 8080 - */ - port?: number - - /** - * Host to listen on for metrics requests. - * @default 0.0.0.0 - */ - host?: string - - /** - * Tags for metrics in the format key1=value1,key2=value2,... - */ - tags?: string - - /** - * Sample interval to use for sampling metrics. - * @default 1000 - */ - sampleIntervalMillis?: number - } - - logging?: { - /** - * Log file. If not provided, logs will be written to stdout. - */ - file?: string - - /** - * If set, logs will be written in JSON format. - */ - json?: boolean - } - - rpc?: { - /** - * Port to listen on for JSON-RPC requests. - * @default 3000 - */ - port?: number - - /** - * Host to listen on for JSON-RPC requests. - * @default 127.0.0.1 - */ - host?: string - - /** - * Which APIs to expose over the RPC interface. - * @default eth,rundler - */ - api?: string - - /** - * Timeout for RPC requests. - * @default 20 - */ - timeoutSeconds?: number - - /** - * Maximum number of concurrent connections. - * @default 100 - */ - maxConnections?: number - } - - pool?: { - /** - * Maximum size in bytes for the pool. - * @default 500000000, 0.5 GB - */ - maxSizeInBytes?: number - - /** - * Maximum number of user operations for an unstaked sender. - * @default 4 - */ - sameSenderMempoolCount?: number - - /** - * Minimum replacement fee increase percentage. - * @default 10 - */ - minReplacementFeeIncreasePercentage?: number - - /** - * Path to a blocklist file. - * This path can either be a local file path or an S3 url. - */ - blocklistPath?: string - - /** - * Path to an allowlist file. - * This path can either be a local file path or an S3 url. - */ - allowlistPath?: string - - /** - * Size of the chain history. - */ - chainHistorySize?: number - - /** - * Boolean field that sets whether the pool server starts with paymaster tracking enabled. - * @default true - */ - paymasterTrackingEnabled?: boolean - - /** - * Length of the paymaster cache. - * @default 10_000 - */ - paymasterCacheLength?: number - - /** - * Boolean field that sets whether the pool server starts with reputation tracking enabled. - * @default true - */ - reputationTrackingEnabled?: boolean - - /** - * The minimum number of blocks that a UO must stay in the mempool before it can be requested to be dropped by the user. - * @default 10 - */ - dropMinNumBlocks?: number - } - - builder?: { - /** - * Private key to use for signing transactions. - * If used with awsKmsKeyIds, then explicitly pass in `null` here. - * - * @default 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - */ - privateKey?: string - - /** - * AWS KMS key IDs to use for signing transactions (comma-separated). - * Only required if privateKey is not provided. - */ - awsKmsKeyIds?: string - - /** - * Redis URI to use for KMS leasing. - * Only required when awsKmsKeyIds are provided. - * - * @default "" - */ - redisUri?: string - - /** - * Redis lock TTL in milliseconds. - * Only required when awsKmsKeyIds are provided. - * @default 60000 - */ - redisLockTtlMillis?: number - - /** - * Maximum number of ops to include in one bundle. - * @default 128 - */ - maxBundleSize?: number - - /** - * If present, the URL of the ETH provider that will be used to send transactions. - * Defaults to the value of nodeHttp. - */ - submitUrl?: string - - /** - * Choice of what sender type to use for transaction submission. - * @default raw - * options: raw, conditional, flashbots, polygon_bloxroute - */ - sender?: 'raw' | 'conditional' | 'flashbots' | 'polygonBloxroute' - - /** - * After submitting a bundle transaction, the maximum number of blocks to wait for that transaction to mine before trying to resend with higher gas fees. - * @default 2 - */ - maxBlocksToWaitForMine?: number - - /** - * Percentage amount to increase gas fees when retrying a transaction after it failed to mine. - * @default 10 - */ - replacementFeePercentIncrease?: number - - /** - * Maximum number of fee increases to attempt. - * Seven increases of 10% is roughly 2x the initial fees. - * @default 7 - */ - maxFeeIncreases?: number - - /** - * Additional builders to send bundles to through the Flashbots relay RPC (comma-separated). - * List of builders that the Flashbots RPC supports can be found here. - * @default flashbots - */ - flashbotsRelayBuilders?: string - - /** - * Authorization key to use with the Flashbots relay. - * See here for more info. - * @default None - */ - flashbotsRelayAuthKey?: string - - /** - * If using the bloxroute transaction sender on Polygon, this is the auth header to supply with the requests. - * @default None - */ - bloxrouteAuthHeader?: string - - /** - * If running multiple builder processes, this is the index offset to assign unique indexes to each bundle sender. - * @default 0 - */ - indexOffset?: number - } + mempoolConfigPath?: string | undefined + + metrics?: + | { + /** + * Port to listen on for metrics requests. + * @default 8080 + */ + port?: number | undefined + + /** + * Host to listen on for metrics requests. + * @default 0.0.0.0 + */ + host?: string | undefined + + /** + * Tags for metrics in the format key1=value1,key2=value2,... + */ + tags?: string | undefined + + /** + * Sample interval to use for sampling metrics. + * @default 1000 + */ + sampleIntervalMillis?: number | undefined + } + | undefined + + logging?: + | { + /** + * Log file. If not provided, logs will be written to stdout. + */ + file?: string | undefined + + /** + * If set, logs will be written in JSON format. + */ + json?: boolean | undefined + } + | undefined + + rpc?: + | { + /** + * Port to listen on for JSON-RPC requests. + * @default 3000 + */ + port?: number | undefined + + /** + * Host to listen on for JSON-RPC requests. + * @default 127.0.0.1 + */ + host?: string | undefined + + /** + * Which APIs to expose over the RPC interface. + * @default eth,rundler + */ + api?: string | undefined + + /** + * Timeout for RPC requests. + * @default 20 + */ + timeoutSeconds?: number | undefined + + /** + * Maximum number of concurrent connections. + * @default 100 + */ + maxConnections?: number | undefined + } + | undefined + + pool?: + | { + /** + * Maximum size in bytes for the pool. + * @default 500000000, 0.5 GB + */ + maxSizeInBytes?: number | undefined + + /** + * Maximum number of user operations for an unstaked sender. + * @default 4 + */ + sameSenderMempoolCount?: number | undefined + + /** + * Minimum replacement fee increase percentage. + * @default 10 + */ + minReplacementFeeIncreasePercentage?: number | undefined + + /** + * Path to a blocklist file. + * This path can either be a local file path or an S3 url. + */ + blocklistPath?: string | undefined + + /** + * Path to an allowlist file. + * This path can either be a local file path or an S3 url. + */ + allowlistPath?: string | undefined + + /** + * Size of the chain history. + */ + chainHistorySize?: number | undefined + + /** + * Boolean field that sets whether the pool server starts with paymaster tracking enabled. + * @default true + */ + paymasterTrackingEnabled?: boolean | undefined + + /** + * Length of the paymaster cache. + * @default 10_000 + */ + paymasterCacheLength?: number | undefined + + /** + * Boolean field that sets whether the pool server starts with reputation tracking enabled. + * @default true + */ + reputationTrackingEnabled?: boolean | undefined + + /** + * The minimum number of blocks that a UO must stay in the mempool before it can be requested to be dropped by the user. + * @default 10 + */ + dropMinNumBlocks?: number | undefined + } + | undefined + + builder?: + | { + /** + * Private key to use for signing transactions. + * If used with awsKmsKeyIds, then explicitly pass in `null` here. + * + * @default 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + */ + privateKey?: string | undefined + + /** + * AWS KMS key IDs to use for signing transactions (comma-separated). + * Only required if privateKey is not provided. + */ + awsKmsKeyIds?: string | undefined + + /** + * Redis URI to use for KMS leasing. + * Only required when awsKmsKeyIds are provided. + * + * @default "" + */ + redisUri?: string | undefined + + /** + * Redis lock TTL in milliseconds. + * Only required when awsKmsKeyIds are provided. + * @default 60000 + */ + redisLockTtlMillis?: number | undefined + + /** + * Maximum number of ops to include in one bundle. + * @default 128 + */ + maxBundleSize?: number | undefined + + /** + * If present, the URL of the ETH provider that will be used to send transactions. + * Defaults to the value of nodeHttp. + */ + submitUrl?: string | undefined + + /** + * Choice of what sender type to use for transaction submission. + * @default raw + * options: raw, conditional, flashbots, polygon_bloxroute + */ + sender?: + | 'raw' + | 'conditional' + | 'flashbots' + | 'polygonBloxroute' + | undefined + + /** + * After submitting a bundle transaction, the maximum number of blocks to wait for that transaction to mine before trying to resend with higher gas fees. + * @default 2 + */ + maxBlocksToWaitForMine?: number | undefined + + /** + * Percentage amount to increase gas fees when retrying a transaction after it failed to mine. + * @default 10 + */ + replacementFeePercentIncrease?: number | undefined + + /** + * Maximum number of fee increases to attempt. + * Seven increases of 10% is roughly 2x the initial fees. + * @default 7 + */ + maxFeeIncreases?: number | undefined + + /** + * Additional builders to send bundles to through the Flashbots relay RPC (comma-separated). + * List of builders that the Flashbots RPC supports can be found here. + * @default flashbots + */ + flashbotsRelayBuilders?: string | undefined + + /** + * Authorization key to use with the Flashbots relay. + * See here for more info. + * @default None + */ + flashbotsRelayAuthKey?: string | undefined + + /** + * If using the bloxroute transaction sender on Polygon, this is the auth header to supply with the requests. + * @default None + */ + bloxrouteAuthHeader?: string | undefined + + /** + * If running multiple builder processes, this is the index offset to assign unique indexes to each bundle sender. + * @default 0 + */ + indexOffset?: number | undefined + } + | undefined } /** diff --git a/src/instances/silius.test.ts b/src/instances/silius.test.ts deleted file mode 100644 index 019c88f..0000000 --- a/src/instances/silius.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import getPort from 'get-port' -import { afterEach, beforeAll, expect, test } from 'vitest' - -import { siliusOptions } from '../../test/utils.js' -import type { Instance } from '../instance.js' -import { anvil } from './anvil.js' -import { silius } from './silius.js' - -const instances: Instance[] = [] - -const port = await getPort() - -const defineInstance = (parameters?: Partial<{}>) => { - const instance = silius({ - ...siliusOptions({ port, pool: false }), - ...parameters, - }) - instances.push(instance) - return instance -} - -beforeAll(() => anvil({ port }).start()) - -afterEach(async () => { - for (const instance of instances) await instance.stop().catch(() => {}) -}) - -test('default', async () => { - const messages: string[] = [] - const stdouts: string[] = [] - - const instance = defineInstance() - - instance.on('message', (m) => messages.push(m)) - instance.on('stdout', (m) => stdouts.push(m)) - - expect(instance.messages.get()).toMatchInlineSnapshot('[]') - - await instance.start() - expect(instance.status).toEqual('started') - - expect(messages.join('')).toBeDefined() - expect(stdouts.join('')).toBeDefined() - expect(instance.messages.get().join('')).toBeDefined() - - await instance.stop() - expect(instance.status).toEqual('stopped') - - expect(messages.join('')).toBeDefined() - expect(stdouts.join('')).toBeDefined() - expect(instance.messages.get()).toMatchInlineSnapshot('[]') -}) - -test('behavior: instance errored (duplicate ports)', async () => { - const instance_1 = defineInstance({ - port: 1337, - }) - const instance_2 = defineInstance({ - port: 1337, - }) - - await instance_1.start() - await expect(() => instance_2.start()).rejects.toThrowError() -}) - -test('behavior: start and stop multiple times', async () => { - const instance = defineInstance() - - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() -}) - -test('behavior: can subscribe to stderr', async () => { - const messages: string[] = [] - - const instance_1 = defineInstance({ port: 1338 }) - const instance_2 = defineInstance({ port: 1338 }) - - await instance_1.start() - instance_2.on('stderr', (message) => messages.push(message)) - await expect(instance_2.start()).rejects.toThrowError() -}) - -test('behavior: exit', async () => { - const instance = defineInstance() - const { promise, resolve } = Promise.withResolvers() - - let exitCode: number | null | undefined = undefined - instance.on('exit', (code) => { - exitCode = code - resolve() - }) - - await instance.start() - expect(instance.status).toEqual('started') - - instance._internal.process.kill() - - await promise - expect(instance.status).toEqual('stopped') - expect(typeof exitCode !== 'undefined').toBeTruthy() -}) diff --git a/src/instances/silius.ts b/src/instances/silius.ts deleted file mode 100644 index d306045..0000000 --- a/src/instances/silius.ts +++ /dev/null @@ -1,347 +0,0 @@ -import { platform } from 'node:os' - -import { rmSync } from 'node:fs' -import { defineInstance } from '../instance.js' -import { execa } from '../processes/execa.js' -import { toArgs } from '../utils.js' - -export type SiliusParameters = { - /** - * The bundler beneficiary address. - */ - beneficiary?: string | undefined - /** - * The bundle interval in seconds. - * @default 10 - */ - bundleInterval?: number | undefined - bundler?: - | { - /** - * Bundler gRPC address to listen on. - * @default '127.0.0.1' - */ - addr?: string | undefined - /** - * Bundler gRPC port to listen on. - * @default 3003 - */ - port?: number | undefined - } - | undefined - /** - * The chain id. - * @default 1 - */ - chain?: number | undefined - /** - * Path to the data directory. - */ - dataDir?: string | undefined - discovery?: - | { - /** - * The udp4 port to broadcast to peers in order to reach back for discovery. - * @default 9000 - */ - port?: number | undefined - } - | undefined - /** - * Indicates whether the access list is enabled. - */ - enableAccessList?: boolean | undefined - /** - * Indicates whether the P2P mode is enabled. - */ - enableP2p?: boolean | undefined - /** - * Indicates whether the metrics are enabled. - */ - enableMetrics?: boolean | undefined - /** - * The entry points for the bundler. - */ - entryPoints?: string[] | undefined - /** - * RPC URL of the execution client. - */ - ethClientAddress?: string | undefined - /** - * Ethereum execution client proxy HTTP RPC endpoint. - */ - ethClientProxyAddress?: string | undefined - http?: - | { - /** - * HTTP address to listen on. - * @default '127.0.0.1' - */ - addr?: string | undefined - /** - * Configures the HTTP RPC API modules - * @default 'eth' - */ - api?: string[] | undefined - /** - * Configures the allowed CORS domains. - * @default '*' - */ - corsdomain?: string[] | undefined - /** - * HTTP port to listen on. - * @default 3000 - */ - port?: number | undefined - } - | undefined - /** - * Maximum gas for verification. - * @default 5000000 - */ - maxVerificationGas?: bigint | undefined - metrics?: - | { - /** - * Metrics address to listen on. - * @default '127.0.0.1' - */ - addr?: string | undefined - /** - * Metrics port to listen on. - * @default 3030 - */ - port?: number | undefined - } - | undefined - /** - * Minimum balance for the beneficiary account. - * @default 100000000000000000 wei - */ - minBalance?: bigint | undefined - /** - * Minimum priority fee per gas. - * @default 0 - */ - minPriorityFeePerGas?: bigint | undefined - /** - * Minimum stake required for entities. - * @default 1 - */ - minStake?: number | undefined - /** - * Path to the mnemonic file. - */ - mnemonicPath: string | undefined - /** - * The path to the file where the p2p private key is stored. - */ - nodekey?: string | undefined - /** - * The path to the file where the p2p enr is stored. - */ - nodeenr?: string | undefined - p2p?: - | { - /** - * Sets the p2p listen address - * @default '0.0.0.0' - */ - addr?: string | undefined - /** - * The ipv4 address to broadcast to peers about which address we are listening on. - */ - baddr?: string | undefined - /** - * The tcp4 port to boardcast to peers in order to reach back for discovery. - * @default 9000 - */ - bport?: number | undefined - } - | undefined - /** - * Poll interval event filters and pending transactions in milliseconds. - * @default 500 - */ - pollInterval?: number | undefined - /** - * Port to start the instance on. - */ - port?: number | undefined - /** - * Sets the send bundle mode. - * @default "ethereum-client" - */ - sendBundleMode?: string | undefined - uopool?: - | { - /** - * UoPool gRPC address to listen on. - * @default '127.0.0.1' - */ - addr?: string | undefined - /** - * UoPool gRPC port to listen on. - * @default 3002 - */ - port?: number | undefined - } - | undefined - /** - * Sets the UoPool mode. - */ - uopoolMode?: string | undefined - /** - * Sets the verbosity level. - * @default 2 - */ - verbosity?: number | undefined - /** - * Addresses of whitelisted entities. - */ - whitelist?: string[] | undefined - ws?: - | { - /** - * WS address to listen on. - * @default '127.0.0.1' - */ - addr?: string | undefined - /** - * Configures the HTTP RPC API modules - * @default 'eth' - */ - api?: string[] | undefined - /** - * Configures the allowed WS origins. - * @default '*' - */ - origins?: string[] | undefined - /** - * WS port to listen on. - * @default 3001 - */ - port?: number | undefined - } - | undefined -} - -/** - * Defines an Anvil instance. - * - * @example - * ```ts - * const instance = silius({ - * port: 4337, - * }) - * await instance.start() - * // ... - * await instance.stop() - * ``` - */ -export const silius = defineInstance((parameters?: SiliusParameters) => { - const args = (parameters || {}) as SiliusParameters - const { dataDir = '.local', mnemonicPath, port: _, ...rest } = args - - const host = 'localhost' - const name = 'silius' - const process = execa({ name }) - let port = args.port ?? 4000 - - return { - _internal: { - args, - get process() { - return process._internal.process - }, - }, - host, - name, - port, - async start({ port: port_ = port }, options) { - port = port_ - - const args_ = [ - ...(platform() === 'linux' ? ['--net', 'host'] : []), - '--add-host', - 'host.docker.internal:host-gateway', - '--add-host', - 'localhost:host-gateway', - '-p', - `${port}:${port}`, - '-v', - `${mnemonicPath}:/data/silius/mnemonic`, - '-v', - `./${dataDir}/${port_}/db:/data/silius/db`, - 'ghcr.io/silius-rs/silius:latest', - 'node', - '--datadir', - 'data/silius', - '--mnemonic-file', - 'data/silius/mnemonic', - '--http', - '--ws', - ...toArgs({ - ...rest, - beneficiary: - rest.beneficiary ?? '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', - bundler: { - ...rest.bundler, - addr: rest.bundler?.addr ?? '0.0.0.0', - }, - entryPoints: rest.entryPoints ?? [ - '0x0000000071727De22E5E9d8BAf0edAc6f37da032', - ], - ethClientAddress: rest.ethClientAddress?.replaceAll( - /127\.0\.0\.1|0\.0\.0\.0/g, - 'host.docker.internal', - ), - ethClientProxyAddress: rest.ethClientProxyAddress?.replaceAll( - /127\.0\.0\.1|0\.0\.0\.0/g, - 'host.docker.internal', - ), - http: { - ...rest.http, - addr: rest.http?.addr ?? '0.0.0.0', - api: rest.http?.api ?? ['eth', 'debug', 'web3'], - port, - }, - metrics: { - ...rest.metrics, - addr: rest.metrics?.addr ?? '0.0.0.0', - }, - uopool: { - ...rest.uopool, - addr: rest.uopool?.addr ?? '0.0.0.0', - }, - ws: { - ...rest.ws, - addr: rest.ws?.addr ?? '0.0.0.0', - api: rest.ws?.api ?? ['eth', 'debug', 'web3'], - port: rest.ws?.port ?? 4001, - }, - } satisfies Partial), - ] - - return await process.start(($) => $`docker run ${args_}`, { - ...options, - resolver({ process, resolve, reject }) { - process.stdout.on('data', (data) => { - const message = data.toString() - if (message.includes('Started bundler JSON-RPC server')) resolve() - }) - process.stderr.on('data', (data) => { - if (data.toString().includes('WARNING')) return - reject(data) - }) - }, - }) - }, - async stop() { - try { - rmSync(`${dataDir}/${port}`, { recursive: true, force: true }) - } catch {} - await process.stop() - }, - } -}) diff --git a/src/instances/stackup.test.ts b/src/instances/stackup.test.ts deleted file mode 100644 index 329ec95..0000000 --- a/src/instances/stackup.test.ts +++ /dev/null @@ -1,106 +0,0 @@ -import getPort from 'get-port' -import { afterEach, beforeAll, expect, test } from 'vitest' - -import { stackupOptions } from '../../test/utils.js' -import type { Instance } from '../instance.js' -import { anvil } from './anvil.js' -import { type StackupParameters, stackup } from './stackup.js' - -const instances: Instance[] = [] - -const port = await getPort() - -const defineInstance = (parameters?: Partial) => { - const instance = stackup({ - ...stackupOptions({ port, pool: false }), - ...parameters, - }) - instances.push(instance) - return instance -} - -beforeAll(() => anvil({ port }).start()) - -afterEach(async () => { - for (const instance of instances) await instance.stop().catch(() => {}) -}) - -test('default', async () => { - const messages: string[] = [] - const stdouts: string[] = [] - - const instance = defineInstance() - - instance.on('message', (m) => messages.push(m)) - instance.on('stdout', (m) => stdouts.push(m)) - - expect(instance.messages.get()).toMatchInlineSnapshot('[]') - - await instance.start() - expect(instance.status).toEqual('started') - - expect(messages.join('')).toBeDefined() - expect(stdouts.join('')).toBeDefined() - expect(instance.messages.get().join('')).toBeDefined() - - await instance.stop() - expect(instance.status).toEqual('stopped') - - expect(messages.join('')).toBeDefined() - expect(stdouts.join('')).toBeDefined() - expect(instance.messages.get()).toMatchInlineSnapshot('[]') -}) - -test('behavior: instance errored (duplicate ports)', async () => { - const instance_1 = defineInstance({ - port: 1337, - }) - const instance_2 = defineInstance({ - port: 1337, - }) - - await instance_1.start() - await expect(() => instance_2.start()).rejects.toThrowError() -}) - -test('behavior: start and stop multiple times', async () => { - const instance = defineInstance() - - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() -}) - -test('behavior: can subscribe to stderr', async () => { - const messages: string[] = [] - - const instance_1 = defineInstance({ port: 1337 }) - const instance_2 = defineInstance({ port: 1337 }) - - await instance_1.start() - instance_2.on('stderr', (message) => messages.push(message)) - await expect(instance_2.start()).rejects.toThrowError() -}) - -test('behavior: exit', async () => { - const instance = defineInstance() - - let exitCode: number | null | undefined = undefined - instance.on('exit', (code) => { - exitCode = code - }) - - await instance.start() - expect(instance.status).toEqual('started') - - instance._internal.process.kill() - - await new Promise((res) => setTimeout(res, 100)) - expect(instance.status).toEqual('stopped') - expect(typeof exitCode !== 'undefined').toBeTruthy() -}) diff --git a/src/instances/stackup.ts b/src/instances/stackup.ts deleted file mode 100644 index c6fb12c..0000000 --- a/src/instances/stackup.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { platform } from 'node:os' -import { defineInstance } from '../instance.js' -import { execa } from '../processes/execa.js' - -export type StackupParameters = { - /** - * The name of the native tracer to use during validation. This will be "bundlerCollectorTracer" if using builds from ERC-4337 execution client repo. - * Defaults to address of `privateKey`. - */ - beneficiary?: string | undefined - /** - * Directory to store the embedded database. - * @default /tmp/stackup_bundler - */ - dataDirectory?: string | undefined - /** - * RPC url to the execution client. - */ - ethClientUrl: string - /** - * A boolean value for bundlers on an Arbitrum stack network to properly account for the L1 callData cost. - * @default false - */ - isArbStackNetwork?: boolean | undefined - /** - * A boolean value for bundlers on an OP stack network to properly account for the L1 callData cost. - * @default false - */ - isOpStackNetwork?: boolean | undefined - /** - * A boolean value for bundlers on a network that supports RIP-7212 precompile for secp256r1 signature verification. - * @default false - */ - isRip7212Supported?: boolean | undefined - /** - * The maximum gas limit that can be submitted per UserOperation batch. - * @default 18_000_000 - */ - maxBatchGasLimit?: number | undefined - /** - * The maximum duration that a userOp can stay in the mempool before getting dropped. - * @default 180 - */ - maxOpTtlSeconds?: number | undefined - /** - * The maximum verificationGasLimit on a received UserOperation. - * @default 6_000_000 - */ - maxVerificationGas?: number | undefined - /** - * The maximum block range when looking up a User Operation with eth_getUserOperationReceipt or eth_getUserOperationByHash. - * - * Higher limits allow for fetching older User Operations but will result in higher request latency due to additional compute on the underlying node. - * - * @default 2_000 - */ - opLookupLimit?: number | undefined - /** - * Port to start the instance on. - */ - port?: number | undefined - /** - * The private key for the EOA used to relay User Operation bundles to the EntryPoint. - */ - privateKey: string - /** - * EntryPoint addresses to support. The first address is the preferred EntryPoint. - */ - supportedEntryPoints?: string[] -} - -/** - * Defines an Anvil instance. - * - * @example - * ```ts - * const instance = stackup({ - * ethClientUrl: 'http://localhost:8545', - * port: 4337, - * privateKey: '0x...' - * }) - * await instance.start() - * // ... - * await instance.stop() - * ``` - */ -export const stackup = defineInstance((parameters?: StackupParameters) => { - const args = (parameters || {}) as StackupParameters - - const host = 'localhost' - const name = 'stackup' - const process = execa({ name }) - - return { - _internal: { - args, - get process() { - return process._internal.process - }, - }, - host, - name, - port: args.port ?? 4337, - async start({ port = args.port }, options) { - const args_ = [ - ...(platform() === 'linux' ? ['--net', 'host'] : []), - '--add-host', - 'host.docker.internal:host-gateway', - '--add-host', - 'localhost:host-gateway', - '-p', - `${port}:${port}`, - '-e', - `ERC4337_BUNDLER_PORT=${port}`, - ...Object.entries(args).flatMap(([key, value]) => { - if (key === 'port') return [] - if (value === undefined) return [] - - if (key === 'ethClientUrl') - value = (value as string).replaceAll( - /127\.0\.0\.1|0\.0\.0\.0/g, - 'host.docker.internal', - ) - if (key === 'privateKey') value = (value as string).replace('0x', '') - - return [ - '-e', - `ERC4337_BUNDLER_${key - .replace(/([a-z])([A-Z])/g, '$1_$2') - .toUpperCase()}=${value}`, - ] - }), - 'stackupwallet/stackup-bundler:latest', - '/app/stackup-bundler', - 'start', - '--mode', - 'private', - ] - return await process.start(($) => $`docker run ${args_}`, { - ...options, - resolver({ process, resolve, reject }) { - process.stderr.on('data', async (data) => { - const message = data.toString() - // For some reason, `stackup-bundler` logs to stderr. So we have to try - // and dissect what is an error, and what is not. 😅 - if (message.includes('Set nextTxnTs to')) - setTimeout(() => resolve(), 100) - else if ( - message - .toLowerCase() - .match(/panic|error|connection refused|address already in use/) - ) - reject(data) - }) - }, - }) - }, - async stop() { - await process.stop() - }, - } -}) diff --git a/src/package.json b/src/package.json index 8c3345c..aa969f5 100644 --- a/src/package.json +++ b/src/package.json @@ -8,7 +8,7 @@ "typings": "_lib/exports/index.d.ts", "sideEffects": false, "engines": { - "node": ">=22" + "node": ">=24" }, "exports": { ".": { @@ -43,7 +43,10 @@ "license": "MIT", "homepage": "https://wevm.dev", "repository": "wevm/prool", - "authors": ["awkweb", "jxom"], + "authors": [ + "awkweb", + "jxom" + ], "funding": [ { "type": "github", diff --git a/src/pool.test.ts b/src/pool.test.ts index 8f00b71..f9f9d08 100644 --- a/src/pool.test.ts +++ b/src/pool.test.ts @@ -1,11 +1,10 @@ import getPort from 'get-port' import { afterEach, beforeAll, describe, expect, test } from 'vitest' -import { altoOptions, rundlerOptions, stackupOptions } from '../test/utils.js' +import { altoOptions, rundlerOptions } from '../test/utils.js' import { rundler } from './exports/instances.js' import { alto } from './instances/alto.js' import { anvil } from './instances/anvil.js' -import { stackup } from './instances/stackup.js' import { definePool } from './pool.js' import { createServer } from './server.js' @@ -16,7 +15,7 @@ beforeAll(() => createServer({ instance: anvil({ chainId: 1, - forkUrl: process.env.VITE_FORK_URL ?? 'https://eth.merkle.io', + forkUrl: process.env['VITE_FORK_URL'] ?? 'https://eth.merkle.io', }), port, }).start(), @@ -35,9 +34,6 @@ describe.each([ { instance: alto(altoOptions({ port, pool: true })), }, - { - instance: stackup(stackupOptions({ port, pool: true })), - }, { instance: rundler(rundlerOptions({ port, pool: true })), }, diff --git a/src/pool.ts b/src/pool.ts index 533a994..5a8c871 100644 --- a/src/pool.ts +++ b/src/pool.ts @@ -14,7 +14,10 @@ export type Pool = Pick< destroy(key: key): Promise destroyAll(): Promise restart(key: key): Promise - start(key: key, options?: { port?: number }): Promise + start( + key: key, + options?: { port?: number | undefined } | undefined, + ): Promise stop(key: key): Promise stopAll(): Promise } @@ -25,7 +28,7 @@ export type DefinePoolParameters< /** Instance for the pool. */ instance: Instance | ((key: key) => Instance) /** The maximum number of instances that can be started. */ - limit?: number | number + limit?: number | undefined } export type DefinePoolReturnType< diff --git a/src/processes/execa.test.ts b/src/processes/execa.test.ts index a373812..51ef52f 100644 --- a/src/processes/execa.test.ts +++ b/src/processes/execa.test.ts @@ -82,14 +82,7 @@ test('start (error)', async () => { process.stderr.on('data', reject) }, }), - ).rejects.toThrowErrorMatchingInlineSnapshot(` - [Error: Failed to start process "foo": error: unexpected argument '--lol' found - - Usage: anvil [OPTIONS] [COMMAND] - - For more information, try '--help'. - ] - `) + ).rejects.toThrowError('Failed to start process "foo"') await expect(resolvers.message.promise).resolves.toBeDefined() await expect(resolvers.stderr.promise).resolves.toBeDefined() }) diff --git a/src/processes/execa.ts b/src/processes/execa.ts index ab68c3e..07fad6d 100644 --- a/src/processes/execa.ts +++ b/src/processes/execa.ts @@ -1,5 +1,5 @@ import type { SignalConstants } from 'node:os' -import { type ResultPromise, execa as exec } from 'execa' +import { execa as exec, type ResultPromise } from 'execa' import type { InstanceStartOptions_internal } from '../instance.js' import { stripColors } from '../utils.js' diff --git a/src/server.test.ts b/src/server.test.ts index 7986b17..70dfa42 100644 --- a/src/server.test.ts +++ b/src/server.test.ts @@ -1,16 +1,10 @@ import getPort from 'get-port' import { beforeAll, describe, expect, test } from 'vitest' import { type MessageEvent, WebSocket } from 'ws' -import { - altoOptions, - rundlerOptions, - siliusOptions, - stackupOptions, -} from '../test/utils.js' -import { rundler, silius } from './exports/instances.js' +import { altoOptions, rundlerOptions } from '../test/utils.js' import { alto } from './instances/alto.js' import { anvil } from './instances/anvil.js' -import { stackup } from './instances/stackup.js' +import { rundler } from './instances/rundler.js' import { createServer } from './server.js' const port = await getPort() @@ -19,7 +13,7 @@ beforeAll(async () => { await createServer({ instance: anvil({ chainId: 1, - forkUrl: process.env.VITE_FORK_URL ?? 'https://eth.merkle.io', + forkUrl: process.env['VITE_FORK_URL'] ?? 'https://eth.merkle.io', }), port, }).start() @@ -30,9 +24,6 @@ describe.each([ { instance: alto(altoOptions({ port, pool: true })), }, - { - instance: stackup(stackupOptions({ port, pool: true })), - }, { instance: rundler(rundlerOptions({ port, pool: true })), }, @@ -413,41 +404,6 @@ describe("instance: 'alto'", () => { }) }) -describe("instance: 'stackup'", () => { - test('request: /{id}', async () => { - const server = createServer({ - instance: stackup(stackupOptions({ port, pool: true })), - }) - - const stop = await server.start() - const { port: port_2 } = server.address()! - const response = await fetch(`http://localhost:${port_2}/1`, { - body: JSON.stringify({ - method: 'eth_supportedEntryPoints', - params: [], - id: 0, - jsonrpc: '2.0', - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - expect(response.status).toBe(200) - expect(await response.json()).toMatchInlineSnapshot(` - { - "id": 0, - "jsonrpc": "2.0", - "result": [ - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - ], - } - `) - - await stop() - }) -}) - describe("instance: 'rundler'", () => { test('request: /{id}', async () => { const server = createServer({ @@ -483,45 +439,6 @@ describe("instance: 'rundler'", () => { }) }) -describe("instance: 'silius'", () => { - test( - 'request: /{id}', - async () => { - const server = createServer({ - instance: silius(siliusOptions({ port, pool: true })), - }) - - const stop = await server.start() - const { port: port_2 } = server.address()! - const response = await fetch(`http://localhost:${port_2}/1`, { - body: JSON.stringify({ - method: 'eth_supportedEntryPoints', - params: [], - id: 0, - jsonrpc: '2.0', - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - expect(response.status).toBe(200) - expect(await response.json()).toMatchInlineSnapshot(` - { - "id": 0, - "jsonrpc": "2.0", - "result": [ - "0x0000000071727De22E5E9d8BAf0edAc6f37da032", - ], - } - `) - - await stop() - }, - { timeout: 10_000 }, - ) -}) - test('404', async () => { const server = createServer({ instance: anvil(), diff --git a/src/server.ts b/src/server.ts index 34f64b7..5276e8c 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,8 +1,8 @@ import { + createServer as createServer_, type IncomingMessage, type Server, type ServerResponse, - createServer as createServer_, } from 'node:http' import type { AddressInfo } from 'node:net' import httpProxy from 'http-proxy' diff --git a/src/utils.test.ts b/src/utils.test.ts index 4b8e62e..b9d3f66 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -43,12 +43,12 @@ test.each([ [{ foo: { barBaz: 'test' } }, { casing: 'snake' }], ['--foo.bar_baz', 'test'], ], -] as [Parameters, string[]][])( - 'toArgs(%o) -> %o', - ([input, options], expected) => { - expect(toArgs(input, options)).toEqual(expected) - }, -) +] as [Parameters, string[]][])('toArgs(%o) -> %o', ([ + input, + options, +], expected) => { + expect(toArgs(input, options)).toEqual(expected) +}) test.each([ ['foo', '--foo'], diff --git a/src/utils.ts b/src/utils.ts index b9253a5..9a4e826 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -30,7 +30,7 @@ export function extractPath(request: string): ExtractPathReturnType { } const ansiColorRegex = - // biome-ignore lint/suspicious/noControlCharactersInRegex: + // biome-ignore lint/suspicious/noControlCharactersInRegex: _ /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g /** diff --git a/test/utils.ts b/test/utils.ts index 22b9d21..2a97496 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,5 +1,3 @@ -import { resolve } from 'node:path' - const poolId = Math.floor(Math.random() * 10000) export const altoOptions = ({ port, pool }: { port: number; pool: boolean }) => @@ -16,7 +14,10 @@ export const altoOptions = ({ port, pool }: { port: number; pool: boolean }) => export const rundlerOptions = ({ port, pool, -}: { port: number; pool: boolean }) => +}: { + port: number + pool: boolean +}) => ({ nodeHttp: `http://localhost:${port}${pool ? `/${poolId}` : ''}`, builder: { @@ -24,25 +25,3 @@ export const rundlerOptions = ({ '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', }, }) as const - -export const siliusOptions = ({ - port, - pool, -}: { port: number; pool: boolean }) => - ({ - ethClientAddress: `http://localhost:${port}${pool ? `/${poolId}` : ''}`, - mnemonicPath: resolve( - import.meta.dirname, - './silius/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', - ), - }) as const - -export const stackupOptions = ({ - port, - pool, -}: { port: number; pool: boolean }) => - ({ - ethClientUrl: `http://localhost:${port}${pool ? `/${poolId}` : ''}`, - privateKey: - '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', - }) as const diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index 18513c9..0000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - // This tsconfig file contains the shared config for the build (tsconfig.build.json) and type checking (tsconfig.json) config. - "include": [], - "compilerOptions": { - // Incremental builds - // NOTE: Enabling incremental builds speeds up `tsc`. Keep in mind though that it does not reliably bust the cache when the `tsconfig.json` file changes. - "incremental": true, - - // Type checking - "strict": true, - "useDefineForClassFields": true, // Not enabled by default in `strict` mode unless we bump `target` to ES2022. - "noFallthroughCasesInSwitch": true, // Not enabled by default in `strict` mode. - "noImplicitReturns": true, // Not enabled by default in `strict` mode. - "noUncheckedIndexedAccess": true, - "useUnknownInCatchVariables": true, // TODO: This would normally be enabled in `strict` mode but would require some adjustments to the codebase. - "noImplicitOverride": true, // Not enabled by default in `strict` mode. - "noUnusedLocals": true, // Not enabled by default in `strict` mode. - "noUnusedParameters": true, // Not enabled by default in `strict` mode. - - // JavaScript support - "allowJs": false, - "checkJs": false, - - // Interop constraints - "esModuleInterop": false, - "allowSyntheticDefaultImports": false, - "forceConsistentCasingInFileNames": true, - "verbatimModuleSyntax": true, - "importHelpers": true, // This is only used for build validation. Since we do not have `tslib` installed, this will fail if we accidentally make use of anything that'd require injection of helpers. - - // Language and environment - "moduleResolution": "NodeNext", - "module": "NodeNext", - "target": "ESNext", - "lib": ["ESNext"], - "types": ["@types/node"], - - // Skip type checking for node modules - "skipLibCheck": true - - // "noErrorTruncation": true - } -} diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index a3894fc..0000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - // This file is used to compile the for cjs and esm (see package.json build scripts). It should exclude all test files. - "extends": "./tsconfig.base.json", - "include": ["src"], - "exclude": [ - "src/**/*.test.ts", - "src/**/*.test-d.ts" - ], - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "outDir": "./src/_lib", - "rootDir": "./src" - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 32813c8..51506fe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,40 @@ { - // This configuration is used for local development and type checking. - "extends": "./tsconfig.base.json", - "include": ["src", "test"] + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "moduleResolution": "nodenext", + "target": "esnext", + "paths": { + "prool": ["./src/index.ts"] + }, + "types": ["node", "vitest/globals"], + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + "noImplicitReturns": true, + "noImplicitOverride": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noEmit": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true + } } From d12ee6b691444b6f5770ae1ef39291a4ecb7d379 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 10:33:02 +1100 Subject: [PATCH 02/21] chore: refactor actions; zile --- .github/install-dependencies/action.yml | 17 + .github/workflows/close-issue.yml | 18 -- .github/workflows/label-issue.yml | 25 -- .github/workflows/main.yml | 42 +++ .github/workflows/on-push-to-main.yml | 61 ---- .github/workflows/prerelease.yml | 18 ++ .../{on-pull-request.yml => pull-request.yml} | 4 +- .github/workflows/verify.yml | 43 +-- .gitignore | 1 + src/CHANGELOG.md => CHANGELOG.md | 0 LICENSE | 1 - src/LICENSE => LICENSE.md | 2 +- README.md | 299 +++++++++++++++++- package.json | 83 ++++- pnpm-lock.yaml | 103 ++++-- src/README.md | 288 ----------------- src/exports/instances.test.ts | 2 +- src/instance.ts | 2 +- src/package.json | 57 ---- src/server.test.ts | 10 +- ...0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 | 1 - 21 files changed, 542 insertions(+), 535 deletions(-) create mode 100644 .github/install-dependencies/action.yml delete mode 100644 .github/workflows/close-issue.yml delete mode 100644 .github/workflows/label-issue.yml create mode 100644 .github/workflows/main.yml delete mode 100644 .github/workflows/on-push-to-main.yml create mode 100644 .github/workflows/prerelease.yml rename .github/workflows/{on-pull-request.yml => pull-request.yml} (87%) rename src/CHANGELOG.md => CHANGELOG.md (100%) delete mode 120000 LICENSE rename src/LICENSE => LICENSE.md (99%) mode change 120000 => 100644 README.md delete mode 100644 src/README.md delete mode 100644 src/package.json delete mode 100644 test/silius/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 diff --git a/.github/install-dependencies/action.yml b/.github/install-dependencies/action.yml new file mode 100644 index 0000000..4123032 --- /dev/null +++ b/.github/install-dependencies/action.yml @@ -0,0 +1,17 @@ +name: 'Install dependencies' +description: 'Prepare repository and all dependencies' + +runs: + using: 'composite' + steps: + - name: Set up pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '24.5' + + - name: Install dependencies + shell: bash + run: pnpm install diff --git a/.github/workflows/close-issue.yml b/.github/workflows/close-issue.yml deleted file mode 100644 index 29a6544..0000000 --- a/.github/workflows/close-issue.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Close Issue - -on: - workflow_dispatch: - schedule: - - cron: '0 0 * * *' - -jobs: - close-issues: - runs-on: ubuntu-latest - steps: - - name: Needs Reproduction - uses: actions-cool/issues-helper@v3 - with: - actions: 'close-issues' - token: ${{ secrets.GITHUB_TOKEN }} - labels: 'M: Needs Reproduction' - inactive-day: 3 diff --git a/.github/workflows/label-issue.yml b/.github/workflows/label-issue.yml deleted file mode 100644 index 29b7e31..0000000 --- a/.github/workflows/label-issue.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Label Issue - -on: - issues: - types: [labeled] - -jobs: - reply-labeled: - runs-on: ubuntu-latest - steps: - - name: Label needs reproduction - if: github.event.label.name == 'Needs Reproduction' - uses: peter-evans/close-issue@v3 - with: - close-reason: not_planned - comment: | - Hello @${{ github.event.issue.user.login }}. - - Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using [StackBlitz](https://stackblitz.com), [TypeScript Playground](https://www.typescriptlang.org/play) (for type issues), or a separate minimal GitHub repository. - - Minimal reproductions are required as they save us a lot of time reproducing your config & environment, and trying to reproduce your issue. See [Why reproductions are required](https://antfu.me/posts/why-reproductions-are-required). - - Please reopen this issue when a reproduction is added. - issue-number: ${{ github.event.issue.number }} - token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..77dcf86 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,42 @@ +name: Main +on: + push: + branches: [main] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + verify: + name: Verify + uses: ./.github/workflows/verify.yml + secrets: inherit + + changesets: + name: Changesets + needs: verify + permissions: + contents: write + id-token: write + pull-requests: write + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Clone repository + uses: actions/checkout@v4 + + - name: Install dependencies + uses: ./.github/actions/install-dependencies + + - name: PR or publish + id: changesets + uses: changesets/action@v1 + with: + title: 'chore: version packages' + commit: 'chore: version packages' + publish: pnpm run changeset:publish + version: pnpm run changeset:version + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/on-push-to-main.yml b/.github/workflows/on-push-to-main.yml deleted file mode 100644 index 7ce37ca..0000000 --- a/.github/workflows/on-push-to-main.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Main -on: - push: - branches: [main] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - verify: - name: Verify - uses: ./.github/workflows/verify.yml - secrets: inherit - - changesets: - name: Changesets - needs: verify - permissions: - contents: write - id-token: write - issues: write - repository-projects: write - deployments: write - packages: write - pull-requests: write - runs-on: ubuntu-latest - timeout-minutes: 5 - - steps: - - name: Clone repository - uses: actions/checkout@v4 - with: - # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits - fetch-depth: 0 - - - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main - with: - node-version: 24.5 - - - name: Create version pull request or publish to npm - uses: changesets/action@v1 - with: - title: 'chore: version packages' - commit: 'chore: version packages' - publish: pnpm changeset:release - version: pnpm changeset:version - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Publish Prerelease - if: steps.changesets.outputs.published != 'true' - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - git reset --hard origin/main - pnpm clean - pnpm changeset version --no-git-tag --snapshot canary - pnpm changeset publish --no-git-tag --snapshot canary --tag canary diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml new file mode 100644 index 0000000..43134b5 --- /dev/null +++ b/.github/workflows/prerelease.yml @@ -0,0 +1,18 @@ +name: Prerelease +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Clone repository + uses: actions/checkout@v4 + + - name: Install dependencies + uses: ./.github/actions/install-dependencies + + - name: Prerelease + run: | + pnpm run build + pnpx pkg-pr-new publish --pnpm diff --git a/.github/workflows/on-pull-request.yml b/.github/workflows/pull-request.yml similarity index 87% rename from .github/workflows/on-pull-request.yml rename to .github/workflows/pull-request.yml index 0b555d2..64e1a66 100644 --- a/.github/workflows/on-pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,4 +1,4 @@ -name: Pull request +name: Pull Request on: pull_request: types: [opened, reopened, synchronize, ready_for_review] @@ -11,4 +11,4 @@ jobs: verify: name: Verify uses: ./.github/workflows/verify.yml - secrets: inherit \ No newline at end of file + secrets: inherit diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 03f70e7..2360c9c 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -4,49 +4,22 @@ on: workflow_dispatch: jobs: - lint: - name: Lint + checks: + name: Checks runs-on: ubuntu-latest - timeout-minutes: 5 steps: - name: Clone repository uses: actions/checkout@v4 - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main - with: - node-version: 22 + uses: ./.github/actions/install-dependencies - - name: Lint code - run: pnpm lint - - - uses: stefanzweifel/git-auto-commit-action@v5 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - commit_message: 'chore: format' - commit_user_name: 'github-actions[bot]' - commit_user_email: 'github-actions[bot]@users.noreply.github.com' - - types: - name: Types - runs-on: ubuntu-latest - - steps: - - name: Clone repository - uses: actions/checkout@v4 - - - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main - with: - node-version: 22 + - name: Check code + run: pnpm check - - name: Build - run: pnpm build - - name: Check types - run: pnpm typecheck + run: pnpm check:types test: name: Test @@ -56,9 +29,7 @@ jobs: uses: actions/checkout@v4 - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main - with: - node-version: 22 + uses: ./.github/actions/install-dependencies - name: Set up Foundry uses: foundry-rs/foundry-toolchain@v1 diff --git a/.gitignore b/.gitignore index f1be30c..ece6d9f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .local _lib coverage +dist node_modules tsconfig.*.tsbuildinfo tsconfig.tsbuildinfo \ No newline at end of file diff --git a/src/CHANGELOG.md b/CHANGELOG.md similarity index 100% rename from src/CHANGELOG.md rename to CHANGELOG.md diff --git a/LICENSE b/LICENSE deleted file mode 120000 index da348fc..0000000 --- a/LICENSE +++ /dev/null @@ -1 +0,0 @@ -src/LICENSE \ No newline at end of file diff --git a/src/LICENSE b/LICENSE.md similarity index 99% rename from src/LICENSE rename to LICENSE.md index 4116d58..4946416 100644 --- a/src/LICENSE +++ b/LICENSE.md @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 120000 index 351df1d..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -src/README.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2df2a5d --- /dev/null +++ b/README.md @@ -0,0 +1,298 @@ +
+ +

+ + + mipd logo + +

+ +

+ HTTP testing instances for Ethereum +

+ +

+ + + + Version + + + + + + MIT License + + + + + + Downloads per month + + +

+ +## Introduction + +Prool is a library that provides programmatic HTTP testing instances for Ethereum. It is designed to be used in testing environments (e.g. [Vitest](https://vitest.dev/)) where you need to interact with an Ethereum server instance (e.g. Execution Node, 4337 Bundler, Indexer, etc) over HTTP or WebSocket. + +Prool contains a set of pre-configured instances that can be used to simulate Ethereum server environments, being: + +- **Local Execution Nodes:** [`anvil`](#anvil-execution-node) +- **Bundler Nodes:** [`alto`](#alto-bundler-node), [`rundler`](#rundler-bundler-node) +- **Indexer Nodes:** `ponder`⚠️ + +⚠️ = soon + +You can also create your own custom instances by using the [`defineInstance` function](#defineinstance). + +## Table of Contents + +- [Install](#install) +- [Getting Started](#getting-started) + - [Anvil (Execution Node)](#anvil-execution-node) + - [Alto (Bundler Node)](#alto-bundler-node) + - [Rundler (Bundler Node)](#rundler-bundler-node) +- [Reference](#reference) + - [`createServer`](#createserver) + - [`defineInstance`](#defineinstance) + - [`definePool`](#definepool) + + +## Install + +```bash +npm i prool +``` + +```bash +pnpm add prool +``` + +```bash +bun i prool +``` + +## Getting Started + +### Anvil (Execution Node) + +#### Requirements + +- [Foundry](https://getfoundry.sh/) binary installed + - Download: `curl -L https://foundry.paradigm.xyz | bash` + +#### Usage + +```ts +import { createServer } from 'prool' +import { anvil } from 'prool/instances' + +const server = createServer({ + instance: anvil(), +}) + +await server.start() +// Instances accessible at: +// "http://localhost:8545/1" +// "http://localhost:8545/2" +// "http://localhost:8545/3" +// "http://localhost:8545/n" +``` + +#### Parameters + +See [`AnvilParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/anvil.ts#L5). + +### Alto (Bundler Node) + +#### Requirements + +- [`@pimlico/alto`](npm.im/@pimlico/alto): `npm i @pimlico/alto` + +#### Usage + +```ts +import { createServer } from 'prool' +import { anvil, alto } from 'prool/instances' + +const executionServer = createServer({ + instance: anvil(), + port: 8545 +}) +await executionServer.start() +// Instances accessible at: +// "http://localhost:8545/1" +// "http://localhost:8545/2" +// "http://localhost:8545/3" +// "http://localhost:8545/n" + +const bundlerServer = createServer({ + instance: (key) => alto({ + entrypoints: ['0x0000000071727De22E5E9d8BAf0edAc6f37da032'], + rpcUrl: `http://localhost:8545/${key}`, + executorPrivateKeys: ['0x...'], + }) +}) +await bundlerServer.start() +// Instances accessible at: +// "http://localhost:3000/1" (→ http://localhost:8545/1) +// "http://localhost:3000/2" (→ http://localhost:8545/2) +// "http://localhost:3000/3" (→ http://localhost:8545/3) +// "http://localhost:3000/n" (→ http://localhost:8545/n) +``` + +#### Parameters + +See [`AltoParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/alto.ts#L7). + +### Rundler (Bundler Node) + +#### Requirements + +- [Rundler](https://github.com/alchemyplatform/rundler) binary installed + - [Download](https://github.com/alchemyplatform/rundler/releases) + +#### Usage + +```ts +import { createServer } from 'prool' +import { anvil, rundler } from 'prool/instances' + +const executionServer = createServer({ + instance: anvil(), + port: 8545 +}) +await executionServer.start() +// Instances accessible at: +// "http://localhost:8545/1" +// "http://localhost:8545/2" +// "http://localhost:8545/3" +// "http://localhost:8545/n" + +const bundlerServer = createServer({ + instance: (key) => rundler({ + nodeHttp: `http://localhost:8545/${key}`, + }) +}) +await bundlerServer.start() +// Instances accessible at: +// "http://localhost:3000/1" (→ http://localhost:8545/1) +// "http://localhost:3000/2" (→ http://localhost:8545/2) +// "http://localhost:3000/3" (→ http://localhost:8545/3) +// "http://localhost:3000/n" (→ http://localhost:8545/n) +``` + +#### Parameters + +See [RundlerParameters](). + +## Reference + +### `createServer` + +Creates a server that manages a pool of instances via a proxy. + +#### Usage + +```ts +import { createServer } from 'prool' +import { anvil } from 'prool/instances' + +const executionServer = createServer({ + instance: anvil(), +}) +await executionServer.start() +// Instances accessible at: +// "http://localhost:8545/1" +// "http://localhost:8545/2" +// "http://localhost:8545/3" +// "http://localhost:8545/n" +// "http://localhost:8545/n/start" +// "http://localhost:8545/n/stop" +// "http://localhost:8545/n/restart" +// "http://localhost:8545/healthcheck" +``` + +**Endpoints:** +- `/:key`: Proxy to instance at `key`. +- `/:key/start`: Start instance at `key`. +- `/:key/stop`: Stop instance at `key`. +- `/:key/restart`: Restart instance at `key`. +- `/healthcheck`: Healthcheck endpoint. + +#### API + +| Name | Description | Type | +| ---------- | -------------------------------------------------------- | --------------------------------------- | +| `instance` | Instance for the server. | `Instance \| (key: number) => Instance` | +| `limit` | Number of instances that can be instantiated in the pool | `number` | +| `host` | Host for the server. | `string` | +| `port` | Port for the server. | `number` | +| returns | Server | `CreateServerReturnType` | + +### `defineInstance` + +Creates an instance definition, that can be used with [`createServer`](#createserver) or [`definePool`](#definepool). + +#### Usage + +```ts +import { defineInstance } from 'prool' + +const foo = defineInstance((parameters: FooParameters) => { + return { + name: 'foo', + host: 'localhost', + port: 3000, + async start() { + // ... + }, + async stop() { + // ... + }, + } +}) +``` + +#### API + +| Name | Description | Type | +| ------- | -------------------- | ------------------ | +| `fn` | Instance definition. | `DefineInstanceFn` | +| returns | Instance. | `Instance` | + +### `definePool` + +Defines a pool of instances. Instances can be started, cached, and stopped against an identifier. + +#### Usage + +```ts +import { definePool } from 'prool' +import { anvil } from 'prool/instances' + +const pool = definePool({ + instance: anvil(), +}) +const instance_1 = await pool.start(1) +const instance_2 = await pool.start(2) +const instance_3 = await pool.start(3) +``` + +#### API + +| Name | Description | Type | +| ---------- | -------------------------------------------------------- | ---------- | +| `instance` | Instance for the pool. | `Instance` | +| `limit` | Number of instances that can be instantiated in the pool | `number` | +| returns | Pool. | `Pool` | + +## Authors + +- [@jxom](https://github.com/jxom) (jxom.eth, [Twitter](https://twitter.com/jakemoxey)) +- [@tmm](https://github.com/tmm) (awkweb.eth, [Twitter](https://twitter.com/awkweb)) + +## License + +[MIT](/LICENSE) License \ No newline at end of file diff --git a/package.json b/package.json index 865f457..5920d49 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,13 @@ { - "name": "prool", - "type": "module", "scripts": { - "build": "pnpm clean && tsc --project ./tsconfig.build.json", - "changeset": "changeset", - "changeset:release": "pnpm build && changeset publish", - "changeset:version": "changeset version && pnpm install --lockfile-only && pnpm format", - "check": "biome check .", - "check:types": "tsc --noEmit", - "clean": "rm -rf src/_lib src/tsconfig.build.tsbuildinfo", - "test": "vitest --testTimeout 10000", - "test:cov": "vitest --coverage" + "build": "zile", + "changeset:publish": "zile publish:prepare && changeset publish && zile publish:post", + "changeset:version": "changeset version", + "check": "biome check --fix --unsafe", + "check:types": "tsc", + "dev": "zile dev", + "postinstall": "pnpm dev", + "test": "vitest" }, "devDependencies": { "@biomejs/biome": "^2.3.8", @@ -23,7 +20,67 @@ "@vitest/coverage-v8": "^1.6.0", "typescript": "^5.9.3", "vitest": "^1.6.0", - "ws": "^8.18.3" + "ws": "^8.18.3", + "zile": "^0.0.13" + }, + "packageManager": "pnpm@10.25.0", + "[!start-pkg]": "", + "name": "prool", + "description": "HTTP testing instances for Ethereum", + "version": "0.0.25", + "type": "module", + "sideEffects": false, + "engines": { + "node": ">=22" + }, + "exports": { + ".": { + "src": "./src/exports/index.ts", + "types": "./dist/exports/index.d.ts", + "default": "./dist/exports/index.js" + }, + "./processes": { + "src": "./src/exports/processes.ts", + "types": "./dist/exports/processes.d.ts", + "default": "./dist/exports/processes.js" + }, + "./instances": { + "src": "./src/exports/instances.ts", + "types": "./dist/exports/instances.d.ts", + "default": "./dist/exports/instances.js" + } + }, + "dependencies": { + "change-case": "5.4.4", + "eventemitter3": "^5.0.1", + "execa": "^9.1.0", + "get-port": "^7.1.0", + "http-proxy": "^1.18.1", + "tar": "7.2.0" + }, + "peerDependencies": { + "@pimlico/alto": "*" + }, + "peerDependenciesMeta": { + "@pimlico/alto": { + "optional": true + } }, - "packageManager": "pnpm@10.25.0" + "license": "MIT", + "homepage": "https://wevm.dev", + "repository": "wevm/prool", + "authors": [ + "awkweb", + "jxom" + ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "keywords": [], + "main": "./dist/exports/index.js", + "module": "./dist/exports/index.js", + "types": "./dist/exports/index.d.ts" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 909c791..6136270 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,25 @@ settings: importers: .: + dependencies: + change-case: + specifier: 5.4.4 + version: 5.4.4 + eventemitter3: + specifier: ^5.0.1 + version: 5.0.1 + execa: + specifier: ^9.1.0 + version: 9.1.0 + get-port: + specifier: ^7.1.0 + version: 7.1.0 + http-proxy: + specifier: ^1.18.1 + version: 1.18.1 + tar: + specifier: 7.2.0 + version: 7.2.0 devDependencies: '@biomejs/biome': specifier: ^2.3.8 @@ -41,27 +60,9 @@ importers: ws: specifier: ^8.18.3 version: 8.18.3 - - src: - dependencies: - change-case: - specifier: 5.4.4 - version: 5.4.4 - eventemitter3: - specifier: ^5.0.1 - version: 5.0.1 - execa: - specifier: ^9.1.0 - version: 9.1.0 - get-port: - specifier: ^7.1.0 - version: 7.1.0 - http-proxy: - specifier: ^1.18.1 - version: 1.18.1 - tar: - specifier: 7.2.0 - version: 7.2.0 + zile: + specifier: ^0.0.13 + version: 0.0.13(typescript@5.9.3) packages: @@ -210,6 +211,12 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@clack/core@1.0.0-alpha.7': + resolution: {integrity: sha512-3vdh6Ar09D14rVxJZIm3VQJkU+ZOKKT5I5cC0cOVazy70CNyYYjiwRj9unwalhESndgxx6bGc/m6Hhs4EKF5XQ==} + + '@clack/prompts@1.0.0-alpha.8': + resolution: {integrity: sha512-YZGC4BmTKSF5OturNKEz/y4xNjYGmGk6NI785CQucJ7OEdX0qbMmL/zok+9bL6c7qE3WSYffyK5grh2RnkGNtQ==} + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -1942,6 +1949,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2071,6 +2081,16 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} @@ -2251,6 +2271,18 @@ packages: resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} engines: {node: '>=18'} + zile@0.0.13: + resolution: {integrity: sha512-a6F5jiKqSd12kf/n1bVIjLpP5FbKr2g1sgdfysMvT+cpyjz0uN6ChY0HX93+7d0OkFa7UX+eiqBJG4ZPVlcIww==} + hasBin: true + peerDependencies: + '@typescript/native-preview': '>=7.0.0' + typescript: '>=5' + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + typescript: + optional: true + zod-validation-error@1.5.0: resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} engines: {node: '>=16.0.0'} @@ -2483,6 +2515,17 @@ snapshots: human-id: 4.1.3 prettier: 2.8.8 + '@clack/core@1.0.0-alpha.7': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@1.0.0-alpha.8': + dependencies: + '@clack/core': 1.0.0-alpha.7 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@esbuild/aix-ppc64@0.20.2': optional: true @@ -3476,7 +3519,7 @@ snapshots: execa@9.1.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 7.0.0 @@ -3574,7 +3617,7 @@ snapshots: foreground-child@3.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 forwarded@0.2.0: {} @@ -4274,6 +4317,8 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + slash@3.0.0: {} sonic-boom@3.8.1: @@ -4390,6 +4435,10 @@ snapshots: tr46@0.0.3: {} + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tslib@2.6.3: {} type-detect@4.0.8: {} @@ -4544,6 +4593,14 @@ snapshots: yoctocolors@2.0.2: {} + zile@0.0.13(typescript@5.9.3): + dependencies: + '@clack/prompts': 1.0.0-alpha.8 + cac: 6.7.14 + tsconfck: 3.1.6(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + zod-validation-error@1.5.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/src/README.md b/src/README.md deleted file mode 100644 index e1319bb..0000000 --- a/src/README.md +++ /dev/null @@ -1,288 +0,0 @@ -
- -

- - - mipd logo - -

- -

- HTTP testing instances for Ethereum -

- -

- - - - Version - - - - - - MIT License - - - - - - Downloads per month - - -

- -## Introduction - -Prool is a library that provides programmatic HTTP testing instances for Ethereum. It is designed to be used in testing environments (e.g. [Vitest](https://vitest.dev/)) where you need to interact with an Ethereum server instance (e.g. Execution Node, 4337 Bundler, Indexer, etc) over HTTP or WebSocket. - -## Table of Contents - -- [Install](#install) -- [Getting Started](#getting-started) - - [Anvil (Execution Node)](#anvil-execution-node) - - [Alto (Bundler Node)](#alto-bundler-node) - - [Rundler (Bundler Node)](#rundler-bundler-node) -- [Reference](#reference) - - [`createServer`](#createserver) - - [`defineInstance`](#defineinstance) - - [`definePool`](#definepool) - - -## Install - -```bash -npm i prool -``` - -```bash -pnpm add prool -``` - -```bash -bun i prool -``` - -## Getting Started - -### Anvil (Execution Node) - -#### Requirements - -- [Foundry](https://getfoundry.sh/) binary installed - - Download: `curl -L https://foundry.paradigm.xyz | bash` - -#### Usage - -```ts -import { createServer } from 'prool' -import { anvil } from 'prool/instances' - -const server = createServer({ - instance: anvil(), -}) - -await server.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" -``` - -#### Parameters - -See [`AnvilParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/anvil.ts#L5). - -### Alto (Bundler Node) - -#### Requirements - -- [`@pimlico/alto`](npm.im/@pimlico/alto): `npm i @pimlico/alto` - -#### Usage - -```ts -import { createServer } from 'prool' -import { anvil, alto } from 'prool/instances' - -const executionServer = createServer({ - instance: anvil(), - port: 8545 -}) -await executionServer.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" - -const bundlerServer = createServer({ - instance: (key) => alto({ - entrypoints: ['0x0000000071727De22E5E9d8BAf0edAc6f37da032'], - rpcUrl: `http://localhost:8545/${key}`, - executorPrivateKeys: ['0x...'], - }) -}) -await bundlerServer.start() -// Instances accessible at: -// "http://localhost:3000/1" (→ http://localhost:8545/1) -// "http://localhost:3000/2" (→ http://localhost:8545/2) -// "http://localhost:3000/3" (→ http://localhost:8545/3) -// "http://localhost:3000/n" (→ http://localhost:8545/n) -``` - -#### Parameters - -See [`AltoParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/alto.ts#L7). - -### Rundler (Bundler Node) - -#### Requirements - -- [Rundler](https://github.com/alchemyplatform/rundler) binary installed - - [Download](https://github.com/alchemyplatform/rundler/releases) - -#### Usage - -```ts -import { createServer } from 'prool' -import { anvil, rundler } from 'prool/instances' - -const executionServer = createServer({ - instance: anvil(), - port: 8545 -}) -await executionServer.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" - -const bundlerServer = createServer({ - instance: (key) => rundler({ - nodeHttp: `http://localhost:8545/${key}`, - }) -}) -await bundlerServer.start() -// Instances accessible at: -// "http://localhost:3000/1" (→ http://localhost:8545/1) -// "http://localhost:3000/2" (→ http://localhost:8545/2) -// "http://localhost:3000/3" (→ http://localhost:8545/3) -// "http://localhost:3000/n" (→ http://localhost:8545/n) -``` - -#### Parameters - -See [RundlerParameters](). - -## Reference - -### `createServer` - -Creates a server that manages a pool of instances via a proxy. - -#### Usage - -```ts -import { createServer } from 'prool' -import { anvil } from 'prool/instances' - -const executionServer = createServer({ - instance: anvil(), -}) -await executionServer.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" -// "http://localhost:8545/n/start" -// "http://localhost:8545/n/stop" -// "http://localhost:8545/n/restart" -// "http://localhost:8545/healthcheck" -``` - -**Endpoints:** -- `/:key`: Proxy to instance at `key`. -- `/:key/start`: Start instance at `key`. -- `/:key/stop`: Stop instance at `key`. -- `/:key/restart`: Restart instance at `key`. -- `/healthcheck`: Healthcheck endpoint. - -#### API - -| Name | Description | Type | -| ---------- | -------------------------------------------------------- | --------------------------------------- | -| `instance` | Instance for the server. | `Instance \| (key: number) => Instance` | -| `limit` | Number of instances that can be instantiated in the pool | `number` | -| `host` | Host for the server. | `string` | -| `port` | Port for the server. | `number` | -| returns | Server | `CreateServerReturnType` | - -### `defineInstance` - -Creates an instance definition, that can be used with [`createServer`](#createserver) or [`definePool`](#definepool). - -#### Usage - -```ts -import { defineInstance } from 'prool' - -const foo = defineInstance((parameters: FooParameters) => { - return { - name: 'foo', - host: 'localhost', - port: 3000, - async start() { - // ... - }, - async stop() { - // ... - }, - } -}) -``` - -#### API - -| Name | Description | Type | -| ------- | -------------------- | ------------------ | -| `fn` | Instance definition. | `DefineInstanceFn` | -| returns | Instance. | `Instance` | - -### `definePool` - -Defines a pool of instances. Instances can be started, cached, and stopped against an identifier. - -#### Usage - -```ts -import { definePool } from 'prool' -import { anvil } from 'prool/instances' - -const pool = definePool({ - instance: anvil(), -}) -const instance_1 = await pool.start(1) -const instance_2 = await pool.start(2) -const instance_3 = await pool.start(3) -``` - -#### API - -| Name | Description | Type | -| ---------- | -------------------------------------------------------- | ---------- | -| `instance` | Instance for the pool. | `Instance` | -| `limit` | Number of instances that can be instantiated in the pool | `number` | -| returns | Pool. | `Pool` | - -## Authors - -- [@jxom](https://github.com/jxom) (jxom.eth, [Twitter](https://twitter.com/jakemoxey)) -- [@tmm](https://github.com/tmm) (awkweb.eth, [Twitter](https://twitter.com/awkweb)) - -## License - -[MIT](/LICENSE) License diff --git a/src/exports/instances.test.ts b/src/exports/instances.test.ts index 853a359..6e2f893 100644 --- a/src/exports/instances.test.ts +++ b/src/exports/instances.test.ts @@ -4,10 +4,10 @@ import * as exports from './instances.js' test('exports', () => { expect(Object.keys(exports)).toMatchInlineSnapshot(` [ + "defineInstance", "alto", "anvil", "rundler", - "defineInstance", ] `) }) diff --git a/src/instance.ts b/src/instance.ts index 49142cc..eb588ce 100644 --- a/src/instance.ts +++ b/src/instance.ts @@ -157,7 +157,7 @@ export function defineInstance< const { _internal, host, name, port, start, stop } = { ...instance, ...createParameters, - port: instance.port, + port: createParameters.port ?? instance.port, } const { messageBuffer = 20, timeout } = options diff --git a/src/package.json b/src/package.json deleted file mode 100644 index aa969f5..0000000 --- a/src/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "prool", - "description": "HTTP testing instances for Ethereum", - "version": "0.0.25", - "type": "module", - "module": "_lib/exports/index.mjs", - "types": "_lib/exports/index.d.ts", - "typings": "_lib/exports/index.d.ts", - "sideEffects": false, - "engines": { - "node": ">=24" - }, - "exports": { - ".": { - "types": "./_lib/exports/index.d.ts", - "default": "./_lib/exports/index.js" - }, - "./processes": { - "types": "./_lib/exports/processes.d.ts", - "default": "./_lib/exports/processes.js" - }, - "./instances": { - "types": "./_lib/exports/instances.d.ts", - "default": "./_lib/exports/instances.js" - } - }, - "dependencies": { - "change-case": "5.4.4", - "eventemitter3": "^5.0.1", - "execa": "^9.1.0", - "get-port": "^7.1.0", - "http-proxy": "^1.18.1", - "tar": "7.2.0" - }, - "peerDependencies": { - "@pimlico/alto": "*" - }, - "peerDependenciesMeta": { - "@pimlico/alto": { - "optional": true - } - }, - "license": "MIT", - "homepage": "https://wevm.dev", - "repository": "wevm/prool", - "authors": [ - "awkweb", - "jxom" - ], - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "keywords": [] -} diff --git a/src/server.test.ts b/src/server.test.ts index 70dfa42..8cd495c 100644 --- a/src/server.test.ts +++ b/src/server.test.ts @@ -280,9 +280,8 @@ describe("instance: 'anvil'", () => { }).then((x) => x.json()), ).toMatchInlineSnapshot(` { - "id": 0, - "jsonrpc": "2.0", - "result": "0x69", + "message": "Failed to start process "anvil": Error: Address already in use (os error 48) + ", } `) @@ -304,9 +303,8 @@ describe("instance: 'anvil'", () => { }).then((x) => x.json()), ).toMatchInlineSnapshot(` { - "id": 0, - "jsonrpc": "2.0", - "result": "0x0", + "message": "Failed to start process "anvil": Error: Address already in use (os error 48) + ", } `) diff --git a/test/silius/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 b/test/silius/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 deleted file mode 100644 index 66eeda6..0000000 --- a/test/silius/keys/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 +++ /dev/null @@ -1 +0,0 @@ -test test test test test test test test test test test junk \ No newline at end of file From 063aec150c33c04926c7c60a4d50b66406b63290 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:09:07 +1100 Subject: [PATCH 03/21] chore: namespace imports --- .changeset/giant-knives-rhyme.md | 5 + .changeset/lazy-toys-report.md | 60 + README.md | 74 +- package.json | 26 +- pnpm-lock.yaml | 1284 +++++++++----------- pnpm-workspace.yaml | 2 - src/{instance.test.ts => Instance.test.ts} | 24 +- src/{instance.ts => Instance.ts} | 89 +- src/{pool.test.ts => Pool.test.ts} | 48 +- src/{pool.ts => Pool.ts} | 35 +- src/{server.test.ts => Server.test.ts} | 65 +- src/{server.ts => Server.ts} | 18 +- src/exports/index.test.ts | 16 - src/exports/index.ts | 29 - src/exports/instances.test.ts | 13 - src/exports/instances.ts | 11 - src/exports/processes.test.ts | 10 - src/exports/processes.ts | 8 - src/index.ts | 3 + src/instances/alto.test.ts | 13 +- src/instances/alto.ts | 451 +++---- src/instances/anvil.test.ts | 9 +- src/instances/anvil.ts | 496 ++++---- src/instances/package.json | 5 - src/instances/rundler.test.ts | 9 +- src/instances/rundler.ts | 752 ++++++------ src/{ => internal}/utils.test.ts | 0 src/{ => internal}/utils.ts | 0 src/processes/execa.test.ts | 4 +- src/processes/execa.ts | 32 +- src/processes/index.ts | 1 + src/processes/package.json | 5 - 32 files changed, 1721 insertions(+), 1876 deletions(-) create mode 100644 .changeset/giant-knives-rhyme.md create mode 100644 .changeset/lazy-toys-report.md delete mode 100644 pnpm-workspace.yaml rename src/{instance.test.ts => Instance.test.ts} (93%) rename src/{instance.ts => Instance.ts} (82%) rename src/{pool.test.ts => Pool.test.ts} (88%) rename src/{pool.ts => Pool.ts} (89%) rename src/{server.test.ts => Server.test.ts} (88%) rename src/{server.ts => Server.ts} (92%) delete mode 100644 src/exports/index.test.ts delete mode 100644 src/exports/index.ts delete mode 100644 src/exports/instances.test.ts delete mode 100644 src/exports/instances.ts delete mode 100644 src/exports/processes.test.ts delete mode 100644 src/exports/processes.ts create mode 100644 src/index.ts delete mode 100644 src/instances/package.json rename src/{ => internal}/utils.test.ts (100%) rename src/{ => internal}/utils.ts (100%) create mode 100644 src/processes/index.ts delete mode 100644 src/processes/package.json diff --git a/.changeset/giant-knives-rhyme.md b/.changeset/giant-knives-rhyme.md new file mode 100644 index 0000000..f5713ad --- /dev/null +++ b/.changeset/giant-knives-rhyme.md @@ -0,0 +1,5 @@ +--- +"prool": minor +--- + +**Breaking:** Removed `silius` + `stackup` instances. diff --git a/.changeset/lazy-toys-report.md b/.changeset/lazy-toys-report.md new file mode 100644 index 0000000..26b76e0 --- /dev/null +++ b/.changeset/lazy-toys-report.md @@ -0,0 +1,60 @@ +--- +"prool": minor +--- + +**Breaking:** Refactored to use namespace imports. + +### Imports + +```diff +- import { createServer } from 'prool' +- import { anvil, alto, rundler } from 'prool/instances' +- import { defineInstance } from 'prool' +- import { definePool } from 'prool' ++ import { Instance, Pool, Server } from 'prool' +``` + +### `Server.create` → `Server.create` + +```diff +- const server = createServer({ +- instance: anvil(), ++ const server = Server.create({ ++ instance: Instance.anvil(), + }) +``` + +### `anvil`, `alto`, `rundler` → `Instance.anvil`, `Instance.alto`, `Instance.rundler` + +```diff +- const instance = anvil({ ... }) ++ const instance = Instance.anvil({ ... }) + +- const instance = alto({ ... }) ++ const instance = Instance.alto({ ... }) + +- const instance = rundler({ ... }) ++ const instance = Instance.rundler({ ... }) +``` + +### `defineInstance` → `Instance.define` + +```diff +- const foo = defineInstance((parameters) => { ++ const foo = Instance.define((parameters) => { + return { + name: 'foo', + // ... + } + }) +``` + +### `definePool` → `Pool.define` + +```diff +- const pool = definePool({ +- instance: anvil(), ++ const pool = Pool.define({ ++ instance: Instance.anvil(), + }) +``` diff --git a/README.md b/README.md index 2df2a5d..777be27 100644 --- a/README.md +++ b/README.md @@ -39,24 +39,21 @@ Prool is a library that provides programmatic HTTP testing instances for Ethereu Prool contains a set of pre-configured instances that can be used to simulate Ethereum server environments, being: - **Local Execution Nodes:** [`anvil`](#anvil-execution-node) -- **Bundler Nodes:** [`alto`](#alto-bundler-node), [`rundler`](#rundler-bundler-node) -- **Indexer Nodes:** `ponder`⚠️ +- **ERC-4337 Bundler Nodes:** [`alto`](#alto-bundler-node), [`rundler`](#rundler-bundler-node) -⚠️ = soon - -You can also create your own custom instances by using the [`defineInstance` function](#defineinstance). +You can also create your own custom instances by using the [`Instance.define` function](#instancedefine). ## Table of Contents - [Install](#install) - [Getting Started](#getting-started) - [Anvil (Execution Node)](#anvil-execution-node) - - [Alto (Bundler Node)](#alto-bundler-node) - - [Rundler (Bundler Node)](#rundler-bundler-node) + - [Alto (ERC-4337 Bundler Node)](#alto-bundler-node) + - [Rundler (ERC-4337 Bundler Node)](#rundler-bundler-node) - [Reference](#reference) - - [`createServer`](#createserver) - - [`defineInstance`](#defineinstance) - - [`definePool`](#definepool) + - [`Server.create`](#servercreate) + - [`Instance.define`](#instancedefine) + - [`Pool.define`](#pooldefine) ## Install @@ -85,11 +82,10 @@ bun i prool #### Usage ```ts -import { createServer } from 'prool' -import { anvil } from 'prool/instances' +import { Instance, Server } from 'prool' -const server = createServer({ - instance: anvil(), +const server = Server.create({ + instance: Instance.anvil(), }) await server.start() @@ -113,11 +109,10 @@ See [`AnvilParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c #### Usage ```ts -import { createServer } from 'prool' -import { anvil, alto } from 'prool/instances' +import { Instance, Server } from 'prool' -const executionServer = createServer({ - instance: anvil(), +const executionServer = Server.create({ + instance: Instance.anvil(), port: 8545 }) await executionServer.start() @@ -127,8 +122,8 @@ await executionServer.start() // "http://localhost:8545/3" // "http://localhost:8545/n" -const bundlerServer = createServer({ - instance: (key) => alto({ +const bundlerServer = Server.create({ + instance: (key) => Instance.alto({ entrypoints: ['0x0000000071727De22E5E9d8BAf0edAc6f37da032'], rpcUrl: `http://localhost:8545/${key}`, executorPrivateKeys: ['0x...'], @@ -156,11 +151,10 @@ See [`AltoParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c9 #### Usage ```ts -import { createServer } from 'prool' -import { anvil, rundler } from 'prool/instances' +import { Instance, Server } from 'prool' -const executionServer = createServer({ - instance: anvil(), +const executionServer = Server.create({ + instance: Instance.anvil(), port: 8545 }) await executionServer.start() @@ -170,8 +164,8 @@ await executionServer.start() // "http://localhost:8545/3" // "http://localhost:8545/n" -const bundlerServer = createServer({ - instance: (key) => rundler({ +const bundlerServer = Server.create({ + instance: (key) => Instance.rundler({ nodeHttp: `http://localhost:8545/${key}`, }) }) @@ -189,18 +183,17 @@ See [RundlerParameters](). ## Reference -### `createServer` +### `Server.create` Creates a server that manages a pool of instances via a proxy. #### Usage ```ts -import { createServer } from 'prool' -import { anvil } from 'prool/instances' +import { Instance, Server } from 'prool' -const executionServer = createServer({ - instance: anvil(), +const executionServer = Server.create({ + instance: Instance.anvil(), }) await executionServer.start() // Instances accessible at: @@ -229,18 +222,18 @@ await executionServer.start() | `limit` | Number of instances that can be instantiated in the pool | `number` | | `host` | Host for the server. | `string` | | `port` | Port for the server. | `number` | -| returns | Server | `CreateServerReturnType` | +| returns | Server | `Server.Server` | -### `defineInstance` +### `Instance.define` -Creates an instance definition, that can be used with [`createServer`](#createserver) or [`definePool`](#definepool). +Creates an instance definition, that can be used with [`Server.create`](#servercreate) or [`Pool.define`](#pooldefine). #### Usage ```ts -import { defineInstance } from 'prool' +import { Instance } from 'prool' -const foo = defineInstance((parameters: FooParameters) => { +const foo = Instance.define((parameters: FooParameters) => { return { name: 'foo', host: 'localhost', @@ -262,18 +255,17 @@ const foo = defineInstance((parameters: FooParameters) => { | `fn` | Instance definition. | `DefineInstanceFn` | | returns | Instance. | `Instance` | -### `definePool` +### `Pool.define` Defines a pool of instances. Instances can be started, cached, and stopped against an identifier. #### Usage ```ts -import { definePool } from 'prool' -import { anvil } from 'prool/instances' +import { Instance, Pool } from 'prool' -const pool = definePool({ - instance: anvil(), +const pool = Pool.define({ + instance: Instance.anvil(), }) const instance_1 = await pool.start(1) const instance_2 = await pool.start(2) diff --git a/package.json b/package.json index 5920d49..eae6040 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "@types/http-proxy": "^1.17.17", "@types/node": "^24.10.2", "@types/ws": "^8.18.1", - "@vitest/coverage-v8": "^1.6.0", + "@vitest/coverage-v8": "^4.0.15", "typescript": "^5.9.3", - "vitest": "^1.6.0", + "vitest": "^4.0.15", "ws": "^8.18.3", "zile": "^0.0.13" }, @@ -35,19 +35,9 @@ }, "exports": { ".": { - "src": "./src/exports/index.ts", - "types": "./dist/exports/index.d.ts", - "default": "./dist/exports/index.js" - }, - "./processes": { - "src": "./src/exports/processes.ts", - "types": "./dist/exports/processes.d.ts", - "default": "./dist/exports/processes.js" - }, - "./instances": { - "src": "./src/exports/instances.ts", - "types": "./dist/exports/instances.d.ts", - "default": "./dist/exports/instances.js" + "src": "./src/index.ts", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" } }, "dependencies": { @@ -80,7 +70,7 @@ } ], "keywords": [], - "main": "./dist/exports/index.js", - "module": "./dist/exports/index.js", - "types": "./dist/exports/index.d.ts" + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6136270..1e1d613 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,14 +49,14 @@ importers: specifier: ^8.18.1 version: 8.18.1 '@vitest/coverage-v8': - specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@24.10.2)) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@24.10.2) + specifier: ^4.0.15 + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) ws: specifier: ^8.18.3 version: 8.18.3 @@ -69,20 +69,16 @@ packages: '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/helper-string-parser@7.24.6': - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.6': - resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.6': - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -90,12 +86,13 @@ packages: resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.6': - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} '@biomejs/biome@2.3.8': resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} @@ -217,141 +214,159 @@ packages: '@clack/prompts@1.0.0-alpha.8': resolution: {integrity: sha512-YZGC4BmTKSF5OturNKEz/y4xNjYGmGk6NI785CQucJ7OEdX0qbMmL/zok+9bL6c7qE3WSYffyK5grh2RnkGNtQ==} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -399,32 +414,22 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} @@ -721,83 +726,113 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.17.2': - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.17.2': - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.17.2': - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.17.2': - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.17.2': - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.17.2': - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.17.2': - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.17.2': - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.17.2': - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.17.2': - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.17.2': - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} cpu: [x64] os: [win32] @@ -837,16 +872,25 @@ packages: resolution: {integrity: sha512-Vn9fcvwTq91wJvCd7WTMWozimqMi+dEZ3ie3EICELC2diONcN16ADFdzn65CQQbYwmUzRjN9EjDN2k41pKZWhQ==} engines: {node: '>=8'} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/http-proxy@1.17.17': resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} @@ -868,25 +912,43 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@4.0.15': + resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} peerDependencies: - vitest: 1.6.0 + '@vitest/browser': 4.0.15 + vitest: 4.0.15 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.0.15': + resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + + '@vitest/mocker@4.0.15': + resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@4.0.15': + resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@4.0.15': + resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@4.0.15': + resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} abitype@0.8.11: resolution: {integrity: sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A==} @@ -926,10 +988,6 @@ packages: peerDependencies: acorn: ^8 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -965,10 +1023,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -983,8 +1037,12 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} async-mutex@0.4.1: resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} @@ -1009,9 +1067,6 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1030,9 +1085,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -1040,9 +1095,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -1072,12 +1124,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -1086,10 +1132,6 @@ packages: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1109,10 +1151,6 @@ packages: supports-color: optional: true - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -1125,10 +1163,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1160,9 +1194,12 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} hasBin: true escalade@3.1.2: @@ -1191,14 +1228,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - execa@9.1.0: resolution: {integrity: sha512-lSgHc4Elo2m6bUDhc3Hl/VxvUDJdQWI40RZ4KMY9bKRc+hgMOT7II/JjbNDhI8VnMtrCb7U/fhpJIkLORZozWw==} engines: {node: '>=18'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1243,6 +1280,15 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -1284,9 +1330,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1299,9 +1342,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -1310,10 +1350,6 @@ packages: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-stream@9.0.1: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} @@ -1327,10 +1363,6 @@ packages: engines: {node: '>=16 || 14 >=14.18'} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1360,10 +1392,6 @@ packages: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - human-signals@7.0.0: resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} engines: {node: '>=18.18.0'} @@ -1388,10 +1416,6 @@ packages: import-in-the-middle@1.7.1: resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1426,10 +1450,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -1462,12 +1482,12 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@3.1.2: @@ -1478,8 +1498,8 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} @@ -1504,10 +1524,6 @@ packages: light-my-request@5.13.0: resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -1536,9 +1552,6 @@ packages: long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} @@ -1547,19 +1560,16 @@ packages: resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1572,13 +1582,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1599,9 +1602,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} - module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} @@ -1619,8 +1619,8 @@ packages: msgpackr@1.11.2: resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1641,6 +1641,9 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -1648,10 +1651,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - opentelemetry-instrumentation-fetch-node@1.2.3: resolution: {integrity: sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==} engines: {node: '>18.0.0'} @@ -1677,10 +1676,6 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -1704,10 +1699,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1727,14 +1718,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1747,6 +1732,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -1775,11 +1764,8 @@ packages: resolution: {integrity: sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==} hasBin: true - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prettier@2.8.8: @@ -1787,10 +1773,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.0.0: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} @@ -1830,9 +1812,6 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -1899,8 +1878,8 @@ packages: engines: {node: '>=14.18'} hasBin: true - rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1962,8 +1941,8 @@ packages: sonic-boom@4.0.1: resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} spawndamnit@3.0.1: @@ -1982,8 +1961,8 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -2011,10 +1990,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-final-newline@4.0.0: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} @@ -2023,9 +1998,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2045,30 +2017,26 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} thread-stream@3.0.2: resolution: {integrity: sha512-cBL4xF2A3lSINV4rD5tyqnKH4z/TgWPvT+NaVhJDSwK962oo/Ye7cHSMbDzwcu7tAE1SfU6Q4XtV6Hucmi6Hlw==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -2094,10 +2062,6 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@4.39.0: resolution: {integrity: sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==} engines: {node: '>=16'} @@ -2107,9 +2071,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -2138,56 +2099,72 @@ packages: typescript: optional: true - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.2.7: + resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@4.0.15: + resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.15 + '@vitest/browser-preview': 4.0.15 + '@vitest/browser-webdriverio': 4.0.15 + '@vitest/ui': 4.0.15 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -2207,8 +2184,8 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -2263,10 +2240,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - yoctocolors@2.0.2: resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} engines: {node: '>=18'} @@ -2296,30 +2269,24 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/helper-string-parser@7.24.6': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.24.6': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.28.5 '@babel/runtime@7.24.5': dependencies: regenerator-runtime: 0.14.1 - '@babel/types@7.24.6': + '@babel/types@7.28.5': dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@bcoe/v8-coverage@0.2.3': {} + '@bcoe/v8-coverage@1.0.2': {} '@biomejs/biome@2.3.8': optionalDependencies: @@ -2526,73 +2493,82 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-arm@0.20.2': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-x64@0.25.12': optional: true '@fastify/ajv-compiler@3.5.0': @@ -2654,29 +2630,22 @@ snapshots: dependencies: minipass: 7.1.1 - '@istanbuljs/schema@0.1.3': {} - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@js-sdsl/ordered-map@4.4.2': {} '@manypkg/find-root@1.1.0': @@ -3055,52 +3024,70 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@rollup/rollup-android-arm-eabi@4.17.2': + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': optional: true - '@rollup/rollup-android-arm64@4.17.2': + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': optional: true - '@rollup/rollup-darwin-arm64@4.17.2': + '@rollup/rollup-linux-arm-musleabihf@4.53.3': optional: true - '@rollup/rollup-darwin-x64@4.17.2': + '@rollup/rollup-linux-arm64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + '@rollup/rollup-linux-arm64-musl@4.53.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.17.2': + '@rollup/rollup-linux-loong64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.17.2': + '@rollup/rollup-linux-ppc64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.17.2': + '@rollup/rollup-linux-riscv64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + '@rollup/rollup-linux-riscv64-musl@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.17.2': + '@rollup/rollup-linux-s390x-gnu@4.53.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.17.2': + '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.17.2': + '@rollup/rollup-linux-x64-musl@4.53.3': optional: true - '@rollup/rollup-linux-x64-musl@4.17.2': + '@rollup/rollup-openharmony-arm64@4.53.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.17.2': + '@rollup/rollup-win32-arm64-msvc@4.53.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.17.2': + '@rollup/rollup-win32-ia32-msvc@4.53.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.17.2': + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true '@scure/base@1.2.4': {} @@ -3150,12 +3137,21 @@ snapshots: dependencies: '@sentry/types': 7.116.0 - '@sinclair/typebox@0.27.8': {} - '@sindresorhus/merge-streams@4.0.0': {} + '@standard-schema/spec@1.0.0': {} + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.5': {} + '@types/estree@1.0.8': {} + '@types/http-proxy@1.17.17': dependencies: '@types/node': 24.10.2 @@ -3178,53 +3174,61 @@ snapshots: dependencies: '@types/node': 24.10.2 - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@24.10.2))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2))': dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.15 + ast-v8-to-istanbul: 0.3.8 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 - istanbul-reports: 3.1.7 - magic-string: 0.30.10 - magicast: 0.3.4 - picocolors: 1.0.1 - std-env: 3.7.0 - strip-literal: 2.1.0 - test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@24.10.2) + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': + '@vitest/expect@4.0.15': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + chai: 6.2.1 + tinyrainbow: 3.0.3 - '@vitest/runner@1.6.0': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2))': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.2 + '@vitest/spy': 4.0.15 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.2.7(@types/node@24.10.2) - '@vitest/snapshot@1.6.0': + '@vitest/pretty-format@4.0.15': dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 + tinyrainbow: 3.0.3 - '@vitest/spy@1.6.0': + '@vitest/runner@4.0.15': dependencies: - tinyspy: 2.2.1 + '@vitest/utils': 4.0.15 + pathe: 2.0.3 - '@vitest/utils@1.6.0': + '@vitest/snapshot@4.0.15': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vitest/pretty-format': 4.0.15 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.15': {} + + '@vitest/utils@4.0.15': + dependencies: + '@vitest/pretty-format': 4.0.15 + tinyrainbow: 3.0.3 abitype@0.8.11(typescript@5.9.3)(zod@3.23.8): dependencies: @@ -3251,8 +3255,6 @@ snapshots: dependencies: acorn: 8.14.1 - acorn-walk@8.3.2: {} - acorn@8.11.3: {} acorn@8.14.1: {} @@ -3282,8 +3284,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} argparse@1.0.10: @@ -3294,7 +3294,13 @@ snapshots: array-union@2.1.0: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@0.3.8: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 async-mutex@0.4.1: dependencies: @@ -3317,11 +3323,6 @@ snapshots: bintrees@1.0.2: {} - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3349,24 +3350,12 @@ snapshots: cac@6.7.14: {} - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + chai@6.2.1: {} change-case@5.4.4: {} chardet@2.1.1: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - chownr@3.0.0: {} ci-info@3.9.0: {} @@ -3389,22 +3378,12 @@ snapshots: colorette@2.0.20: {} - concat-map@0.0.1: {} - - confbox@0.1.7: {} - cookie@0.6.0: {} cron-parser@4.9.0: dependencies: luxon: 3.6.1 - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3419,10 +3398,6 @@ snapshots: dependencies: ms: 2.1.2 - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - denque@2.1.0: {} detect-indent@6.1.0: {} @@ -3430,8 +3405,6 @@ snapshots: detect-libc@2.0.3: optional: true - diff-sequences@29.6.3: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3462,31 +3435,36 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - esbuild@0.20.2: + es-module-lexer@1.7.0: {} + + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.1.2: {} @@ -3504,18 +3482,6 @@ snapshots: events@3.3.0: {} - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - execa@9.1.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -3531,6 +3497,8 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.0.2 + expect-type@1.3.0: {} + extendable-error@0.1.7: {} fast-content-type-parse@1.1.0: {} @@ -3594,6 +3562,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + figures@6.1.0: dependencies: is-unicode-supported: 2.0.0 @@ -3634,8 +3606,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -3643,14 +3613,10 @@ snapshots: get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - get-port@5.1.1: {} get-port@7.1.0: {} - get-stream@8.0.1: {} - get-stream@9.0.1: dependencies: '@sec-ant/readable-stream': 0.4.1 @@ -3668,15 +3634,6 @@ snapshots: minipass: 7.1.1 path-scurry: 1.11.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3708,8 +3665,6 @@ snapshots: human-id@4.1.3: {} - human-signals@5.0.0: {} - human-signals@7.0.0: {} iconv-lite@0.7.0: @@ -3736,11 +3691,6 @@ snapshots: cjs-module-lexer: 1.3.1 module-details-from-path: 1.0.3 - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ioredis@5.6.0: @@ -3775,8 +3725,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-stream@3.0.0: {} - is-stream@4.0.1: {} is-subdir@1.2.0: @@ -3801,7 +3749,7 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.4: + istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 debug: 4.3.4 @@ -3809,7 +3757,7 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -3822,7 +3770,7 @@ snapshots: joycon@3.1.1: {} - js-tokens@9.0.0: {} + js-tokens@9.0.1: {} js-yaml@3.14.1: dependencies: @@ -3853,11 +3801,6 @@ snapshots: process-warning: 3.0.0 set-cookie-parser: 2.6.0 - local-pkg@0.5.0: - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 - localforage@1.10.0: dependencies: lie: 3.1.1 @@ -3880,30 +3823,24 @@ snapshots: long@5.2.3: {} - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - lru-cache@10.2.2: {} luxon@3.6.1: {} - magic-string@0.30.10: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.4: + magicast@0.5.1: dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 - source-map-js: 1.2.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 make-dir@4.0.0: dependencies: semver: 7.6.2 - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.6: @@ -3916,12 +3853,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mimic-fn@4.0.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -3937,13 +3868,6 @@ snapshots: mkdirp@3.0.1: {} - mlly@1.7.0: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 - module-details-from-path@1.0.3: {} mri@1.2.0: {} @@ -3966,7 +3890,7 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 - nanoid@3.3.7: {} + nanoid@3.3.11: {} node-fetch@2.7.0: dependencies: @@ -3981,16 +3905,14 @@ snapshots: dependencies: path-key: 4.0.0 + obug@2.1.1: {} + on-exit-leak-free@2.1.2: {} once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - opentelemetry-instrumentation-fetch-node@1.2.3(@opentelemetry/api@1.9.0): dependencies: '@opentelemetry/api': 1.9.0 @@ -4023,10 +3945,6 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -4043,8 +3961,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -4058,11 +3974,7 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} - - pathval@1.1.1: {} - - picocolors@1.0.1: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -4070,6 +3982,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@4.0.1: {} pino-abstract-transport@1.2.0: @@ -4133,26 +4047,14 @@ snapshots: sonic-boom: 4.0.1 thread-stream: 3.0.2 - pkg-types@1.1.1: + postcss@8.5.6: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 - - postcss@8.4.38: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 prettier@2.8.8: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - pretty-ms@9.0.0: dependencies: parse-ms: 4.0.0 @@ -4198,8 +4100,6 @@ snapshots: quick-format-unescaped@4.0.4: {} - react-is@18.3.1: {} - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -4263,26 +4163,32 @@ snapshots: dependencies: glob: 10.3.16 - rollup@4.17.2: + rollup@4.53.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4329,7 +4235,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} spawndamnit@3.0.1: dependencies: @@ -4344,7 +4250,7 @@ snapshots: standard-as-callback@2.1.0: {} - std-env@3.7.0: {} + std-env@3.10.0: {} stream-shift@1.0.3: {} @@ -4374,16 +4280,10 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - strip-final-newline@4.0.0: {} strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -4405,12 +4305,6 @@ snapshots: term-size@2.2.1: {} - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -4419,13 +4313,16 @@ snapshots: dependencies: real-require: 0.2.0 - tinybench@2.8.0: {} + tinybench@2.9.0: {} - tinypool@0.8.4: {} + tinyexec@1.0.2: {} - tinyspy@2.2.1: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 - to-fast-properties@2.0.0: {} + tinyrainbow@3.0.3: {} to-regex-range@5.0.1: dependencies: @@ -4441,14 +4338,10 @@ snapshots: tslib@2.6.3: {} - type-detect@4.0.8: {} - type-fest@4.39.0: {} typescript@5.9.3: {} - ufo@1.5.3: {} - undici-types@5.26.5: {} undici-types@7.16.0: {} @@ -4480,64 +4373,55 @@ snapshots: - utf-8-validate - zod - vite-node@1.6.0(@types/node@24.10.2): - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.2.11(@types/node@24.10.2) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite@5.2.11(@types/node@24.10.2): + vite@7.2.7(@types/node@24.10.2): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.2 fsevents: 2.3.3 - vitest@1.6.0(@types/node@24.10.2): - dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.10 - pathe: 1.1.2 - picocolors: 1.0.1 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.2.11(@types/node@24.10.2) - vite-node: 1.6.0(@types/node@24.10.2) - why-is-node-running: 2.2.2 + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2): + dependencies: + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)) + '@vitest/pretty-format': 4.0.15 + '@vitest/runner': 4.0.15 + '@vitest/snapshot': 4.0.15 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.2.7(@types/node@24.10.2) + why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.0 '@types/node': 24.10.2 transitivePeerDependencies: + - jiti - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - - supports-color - terser + - tsx + - yaml webidl-conversions@3.0.1: {} @@ -4550,7 +4434,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -4589,8 +4473,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yocto-queue@1.0.0: {} - yoctocolors@2.0.2: {} zile@0.0.13(typescript@5.9.3): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 430953b..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - 'src' diff --git a/src/instance.test.ts b/src/Instance.test.ts similarity index 93% rename from src/instance.test.ts rename to src/Instance.test.ts index 73ec175..fe68de5 100644 --- a/src/instance.test.ts +++ b/src/Instance.test.ts @@ -1,9 +1,9 @@ +import { Instance } from 'prool' import { expect, test } from 'vitest' -import { defineInstance } from './instance.js' test('default', async () => { let started = false - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -28,7 +28,7 @@ test('default', async () => { test('behavior: parameters', async () => { let started = [false, {}] - const foo = defineInstance((parameters: { bar: string }) => { + const foo = Instance.define((parameters: { bar: string }) => { return { name: 'foo', host: 'localhost', @@ -53,7 +53,7 @@ test('behavior: parameters', async () => { test('behavior: start', async () => { let count = 0 - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -91,7 +91,7 @@ test('behavior: start', async () => { }) test('behavior: start (error)', async () => { - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -114,7 +114,7 @@ test('behavior: start (error)', async () => { test('behavior: stop', async () => { let count = 0 - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -150,7 +150,7 @@ test('behavior: stop', async () => { }) test('behavior: stop (error)', async () => { - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -175,7 +175,7 @@ test('behavior: stop (error)', async () => { test('behavior: restart', async () => { let count = 0 - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -206,7 +206,7 @@ test('behavior: restart', async () => { }) test('behavior: events', async () => { - const foo = defineInstance(() => { + const foo = Instance.define(() => { let count = 0 return { name: 'foo', @@ -263,7 +263,7 @@ test('behavior: events', async () => { }) test('behavior: messages', async () => { - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -306,7 +306,7 @@ test('behavior: messages', async () => { }) test('options: timeout', async () => { - const foo = defineInstance(() => { + const foo = Instance.define(() => { return { name: 'foo', host: 'localhost', @@ -323,7 +323,7 @@ test('options: timeout', async () => { 'Instance "foo" failed to start in time', ) - const bar = defineInstance(() => { + const bar = Instance.define(() => { return { name: 'bar', host: 'localhost', diff --git a/src/instance.ts b/src/Instance.ts similarity index 82% rename from src/instance.ts rename to src/Instance.ts index eb588ce..ef8cd41 100644 --- a/src/instance.ts +++ b/src/Instance.ts @@ -1,5 +1,9 @@ import { EventEmitter } from 'eventemitter3' +export { alto } from './instances/alto.js' +export { anvil } from './instances/anvil.js' +export { rundler } from './instances/rundler.js' + type EventTypes = { exit: [code: number | null, signal: NodeJS.Signals | null] listening: [] @@ -8,34 +12,6 @@ type EventTypes = { stdout: [message: string] } -export type InstanceStartOptions_internal = { - emitter: EventEmitter - status: Instance['status'] -} -export type InstanceStopOptions_internal = { - emitter: EventEmitter - status: Instance['status'] -} - -export type InstanceStartOptions = { - /** - * Port to start the instance on. - */ - port?: number | undefined -} - -export type DefineInstanceFn< - parameters, - _internal extends object | undefined = object | undefined, -> = (parameters: parameters) => Pick & { - _internal?: _internal | undefined - start( - options: InstanceStartOptions, - options_internal: InstanceStartOptions_internal, - ): Promise - stop(options_internal: InstanceStopOptions_internal): Promise -} - export type Instance< _internal extends object | undefined = object | undefined, > = Pick< @@ -111,15 +87,6 @@ export type InstanceOptions = { timeout?: number } -export type DefineInstanceReturnType< - _internal extends object | undefined = object | undefined, - parameters = undefined, -> = ( - ...parameters: parameters extends undefined - ? [options?: InstanceOptions] - : [parameters: parameters, options?: InstanceOptions] -) => Instance<_internal> - /** * Creates an instance definition. * @@ -127,7 +94,7 @@ export type DefineInstanceReturnType< * * @example * ```ts - * const foo = defineInstance((parameters: FooParameters) => { + * const foo = Instance.define((parameters: FooParameters) => { * return { * name: 'foo', * host: 'localhost', @@ -142,12 +109,12 @@ export type DefineInstanceReturnType< * }) * ``` */ -export function defineInstance< +export function define< _internal extends object | undefined, parameters = undefined, >( - fn: DefineInstanceFn, -): DefineInstanceReturnType<_internal, parameters> { + fn: define.DefineFn, +): define.ReturnType<_internal, parameters> { return (...[parametersOrOptions, options_]) => { function create(createParameters: Parameters[0] = {}) { const parameters = parametersOrOptions as parameters @@ -310,3 +277,43 @@ export function defineInstance< return Object.assign(create(), { create }) } } + +export declare namespace define { + export type DefineFn< + parameters, + _internal extends object | undefined = object | undefined, + > = (parameters: parameters) => Pick & { + _internal?: _internal | undefined + start( + options: InstanceStartOptions, + options_internal: InstanceStartOptions_internal, + ): Promise + stop(options_internal: InstanceStopOptions_internal): Promise + } + + export type ReturnType< + _internal extends object | undefined = object | undefined, + parameters = undefined, + > = ( + ...parameters: parameters extends undefined + ? [options?: InstanceOptions] + : [parameters: parameters, options?: InstanceOptions] + ) => Instance<_internal> + + export type InstanceStartOptions_internal = { + emitter: EventEmitter + status: Instance['status'] + } + + export type InstanceStopOptions_internal = { + emitter: EventEmitter + status: Instance['status'] + } + + export type InstanceStartOptions = { + /** + * Port to start the instance on. + */ + port?: number | undefined + } +} diff --git a/src/pool.test.ts b/src/Pool.test.ts similarity index 88% rename from src/pool.test.ts rename to src/Pool.test.ts index f9f9d08..11e2f0b 100644 --- a/src/pool.test.ts +++ b/src/Pool.test.ts @@ -1,19 +1,15 @@ import getPort from 'get-port' +import { Instance, Pool, Server } from 'prool' import { afterEach, beforeAll, describe, expect, test } from 'vitest' import { altoOptions, rundlerOptions } from '../test/utils.js' -import { rundler } from './exports/instances.js' -import { alto } from './instances/alto.js' -import { anvil } from './instances/anvil.js' -import { definePool } from './pool.js' -import { createServer } from './server.js' -let pool: ReturnType +let pool: ReturnType const port = await getPort() beforeAll(() => - createServer({ - instance: anvil({ + Server.create({ + instance: Instance.anvil({ chainId: 1, forkUrl: process.env['VITE_FORK_URL'] ?? 'https://eth.merkle.io', }), @@ -30,16 +26,16 @@ afterEach(async () => { }) describe.each([ - { instance: anvil({ port: await getPort() }) }, + { instance: Instance.anvil({ port: await getPort() }) }, { - instance: alto(altoOptions({ port, pool: true })), + instance: Instance.alto(altoOptions({ port, pool: true })), }, { - instance: rundler(rundlerOptions({ port, pool: true })), + instance: Instance.rundler(rundlerOptions({ port, pool: true })), }, ])('instance: $instance.name', ({ instance }) => { test('default', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -47,7 +43,7 @@ describe.each([ }) test('start', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -68,7 +64,7 @@ describe.each([ test('callback instance', async () => { const keys: (number | string)[] = [] - pool = definePool({ + pool = Pool.define({ instance(key) { keys.push(key) return instance @@ -83,7 +79,7 @@ describe.each([ }) test('stop / destroy', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -122,8 +118,9 @@ describe.each([ test( 'restart', + { timeout: 10_000 }, async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -141,11 +138,10 @@ describe.each([ await promise_1 expect(instance_1.status).toBe('started') }, - { timeout: 10_000 }, ) test('start > stop > start', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -160,7 +156,7 @@ describe.each([ }) test('stopAll / destroyAll', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -178,7 +174,7 @@ describe.each([ }) test('get', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -192,7 +188,7 @@ describe.each([ }) test('behavior: start more than once', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -206,7 +202,7 @@ describe.each([ }) test('behavior: clear more than once', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -223,7 +219,7 @@ describe.each([ }) test('behavior: restart more than once', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -244,7 +240,7 @@ describe.each([ }) test('behavior: stop more than once', async () => { - pool = definePool({ + pool = Pool.define({ instance, }) @@ -261,7 +257,7 @@ describe.each([ test('error: start more than once on same port', async () => { const port = await getPort() - pool = definePool({ + pool = Pool.define({ instance, }) @@ -276,7 +272,7 @@ describe.each([ }) test('error: instance limit reached', async () => { - pool = definePool({ + pool = Pool.define({ instance, limit: 2, }) diff --git a/src/pool.ts b/src/Pool.ts similarity index 89% rename from src/pool.ts rename to src/Pool.ts index 5a8c871..82a449a 100644 --- a/src/pool.ts +++ b/src/Pool.ts @@ -1,6 +1,6 @@ import getPort from 'get-port' -import type { Instance } from './instance.js' +import type { Instance } from './Instance.js' type Instance_ = Omit @@ -22,25 +22,12 @@ export type Pool = Pick< stopAll(): Promise } -export type DefinePoolParameters< - key extends number | string = number | string, -> = { - /** Instance for the pool. */ - instance: Instance | ((key: key) => Instance) - /** The maximum number of instances that can be started. */ - limit?: number | undefined -} - -export type DefinePoolReturnType< - key extends number | string = number | string, -> = Pool - /** * Defines an instance pool. Instances can be started, cached, and stopped against an identifier. * * @example * ``` - * const pool = definePool({ + * const pool = Pool.define({ * instance: anvil(), * }) * @@ -49,9 +36,9 @@ export type DefinePoolReturnType< * const instance_3 = await pool.start(3) * ``` */ -export function definePool( - parameters: DefinePoolParameters, -): DefinePoolReturnType { +export function define( + parameters: define.Parameters, +): define.ReturnType { const { limit } = parameters type Instance_ = Omit @@ -201,3 +188,15 @@ export function definePool( values: instances.values.bind(instances), } } + +export declare namespace define { + export type Parameters = { + /** Instance for the pool. */ + instance: Instance | ((key: key) => Instance) + /** The maximum number of instances that can be started. */ + limit?: number | undefined + } + + export type ReturnType = + Pool +} diff --git a/src/server.test.ts b/src/Server.test.ts similarity index 88% rename from src/server.test.ts rename to src/Server.test.ts index 8cd495c..b36de57 100644 --- a/src/server.test.ts +++ b/src/Server.test.ts @@ -1,17 +1,14 @@ import getPort from 'get-port' +import { Instance, Server } from 'prool' import { beforeAll, describe, expect, test } from 'vitest' import { type MessageEvent, WebSocket } from 'ws' import { altoOptions, rundlerOptions } from '../test/utils.js' -import { alto } from './instances/alto.js' -import { anvil } from './instances/anvil.js' -import { rundler } from './instances/rundler.js' -import { createServer } from './server.js' const port = await getPort() beforeAll(async () => { - await createServer({ - instance: anvil({ + await Server.create({ + instance: Instance.anvil({ chainId: 1, forkUrl: process.env['VITE_FORK_URL'] ?? 'https://eth.merkle.io', }), @@ -20,16 +17,16 @@ beforeAll(async () => { }) describe.each([ - { instance: anvil() }, + { instance: Instance.anvil() }, { - instance: alto(altoOptions({ port, pool: true })), + instance: Instance.alto(altoOptions({ port, pool: true })), }, { - instance: rundler(rundlerOptions({ port, pool: true })), + instance: Instance.rundler(rundlerOptions({ port, pool: true })), }, ])('instance: $instance.name', ({ instance }) => { test('default', async () => { - const server = createServer({ + const server = Server.create({ instance, }) expect(server).toBeDefined() @@ -50,7 +47,7 @@ describe.each([ }) test('args: port', async () => { - const server = createServer({ + const server = Server.create({ instance, port: 3000, }) @@ -62,7 +59,7 @@ describe.each([ }) test('args: host', async () => { - const server = createServer({ + const server = Server.create({ instance, host: 'localhost', port: 3000, @@ -76,7 +73,7 @@ describe.each([ }) test('request: /healthcheck', async () => { - const server = createServer({ + const server = Server.create({ instance, }) @@ -89,7 +86,7 @@ describe.each([ }) test('request: /start + /stop', async () => { - const server = createServer({ + const server = Server.create({ instance, }) @@ -118,7 +115,7 @@ describe.each([ }) test('request: /restart', async () => { - const server = createServer({ + const server = Server.create({ instance, }) @@ -133,8 +130,8 @@ describe.each([ describe("instance: 'anvil'", () => { test('request: /{id}', async () => { - const server = createServer({ - instance: anvil(), + const server = Server.create({ + instance: Instance.anvil(), }) const stop = await server.start() @@ -244,8 +241,8 @@ describe("instance: 'anvil'", () => { }) test('request: /restart', async () => { - const server = createServer({ - instance: anvil(), + const server = Server.create({ + instance: Instance.anvil(), }) const stop = await server.start() @@ -280,8 +277,9 @@ describe("instance: 'anvil'", () => { }).then((x) => x.json()), ).toMatchInlineSnapshot(` { - "message": "Failed to start process "anvil": Error: Address already in use (os error 48) - ", + "id": 0, + "jsonrpc": "2.0", + "result": "0x69", } `) @@ -303,8 +301,9 @@ describe("instance: 'anvil'", () => { }).then((x) => x.json()), ).toMatchInlineSnapshot(` { - "message": "Failed to start process "anvil": Error: Address already in use (os error 48) - ", + "id": 0, + "jsonrpc": "2.0", + "result": "0x0", } `) @@ -312,8 +311,8 @@ describe("instance: 'anvil'", () => { }) test('request: /messages', async () => { - const server = createServer({ - instance: anvil(), + const server = Server.create({ + instance: Instance.anvil(), }) const stop = await server.start() @@ -341,8 +340,8 @@ describe("instance: 'anvil'", () => { }) test('ws', async () => { - const server = createServer({ - instance: anvil(), + const server = Server.create({ + instance: Instance.anvil(), }) const stop = await server.start() @@ -369,8 +368,8 @@ describe("instance: 'anvil'", () => { describe("instance: 'alto'", () => { test('request: /{id}', async () => { - const server = createServer({ - instance: alto(altoOptions({ port, pool: true })), + const server = Server.create({ + instance: Instance.alto(altoOptions({ port, pool: true })), }) const stop = await server.start() @@ -404,8 +403,8 @@ describe("instance: 'alto'", () => { describe("instance: 'rundler'", () => { test('request: /{id}', async () => { - const server = createServer({ - instance: rundler(rundlerOptions({ port, pool: true })), + const server = Server.create({ + instance: Instance.rundler(rundlerOptions({ port, pool: true })), }) const stop = await server.start() @@ -438,8 +437,8 @@ describe("instance: 'rundler'", () => { }) test('404', async () => { - const server = createServer({ - instance: anvil(), + const server = Server.create({ + instance: Instance.anvil(), }) const stop = await server.start() diff --git a/src/server.ts b/src/Server.ts similarity index 92% rename from src/server.ts rename to src/Server.ts index 5276e8c..f99a3ed 100644 --- a/src/server.ts +++ b/src/Server.ts @@ -6,13 +6,12 @@ import { } from 'node:http' import type { AddressInfo } from 'node:net' import httpProxy from 'http-proxy' - -import { type DefinePoolParameters, definePool } from './pool.js' -import { extractPath } from './utils.js' +import { extractPath } from './internal/utils.js' +import * as Pool from './Pool.js' const { createProxyServer } = httpProxy -export type CreateServerParameters = DefinePoolParameters & +export type CreateServerParameters = Pool.define.Parameters & ( | { /** Host to run the server on. */ @@ -40,11 +39,10 @@ export type CreateServerReturnType = Omit< * * @example * ``` - * import { createServer } from 'prool' - * import { anvil } from 'prool/instances' + * import { Instance, Server } from 'prool' * - * const server = createServer({ - * instance: anvil(), + * const server = Server.create({ + * instance: Instance.anvil(), * }) * * const server = await server.start() @@ -59,12 +57,12 @@ export type CreateServerReturnType = Omit< * // "http://localhost:8545/healthcheck" * ``` */ -export function createServer( +export function create( parameters: CreateServerParameters, ): CreateServerReturnType { const { host = '::', instance, limit, port } = parameters - const pool = definePool({ instance, limit }) + const pool = Pool.define({ instance, limit }) const proxy = createProxyServer({ ignorePath: true, ws: true, diff --git a/src/exports/index.test.ts b/src/exports/index.test.ts deleted file mode 100644 index 44a68c3..0000000 --- a/src/exports/index.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { expect, test } from 'vitest' -import * as exports from './index.js' - -test('exports', () => { - expect(Object.keys(exports)).toMatchInlineSnapshot(` - [ - "defineInstance", - "definePool", - "createServer", - "extractPath", - "stripColors", - "toArgs", - "toFlagCase", - ] - `) -}) diff --git a/src/exports/index.ts b/src/exports/index.ts deleted file mode 100644 index 0474562..0000000 --- a/src/exports/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -export { - type DefineInstanceFn, - type DefineInstanceReturnType, - defineInstance, - type Instance, - type InstanceOptions, - type InstanceStartOptions, -} from '../instance.js' - -export { - type DefinePoolParameters, - type DefinePoolReturnType, - definePool, - type Pool, -} from '../pool.js' - -export { - type CreateServerParameters, - type CreateServerReturnType, - createServer, -} from '../server.js' - -export { - type ExtractPathReturnType, - extractPath, - stripColors, - toArgs, - toFlagCase, -} from '../utils.js' diff --git a/src/exports/instances.test.ts b/src/exports/instances.test.ts deleted file mode 100644 index 6e2f893..0000000 --- a/src/exports/instances.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { expect, test } from 'vitest' -import * as exports from './instances.js' - -test('exports', () => { - expect(Object.keys(exports)).toMatchInlineSnapshot(` - [ - "defineInstance", - "alto", - "anvil", - "rundler", - ] - `) -}) diff --git a/src/exports/instances.ts b/src/exports/instances.ts deleted file mode 100644 index e423e86..0000000 --- a/src/exports/instances.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { - type DefineInstanceFn, - type DefineInstanceReturnType, - defineInstance, - type Instance, - type InstanceOptions, - type InstanceStartOptions, -} from '../instance.js' -export { type AltoParameters, alto } from '../instances/alto.js' -export { type AnvilParameters, anvil } from '../instances/anvil.js' -export { type RundlerParameters, rundler } from '../instances/rundler.js' diff --git a/src/exports/processes.test.ts b/src/exports/processes.test.ts deleted file mode 100644 index 2205431..0000000 --- a/src/exports/processes.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { expect, test } from 'vitest' -import * as exports from './processes.js' - -test('exports', () => { - expect(Object.keys(exports)).toMatchInlineSnapshot(` - [ - "execa", - ] - `) -}) diff --git a/src/exports/processes.ts b/src/exports/processes.ts deleted file mode 100644 index 06d8a70..0000000 --- a/src/exports/processes.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - type ExecaParameters, - type ExecaProcess, - type ExecaReturnType, - type ExecaStartOptions, - execa, - type Process_internal, -} from '../processes/execa.js' diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..078cfac --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export * as Instance from './Instance.js' +export * as Pool from './Pool.js' +export * as Server from './Server.js' diff --git a/src/instances/alto.test.ts b/src/instances/alto.test.ts index 5f6a21e..165b44a 100644 --- a/src/instances/alto.test.ts +++ b/src/instances/alto.test.ts @@ -1,17 +1,14 @@ import getPort from 'get-port' +import { Instance } from 'prool' import { afterEach, beforeAll, expect, test } from 'vitest' - import { altoOptions } from '../../test/utils.js' -import type { Instance } from '../instance.js' -import { type AltoParameters, alto } from './alto.js' -import { anvil } from './anvil.js' -const instances: Instance[] = [] +const instances: Instance.Instance[] = [] const port = await getPort() -const defineInstance = (parameters: Partial = {}) => { - const instance = alto({ +const defineInstance = (parameters: Partial = {}) => { + const instance = Instance.alto({ ...altoOptions({ port, pool: false }), ...parameters, }) @@ -20,7 +17,7 @@ const defineInstance = (parameters: Partial = {}) => { } beforeAll(() => - anvil({ + Instance.anvil({ forkUrl: process.env['VITE_FORK_URL'] ?? 'https://eth.merkle.io', port, }).start(), diff --git a/src/instances/alto.ts b/src/instances/alto.ts index b6aecb1..ae92470 100644 --- a/src/instances/alto.ts +++ b/src/instances/alto.ts @@ -1,230 +1,14 @@ import { resolve } from 'node:path' -import { defineInstance } from '../instance.js' +import * as Instance from '../Instance.js' +import { toArgs } from '../internal/utils.js' import { execa } from '../processes/execa.js' -import { toArgs } from '../utils.js' - -export type AltoParameters = { - /** - * API version (used for internal Pimlico versioning compatibility). - */ - apiVersion?: readonly string[] | undefined - /** - * Override the sender native token balance during estimation - */ - balanceOverride?: boolean | undefined - /** - * Binary path of the `alto` executable. - */ - binary?: string | undefined - /** - * Address of the `BundleBulker` contract. - */ - bundleBulkerAddress?: `0x${string}` | undefined - /** - * Set if the bundler bundle user operations automatically or only when calling `debug_bundler_sendBundleNow`. - * @default "auto" - */ - bundleMode?: 'auto' | 'manual' | undefined - /** - * Indicates weather the chain is a OP stack chain, arbitrum chain, or default EVM chain. - */ - chainType?: 'default' | 'op-stack' | 'arbitrum' | undefined - /** - * Path to JSON config file. - */ - config?: string | undefined - /** - * Skip user operation validation, use with caution. - */ - dangerousSkipUserOperationValidation?: boolean | undefined - /** - * Default API version. - */ - defaultApiVersion?: string | undefined - /** - * Enable debug endpoints. - * @default false - */ - enableDebugEndpoints?: boolean | undefined - /** - * Include user ops with the same sender in the single bundle. - * @default true - */ - enforceUniqueSendersPerBundle?: boolean | undefined - /** - * EntryPoint contract addresses. - */ - entrypoints: readonly `0x${string}`[] - /** - * Address of the EntryPoint simulations contract. - */ - entrypointSimulationContract?: `0x${string}` | undefined - /** - * Private keys of the executor accounts. - */ - executorPrivateKeys?: readonly `0x${string}`[] - /** - * Interval to refill the signer balance (seconds). - * @default 1200 - */ - executorRefillInterval?: number | undefined - /** - * Should the node make expiration checks. - * @default true - */ - expirationCheck?: boolean | undefined - /** - * Amount to multiply the gas prices fetched from the node. - * @default "100" - */ - gasPriceBump?: string | undefined - /** - * Maximum that the gas prices fetched using pimlico_getUserOperationGasPrice will be accepted for (seconds). - * @default 10 - */ - gasPriceExpiry?: number | undefined - /** - * The minimum percentage of incoming user operation gas prices compared to the gas price used by the bundler to submit bundles. - * @default 101 - */ - gasPriceFloorPercent?: number | undefined - /** - * Amount to multiply the gas prices fetched using `pimlico_getUserOperationGasPrice`. - * @default "105,110,115" - */ - gasPriceMultipliers?: readonly string[] | undefined - /** - * Use a fixed value for gas limits during bundle transaction gas limit estimations - */ - fixedGasLimitForEstimation?: string | undefined - /** - * Flush stuck transactions with old nonces during bundler startup. - */ - flushStuckTransactionsDuringStartup?: boolean | undefined - /** - * Log in JSON format. - */ - json?: boolean | undefined - /** - * Send legacy transactions instead of an EIP-1559 transactions. - * @default false - */ - legacyTransactions?: boolean | undefined - /** - * Calculate the bundle transaction gas limits locally instead of using the RPC gas limit estimation. - */ - localGasLimitCalculation?: boolean | undefined - /** - * Default log level. - */ - logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | undefined - /** - * Max block range for `eth_getLogs` calls. - */ - maxBlockRange?: number | undefined - /** - * Maximum number of operations allowed in the mempool before a bundle is submitted. - * @default 10 - */ - maxBundleSize?: number | undefined - /** - * Maximum time to wait for a bundle to be submitted (ms). - * @default 1000 - */ - maxBundleWait?: number | undefined - /** - * Maximum amount of gas per bundle. - * @default "5000000" - */ - maxGasPerBundle?: string | undefined - /** - * Maximum number of executor accounts to use from the list of executor private keys. - */ - maxExecutors?: number | undefined - /** - * Maximum amount of parallel user ops to keep in the meempool (same sender, different nonce keys). - * @default 10 - */ - mempoolMaxParallelOps?: number | undefined - /** - * Maximum amount of sequential user ops to keep in the mempool (same sender and nonce key, different nonce values). - * @default 0 - */ - mempoolMaxQueuedOps?: number | undefined - /** - * Minimum stake required for a relay (in 10e18). - * @default 1 - */ - minEntityStake?: number | undefined - /** - * Minimum unstake delay (seconds). - * @default 1 - */ - minEntityUnstakeDelay?: number | undefined - /** - * Minimum balance required for each executor account (below which the utility account will refill). - */ - minExecutorBalance?: string | undefined - /** - * Name of the network (used for metrics). - * @default "localhost" - */ - networkName?: string | undefined - /** - * Amount to multiply the paymaster gas limits fetched from simulations. - */ - paymasterGasLimitMultiplier?: string | undefined - /** - * Address of the `PerOpInflator` contract. - */ - perOpInflatorAddress?: `0x${string}` | undefined - /** - * Polling interval for querying for new blocks (ms). - * @default 1000 - */ - pollingInterval?: number | undefined - /** - * Port to listen on. - * @default 3000 - */ - port?: number | undefined - /** - * RPC url to connect to. - */ - rpcUrl: string - /** - * Enable safe mode (enforcing all ERC-4337 rules). - * @default true - */ - safeMode?: boolean | undefined - /** - * RPC url to send transactions to (e.g. flashbots relay). - */ - sendTransactionRpcUrl?: string | undefined - /** - * Timeout for incoming requests (in ms). - */ - timeout?: number | undefined - /** - * Private key of the utility account. - */ - utilityPrivateKey?: string | undefined - /** - * Maximum payload size for websocket messages in bytes (default to 1MB). - */ - websocketMaxPayloadSize?: number | undefined - /** - * Enable websocket server. - */ - websocket?: boolean | undefined -} /** * Defines an Alto instance. * * @example * ```ts - * const instance = alto({ + * const instance = Instance.alto({ * entrypoints: ['0x0000000071727De22E5E9d8BAf0edAc6f37da032'], * rpcUrl: `http://localhost:8545`, * executorPrivateKeys: ['0x...'], @@ -234,8 +18,8 @@ export type AltoParameters = { * await instance.stop() * ``` */ -export const alto = defineInstance((parameters?: AltoParameters) => { - const { ...args } = (parameters || {}) as AltoParameters +export const alto = Instance.define((parameters?: alto.Parameters) => { + const { ...args } = (parameters || {}) as alto.Parameters const name = 'alto' const process = execa({ name }) @@ -278,3 +62,228 @@ export const alto = defineInstance((parameters?: AltoParameters) => { }, } }) + +export declare namespace alto { + export type Parameters = { + /** + * API version (used for internal Pimlico versioning compatibility). + */ + apiVersion?: readonly string[] | undefined + /** + * Override the sender native token balance during estimation + */ + balanceOverride?: boolean | undefined + /** + * Binary path of the `alto` executable. + */ + binary?: string | undefined + /** + * Address of the `BundleBulker` contract. + */ + bundleBulkerAddress?: `0x${string}` | undefined + /** + * Set if the bundler bundle user operations automatically or only when calling `debug_bundler_sendBundleNow`. + * @default "auto" + */ + bundleMode?: 'auto' | 'manual' | undefined + /** + * Indicates weather the chain is a OP stack chain, arbitrum chain, or default EVM chain. + */ + chainType?: 'default' | 'op-stack' | 'arbitrum' | undefined + /** + * Path to JSON config file. + */ + config?: string | undefined + /** + * Skip user operation validation, use with caution. + */ + dangerousSkipUserOperationValidation?: boolean | undefined + /** + * Default API version. + */ + defaultApiVersion?: string | undefined + /** + * Enable debug endpoints. + * @default false + */ + enableDebugEndpoints?: boolean | undefined + /** + * Include user ops with the same sender in the single bundle. + * @default true + */ + enforceUniqueSendersPerBundle?: boolean | undefined + /** + * EntryPoint contract addresses. + */ + entrypoints: readonly `0x${string}`[] + /** + * Address of the EntryPoint simulations contract. + */ + entrypointSimulationContract?: `0x${string}` | undefined + /** + * Private keys of the executor accounts. + */ + executorPrivateKeys?: readonly `0x${string}`[] + /** + * Interval to refill the signer balance (seconds). + * @default 1200 + */ + executorRefillInterval?: number | undefined + /** + * Should the node make expiration checks. + * @default true + */ + expirationCheck?: boolean | undefined + /** + * Amount to multiply the gas prices fetched from the node. + * @default "100" + */ + gasPriceBump?: string | undefined + /** + * Maximum that the gas prices fetched using pimlico_getUserOperationGasPrice will be accepted for (seconds). + * @default 10 + */ + gasPriceExpiry?: number | undefined + /** + * The minimum percentage of incoming user operation gas prices compared to the gas price used by the bundler to submit bundles. + * @default 101 + */ + gasPriceFloorPercent?: number | undefined + /** + * Amount to multiply the gas prices fetched using `pimlico_getUserOperationGasPrice`. + * @default "105,110,115" + */ + gasPriceMultipliers?: readonly string[] | undefined + /** + * Use a fixed value for gas limits during bundle transaction gas limit estimations + */ + fixedGasLimitForEstimation?: string | undefined + /** + * Flush stuck transactions with old nonces during bundler startup. + */ + flushStuckTransactionsDuringStartup?: boolean | undefined + /** + * Log in JSON format. + */ + json?: boolean | undefined + /** + * Send legacy transactions instead of an EIP-1559 transactions. + * @default false + */ + legacyTransactions?: boolean | undefined + /** + * Calculate the bundle transaction gas limits locally instead of using the RPC gas limit estimation. + */ + localGasLimitCalculation?: boolean | undefined + /** + * Default log level. + */ + logLevel?: + | 'trace' + | 'debug' + | 'info' + | 'warn' + | 'error' + | 'fatal' + | undefined + /** + * Max block range for `eth_getLogs` calls. + */ + maxBlockRange?: number | undefined + /** + * Maximum number of operations allowed in the mempool before a bundle is submitted. + * @default 10 + */ + maxBundleSize?: number | undefined + /** + * Maximum time to wait for a bundle to be submitted (ms). + * @default 1000 + */ + maxBundleWait?: number | undefined + /** + * Maximum amount of gas per bundle. + * @default "5000000" + */ + maxGasPerBundle?: string | undefined + /** + * Maximum number of executor accounts to use from the list of executor private keys. + */ + maxExecutors?: number | undefined + /** + * Maximum amount of parallel user ops to keep in the meempool (same sender, different nonce keys). + * @default 10 + */ + mempoolMaxParallelOps?: number | undefined + /** + * Maximum amount of sequential user ops to keep in the mempool (same sender and nonce key, different nonce values). + * @default 0 + */ + mempoolMaxQueuedOps?: number | undefined + /** + * Minimum stake required for a relay (in 10e18). + * @default 1 + */ + minEntityStake?: number | undefined + /** + * Minimum unstake delay (seconds). + * @default 1 + */ + minEntityUnstakeDelay?: number | undefined + /** + * Minimum balance required for each executor account (below which the utility account will refill). + */ + minExecutorBalance?: string | undefined + /** + * Name of the network (used for metrics). + * @default "localhost" + */ + networkName?: string | undefined + /** + * Amount to multiply the paymaster gas limits fetched from simulations. + */ + paymasterGasLimitMultiplier?: string | undefined + /** + * Address of the `PerOpInflator` contract. + */ + perOpInflatorAddress?: `0x${string}` | undefined + /** + * Polling interval for querying for new blocks (ms). + * @default 1000 + */ + pollingInterval?: number | undefined + /** + * Port to listen on. + * @default 3000 + */ + port?: number | undefined + /** + * RPC url to connect to. + */ + rpcUrl: string + /** + * Enable safe mode (enforcing all ERC-4337 rules). + * @default true + */ + safeMode?: boolean | undefined + /** + * RPC url to send transactions to (e.g. flashbots relay). + */ + sendTransactionRpcUrl?: string | undefined + /** + * Timeout for incoming requests (in ms). + */ + timeout?: number | undefined + /** + * Private key of the utility account. + */ + utilityPrivateKey?: string | undefined + /** + * Maximum payload size for websocket messages in bytes (default to 1MB). + */ + websocketMaxPayloadSize?: number | undefined + /** + * Enable websocket server. + */ + websocket?: boolean | undefined + } +} diff --git a/src/instances/anvil.test.ts b/src/instances/anvil.test.ts index 96ade15..9e25e44 100644 --- a/src/instances/anvil.test.ts +++ b/src/instances/anvil.test.ts @@ -1,12 +1,11 @@ +import { Instance } from 'prool' import { afterEach, expect, test } from 'vitest' -import type { Instance } from '../instance.js' -import { type AnvilParameters, anvil } from './anvil.js' -const instances: Instance[] = [] +const instances: Instance.Instance[] = [] const timestamp = 1717114065 -const defineInstance = (parameters: AnvilParameters = {}) => { - const instance = anvil(parameters) +const defineInstance = (parameters: Instance.anvil.Parameters = {}) => { + const instance = Instance.anvil(parameters) instances.push(instance) return instance } diff --git a/src/instances/anvil.ts b/src/instances/anvil.ts index 281ab42..a9b8682 100644 --- a/src/instances/anvil.ts +++ b/src/instances/anvil.ts @@ -1,262 +1,19 @@ -import { defineInstance } from '../instance.js' +import * as Instance from '../Instance.js' +import { toArgs } from '../internal/utils.js' import { execa } from '../processes/execa.js' -import { toArgs } from '../utils.js' - -export type AnvilParameters = { - /** - * Number of dev accounts to generate and configure. - * - * @defaultValue 10 - */ - accounts?: number | undefined - /** - * Set the Access-Control-Allow-Origin response header (CORS). - * - * @defaultValue * - */ - allowOrigin?: string | undefined - /** - * Enable autoImpersonate on startup - */ - autoImpersonate?: boolean | undefined - /** - * The balance of every dev account in Ether. - * - * @defaultValue 10000 - */ - balance?: number | bigint | undefined - /** - * The base fee in a block. - */ - blockBaseFeePerGas?: number | bigint | undefined - /** - * Block time in seconds for interval mining. - */ - blockTime?: number | undefined - /** - * Path or alias to the Anvil binary. - */ - binary?: string | undefined - /** - * The chain id. - */ - chainId?: number | undefined - /** - * EIP-170: Contract code size limit in bytes. Useful to increase this because of tests. - * - * @defaultValue 0x6000 (~25kb) - */ - codeSizeLimit?: number | undefined - /** - * Sets the number of assumed available compute units per second for this fork provider. - * - * @defaultValue 350 - * @see https://github.com/alchemyplatform/alchemy-docs/blob/master/documentation/compute-units.md#rate-limits-cups - */ - computeUnitsPerSecond?: number | undefined - /** - * Writes output of `anvil` as json to user-specified file. - */ - configOut?: string | undefined - /** - * Sets the derivation path of the child key to be derived. - * - * @defaultValue m/44'/60'/0'/0/ - */ - derivationPath?: string | undefined - /** - * Disable the `call.gas_limit <= block.gas_limit` constraint. - */ - disableBlockGasLimit?: boolean | undefined - /** - * Dump the state of chain on exit to the given file. If the value is a directory, the state will be - * written to `/state.json`. - */ - dumpState?: string | undefined - /** - * Fetch state over a remote endpoint instead of starting from an empty state. - * - * If you want to fetch state from a specific block number, add a block number like `http://localhost:8545@1400000` - * or use the `forkBlockNumber` option. - */ - forkUrl?: string | undefined - /** - * Fetch state from a specific block number over a remote endpoint. - * - * Requires `forkUrl` to be set. - */ - forkBlockNumber?: number | bigint | undefined - /** - * Specify chain id to skip fetching it from remote endpoint. This enables offline-start mode. - * - * You still must pass both `forkUrl` and `forkBlockNumber`, and already have your required state cached - * on disk, anything missing locally would be fetched from the remote. - */ - forkChainId?: number | undefined - /** - * Specify headers to send along with any request to the remote JSON-RPC server in forking mode. - * - * e.g. "User-Agent: test-agent" - * - * Requires `forkUrl` to be set. - */ - forkHeader?: Record | undefined - /** - * Initial retry backoff on encountering errors. - */ - forkRetryBackoff?: number | undefined - /** - * The block gas limit. - */ - gasLimit?: number | bigint | undefined - /** - * The gas price. - */ - gasPrice?: number | bigint | undefined - /** - * The EVM hardfork to use. - */ - hardfork?: - | 'Frontier' - | 'Homestead' - | 'Dao' - | 'Tangerine' - | 'SpuriousDragon' - | 'Byzantium' - | 'Constantinople' - | 'Petersburg' - | 'Istanbul' - | 'Muirglacier' - | 'Berlin' - | 'London' - | 'ArrowGlacier' - | 'GrayGlacier' - | 'Paris' - | 'Shanghai' - | 'Cancun' - | 'Prague' - | 'Latest' - | undefined - /** - * The host the server will listen on. - */ - host?: string | undefined - /** - * Initialize the genesis block with the given `genesis.json` file. - */ - init?: string | undefined - /** - * Launch an ipc server at the given path or default path = `/tmp/anvil.ipc`. - */ - ipc?: string | undefined - /** - * Initialize the chain from a previously saved state snapshot. - */ - loadState?: string | undefined - /** - * BIP39 mnemonic phrase used for generating accounts. - */ - mnemonic?: string | undefined - /** - * Automatically generates a BIP39 mnemonic phrase, and derives accounts from it. - */ - mnemonicRandom?: boolean | undefined - /** - * Disable CORS. - */ - noCors?: boolean | undefined - /** - * Disable auto and interval mining, and mine on demand instead. - */ - noMining?: boolean | undefined - /** - * Disables rate limiting for this node's provider. - * - * @defaultValue false - * @see https://github.com/alchemyplatform/alchemy-docs/blob/master/documentation/compute-units.md#rate-limits-cups - */ - noRateLimit?: boolean | undefined - /** - * Explicitly disables the use of RPC caching. - * - * All storage slots are read entirely from the endpoint. - */ - noStorageCaching?: boolean | undefined - /** - * How transactions are sorted in the mempool. - * - * @defaultValue fees - */ - order?: string | undefined - /** - * Run an Optimism chain. - */ - optimism?: boolean | undefined - /** - * Port number to listen on. - * - * @defaultValue 8545 - */ - port?: number | undefined - /** - * Don't keep full chain history. If a number argument is specified, at most this number of states is kept in memory. - */ - pruneHistory?: number | undefined | boolean - /** - * Number of retry requests for spurious networks (timed out requests). - * - * @defaultValue 5 - */ - retries?: number | undefined - /** - * Don't print anything on startup and don't print logs. - */ - silent?: boolean | undefined - /** - * Slots in an epoch. - */ - slotsInAnEpoch?: number | undefined - /** - * Enable steps tracing used for debug calls returning geth-style traces. - */ - stepsTracing?: boolean | undefined - /** - * Interval in seconds at which the status is to be dumped to disk. - */ - stateInterval?: number | undefined - /** - * This is an alias for both `loadState` and `dumpState`. It initializes the chain with the state stored at the - * file, if it exists, and dumps the chain's state on exit - */ - state?: string | undefined - /** - * Timeout in ms for requests sent to remote JSON-RPC server in forking mode. - * - * @defaultValue 45000 - */ - timeout?: number | undefined - /** - * The timestamp of the genesis block. - */ - timestamp?: number | bigint | undefined - /** - * Number of blocks with transactions to keep in memory. - */ - transactionBlockKeeper?: number | undefined -} /** * Defines an Anvil instance. * * @example * ```ts - * const instance = anvil({ forkRpcUrl: 'https://cloudflare-eth.com', port: 8546 }) + * const instance = Instance.anvil({ forkRpcUrl: 'https://cloudflare-eth.com', port: 8546 }) * await instance.start() * // ... * await instance.stop() * ``` */ -export const anvil = defineInstance((parameters?: AnvilParameters) => { +export const anvil = Instance.define((parameters?: anvil.Parameters) => { const { binary = 'anvil', ...args } = parameters || {} const name = 'anvil' @@ -302,3 +59,248 @@ export const anvil = defineInstance((parameters?: AnvilParameters) => { }, } }) + +export declare namespace anvil { + export type Parameters = { + /** + * Number of dev accounts to generate and configure. + * + * @defaultValue 10 + */ + accounts?: number | undefined + /** + * Set the Access-Control-Allow-Origin response header (CORS). + * + * @defaultValue * + */ + allowOrigin?: string | undefined + /** + * Enable autoImpersonate on startup + */ + autoImpersonate?: boolean | undefined + /** + * The balance of every dev account in Ether. + * + * @defaultValue 10000 + */ + balance?: number | bigint | undefined + /** + * The base fee in a block. + */ + blockBaseFeePerGas?: number | bigint | undefined + /** + * Block time in seconds for interval mining. + */ + blockTime?: number | undefined + /** + * Path or alias to the Anvil binary. + */ + binary?: string | undefined + /** + * The chain id. + */ + chainId?: number | undefined + /** + * EIP-170: Contract code size limit in bytes. Useful to increase this because of tests. + * + * @defaultValue 0x6000 (~25kb) + */ + codeSizeLimit?: number | undefined + /** + * Sets the number of assumed available compute units per second for this fork provider. + * + * @defaultValue 350 + * @see https://github.com/alchemyplatform/alchemy-docs/blob/master/documentation/compute-units.md#rate-limits-cups + */ + computeUnitsPerSecond?: number | undefined + /** + * Writes output of `anvil` as json to user-specified file. + */ + configOut?: string | undefined + /** + * Sets the derivation path of the child key to be derived. + * + * @defaultValue m/44'/60'/0'/0/ + */ + derivationPath?: string | undefined + /** + * Disable the `call.gas_limit <= block.gas_limit` constraint. + */ + disableBlockGasLimit?: boolean | undefined + /** + * Dump the state of chain on exit to the given file. If the value is a directory, the state will be + * written to `/state.json`. + */ + dumpState?: string | undefined + /** + * Fetch state over a remote endpoint instead of starting from an empty state. + * + * If you want to fetch state from a specific block number, add a block number like `http://localhost:8545@1400000` + * or use the `forkBlockNumber` option. + */ + forkUrl?: string | undefined + /** + * Fetch state from a specific block number over a remote endpoint. + * + * Requires `forkUrl` to be set. + */ + forkBlockNumber?: number | bigint | undefined + /** + * Specify chain id to skip fetching it from remote endpoint. This enables offline-start mode. + * + * You still must pass both `forkUrl` and `forkBlockNumber`, and already have your required state cached + * on disk, anything missing locally would be fetched from the remote. + */ + forkChainId?: number | undefined + /** + * Specify headers to send along with any request to the remote JSON-RPC server in forking mode. + * + * e.g. "User-Agent: test-agent" + * + * Requires `forkUrl` to be set. + */ + forkHeader?: Record | undefined + /** + * Initial retry backoff on encountering errors. + */ + forkRetryBackoff?: number | undefined + /** + * The block gas limit. + */ + gasLimit?: number | bigint | undefined + /** + * The gas price. + */ + gasPrice?: number | bigint | undefined + /** + * The EVM hardfork to use. + */ + hardfork?: + | 'Frontier' + | 'Homestead' + | 'Dao' + | 'Tangerine' + | 'SpuriousDragon' + | 'Byzantium' + | 'Constantinople' + | 'Petersburg' + | 'Istanbul' + | 'Muirglacier' + | 'Berlin' + | 'London' + | 'ArrowGlacier' + | 'GrayGlacier' + | 'Paris' + | 'Shanghai' + | 'Cancun' + | 'Prague' + | 'Latest' + | undefined + /** + * The host the server will listen on. + */ + host?: string | undefined + /** + * Initialize the genesis block with the given `genesis.json` file. + */ + init?: string | undefined + /** + * Launch an ipc server at the given path or default path = `/tmp/anvil.ipc`. + */ + ipc?: string | undefined + /** + * Initialize the chain from a previously saved state snapshot. + */ + loadState?: string | undefined + /** + * BIP39 mnemonic phrase used for generating accounts. + */ + mnemonic?: string | undefined + /** + * Automatically generates a BIP39 mnemonic phrase, and derives accounts from it. + */ + mnemonicRandom?: boolean | undefined + /** + * Disable CORS. + */ + noCors?: boolean | undefined + /** + * Disable auto and interval mining, and mine on demand instead. + */ + noMining?: boolean | undefined + /** + * Disables rate limiting for this node's provider. + * + * @defaultValue false + * @see https://github.com/alchemyplatform/alchemy-docs/blob/master/documentation/compute-units.md#rate-limits-cups + */ + noRateLimit?: boolean | undefined + /** + * Explicitly disables the use of RPC caching. + * + * All storage slots are read entirely from the endpoint. + */ + noStorageCaching?: boolean | undefined + /** + * How transactions are sorted in the mempool. + * + * @defaultValue fees + */ + order?: string | undefined + /** + * Run an Optimism chain. + */ + optimism?: boolean | undefined + /** + * Port number to listen on. + * + * @defaultValue 8545 + */ + port?: number | undefined + /** + * Don't keep full chain history. If a number argument is specified, at most this number of states is kept in memory. + */ + pruneHistory?: number | undefined | boolean + /** + * Number of retry requests for spurious networks (timed out requests). + * + * @defaultValue 5 + */ + retries?: number | undefined + /** + * Don't print anything on startup and don't print logs. + */ + silent?: boolean | undefined + /** + * Slots in an epoch. + */ + slotsInAnEpoch?: number | undefined + /** + * Enable steps tracing used for debug calls returning geth-style traces. + */ + stepsTracing?: boolean | undefined + /** + * Interval in seconds at which the status is to be dumped to disk. + */ + stateInterval?: number | undefined + /** + * This is an alias for both `loadState` and `dumpState`. It initializes the chain with the state stored at the + * file, if it exists, and dumps the chain's state on exit + */ + state?: string | undefined + /** + * Timeout in ms for requests sent to remote JSON-RPC server in forking mode. + * + * @defaultValue 45000 + */ + timeout?: number | undefined + /** + * The timestamp of the genesis block. + */ + timestamp?: number | bigint | undefined + /** + * Number of blocks with transactions to keep in memory. + */ + transactionBlockKeeper?: number | undefined + } +} diff --git a/src/instances/package.json b/src/instances/package.json deleted file mode 100644 index d724bf4..0000000 --- a/src/instances/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "module", - "types": "../_lib/exports/instances/index.d.ts", - "module": "../_lib/exports/instances/index.js" -} diff --git a/src/instances/rundler.test.ts b/src/instances/rundler.test.ts index 0c7be6b..204bf5b 100644 --- a/src/instances/rundler.test.ts +++ b/src/instances/rundler.test.ts @@ -1,11 +1,10 @@ +import { Instance } from 'prool' import { afterEach, expect, test } from 'vitest' -import type { Instance } from '../instance.js' -import { type RundlerParameters, rundler } from './rundler.js' -const instances: Instance[] = [] +const instances: Instance.Instance[] = [] -const defineInstance = (parameters: RundlerParameters = {}) => { - const instance = rundler(parameters) +const defineInstance = (parameters: Instance.rundler.Parameters = {}) => { + const instance = Instance.rundler(parameters) instances.push(instance) return instance } diff --git a/src/instances/rundler.ts b/src/instances/rundler.ts index c76677a..57aa1e5 100644 --- a/src/instances/rundler.ts +++ b/src/instances/rundler.ts @@ -1,384 +1,15 @@ import getPort from 'get-port' -import { defineInstance } from '../instance.js' +import * as Instance from '../Instance.js' +import { toArgs } from '../internal/utils.js' import { execa } from '../processes/execa.js' -import { toArgs } from '../utils.js' - -export type RundlerParameters = { - /** - * The path to the rundler binary - * - * @default rundler - */ - binary?: string | undefined - - /** - * The version of the entrypoint to use - * - * @default 0.6.0 - */ - entryPointVersion?: '0.6.0' | '0.7.0' | undefined - - /** - * Network to look up a hardcoded chain spec. - * @default dev - */ - network?: string | undefined - - /** - * Path to a chain spec TOML file. - */ - chainSpec?: string | undefined - - /** - * EVM Node HTTP URL to use. - * - * @default http://localhost:8545 - */ - nodeHttp?: string | undefined - - /** - * Maximum verification gas. - * @default 5000000 - */ - maxVerificationGas?: number | undefined - - /** - * Maximum bundle gas. - * @default 25000000 - */ - maxBundleGas?: number | undefined - - /** - * Minimum stake value. - * @default 1000000000000000000 - */ - minStakeValue?: number - - /** - * Minimum unstake delay. - * @default 84600 - */ - minUnstakeDelay?: number | undefined - - /** - * Number of blocks to search when calling eth_getUserOperationByHash. - * @default 100 - */ - userOperationEventBlockDistance?: number | undefined - - /** - * Maximum gas for simulating handle operations. - * @default 20000000 - */ - maxSimulateHandleOpsGas?: number | undefined - - /** - * The gas fee to use during verification estimation. - * @default 1000000000000 10K gwei - */ - verificationEstimationGasFee?: number | undefined - - /** - * Bundle transaction priority fee overhead over network value. - * @default 0 - */ - bundlePriorityFeeOverheadPercent?: number | undefined - - /** - * Priority fee mode kind. - * Possible values are base_fee_percent and priority_fee_increase_percent. - * @default priority_fee_increase_percent - */ - priorityFeeModeKind?: - | 'base_fee_percent' - | 'priority_fee_increase_percent' - | undefined - - /** - * Priority fee mode value. - * @default 0 - */ - priorityFeeModeValue?: number | undefined - - /** - * Percentage of the current network fees a user operation must have in order to be accepted into the mempool. - * @default 100 - */ - baseFeeAcceptPercent?: number | undefined - - /** - * AWS region. - * @default us-east-1 - */ - awsRegion?: string | undefined - - /** - * Interval at which the builder polls an RPC node for new blocks and mined transactions. - * @default 100 - */ - ethPollIntervalMillis?: number | undefined - - /** - * Flag for unsafe bundling mode. When set Rundler will skip checking simulation rules (and any debug_traceCall). - * - * @default true - */ - unsafe?: boolean | undefined - - /** - * Path to the mempool configuration file. - * This path can either be a local file path or an S3 url. - */ - mempoolConfigPath?: string | undefined - - metrics?: - | { - /** - * Port to listen on for metrics requests. - * @default 8080 - */ - port?: number | undefined - - /** - * Host to listen on for metrics requests. - * @default 0.0.0.0 - */ - host?: string | undefined - - /** - * Tags for metrics in the format key1=value1,key2=value2,... - */ - tags?: string | undefined - - /** - * Sample interval to use for sampling metrics. - * @default 1000 - */ - sampleIntervalMillis?: number | undefined - } - | undefined - - logging?: - | { - /** - * Log file. If not provided, logs will be written to stdout. - */ - file?: string | undefined - - /** - * If set, logs will be written in JSON format. - */ - json?: boolean | undefined - } - | undefined - - rpc?: - | { - /** - * Port to listen on for JSON-RPC requests. - * @default 3000 - */ - port?: number | undefined - - /** - * Host to listen on for JSON-RPC requests. - * @default 127.0.0.1 - */ - host?: string | undefined - - /** - * Which APIs to expose over the RPC interface. - * @default eth,rundler - */ - api?: string | undefined - - /** - * Timeout for RPC requests. - * @default 20 - */ - timeoutSeconds?: number | undefined - - /** - * Maximum number of concurrent connections. - * @default 100 - */ - maxConnections?: number | undefined - } - | undefined - - pool?: - | { - /** - * Maximum size in bytes for the pool. - * @default 500000000, 0.5 GB - */ - maxSizeInBytes?: number | undefined - - /** - * Maximum number of user operations for an unstaked sender. - * @default 4 - */ - sameSenderMempoolCount?: number | undefined - - /** - * Minimum replacement fee increase percentage. - * @default 10 - */ - minReplacementFeeIncreasePercentage?: number | undefined - - /** - * Path to a blocklist file. - * This path can either be a local file path or an S3 url. - */ - blocklistPath?: string | undefined - - /** - * Path to an allowlist file. - * This path can either be a local file path or an S3 url. - */ - allowlistPath?: string | undefined - - /** - * Size of the chain history. - */ - chainHistorySize?: number | undefined - - /** - * Boolean field that sets whether the pool server starts with paymaster tracking enabled. - * @default true - */ - paymasterTrackingEnabled?: boolean | undefined - - /** - * Length of the paymaster cache. - * @default 10_000 - */ - paymasterCacheLength?: number | undefined - - /** - * Boolean field that sets whether the pool server starts with reputation tracking enabled. - * @default true - */ - reputationTrackingEnabled?: boolean | undefined - - /** - * The minimum number of blocks that a UO must stay in the mempool before it can be requested to be dropped by the user. - * @default 10 - */ - dropMinNumBlocks?: number | undefined - } - | undefined - - builder?: - | { - /** - * Private key to use for signing transactions. - * If used with awsKmsKeyIds, then explicitly pass in `null` here. - * - * @default 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - */ - privateKey?: string | undefined - - /** - * AWS KMS key IDs to use for signing transactions (comma-separated). - * Only required if privateKey is not provided. - */ - awsKmsKeyIds?: string | undefined - - /** - * Redis URI to use for KMS leasing. - * Only required when awsKmsKeyIds are provided. - * - * @default "" - */ - redisUri?: string | undefined - - /** - * Redis lock TTL in milliseconds. - * Only required when awsKmsKeyIds are provided. - * @default 60000 - */ - redisLockTtlMillis?: number | undefined - - /** - * Maximum number of ops to include in one bundle. - * @default 128 - */ - maxBundleSize?: number | undefined - - /** - * If present, the URL of the ETH provider that will be used to send transactions. - * Defaults to the value of nodeHttp. - */ - submitUrl?: string | undefined - - /** - * Choice of what sender type to use for transaction submission. - * @default raw - * options: raw, conditional, flashbots, polygon_bloxroute - */ - sender?: - | 'raw' - | 'conditional' - | 'flashbots' - | 'polygonBloxroute' - | undefined - - /** - * After submitting a bundle transaction, the maximum number of blocks to wait for that transaction to mine before trying to resend with higher gas fees. - * @default 2 - */ - maxBlocksToWaitForMine?: number | undefined - - /** - * Percentage amount to increase gas fees when retrying a transaction after it failed to mine. - * @default 10 - */ - replacementFeePercentIncrease?: number | undefined - - /** - * Maximum number of fee increases to attempt. - * Seven increases of 10% is roughly 2x the initial fees. - * @default 7 - */ - maxFeeIncreases?: number | undefined - - /** - * Additional builders to send bundles to through the Flashbots relay RPC (comma-separated). - * List of builders that the Flashbots RPC supports can be found here. - * @default flashbots - */ - flashbotsRelayBuilders?: string | undefined - - /** - * Authorization key to use with the Flashbots relay. - * See here for more info. - * @default None - */ - flashbotsRelayAuthKey?: string | undefined - - /** - * If using the bloxroute transaction sender on Polygon, this is the auth header to supply with the requests. - * @default None - */ - bloxrouteAuthHeader?: string | undefined - - /** - * If running multiple builder processes, this is the index offset to assign unique indexes to each bundle sender. - * @default 0 - */ - indexOffset?: number | undefined - } - | undefined -} /** * Defines a Rundler instance. * * @example * ```ts - * const instance = rundler({ + * const instance = Instance.rundler({ * nodeHttp: 'http://localhost:8545', * }); * @@ -387,9 +18,9 @@ export type RundlerParameters = { * await instance.stop() * ``` */ -export const rundler = defineInstance((parameters?: RundlerParameters) => { +export const rundler = Instance.define((parameters?: rundler.Parameters) => { const { binary = 'rundler', ...args } = (parameters ?? - {}) as RundlerParameters + {}) as rundler.Parameters const host = '127.0.0.1' const name = 'rundler' @@ -429,7 +60,7 @@ export const rundler = defineInstance((parameters?: RundlerParameters) => { unsafe: args.unsafe ?? true, userOperationEventBlockDistance: args.userOperationEventBlockDistance ?? 100, - } satisfies RundlerParameters + } satisfies rundler.Parameters const entrypointArgs = (() => { if (args.entryPointVersion === '0.6.0') @@ -467,3 +98,374 @@ export const rundler = defineInstance((parameters?: RundlerParameters) => { }, } }) + +export declare namespace rundler { + export type Parameters = { + /** + * The path to the rundler binary + * + * @default rundler + */ + binary?: string | undefined + + /** + * The version of the entrypoint to use + * + * @default 0.6.0 + */ + entryPointVersion?: '0.6.0' | '0.7.0' | undefined + + /** + * Network to look up a hardcoded chain spec. + * @default dev + */ + network?: string | undefined + + /** + * Path to a chain spec TOML file. + */ + chainSpec?: string | undefined + + /** + * EVM Node HTTP URL to use. + * + * @default http://localhost:8545 + */ + nodeHttp?: string | undefined + + /** + * Maximum verification gas. + * @default 5000000 + */ + maxVerificationGas?: number | undefined + + /** + * Maximum bundle gas. + * @default 25000000 + */ + maxBundleGas?: number | undefined + + /** + * Minimum stake value. + * @default 1000000000000000000 + */ + minStakeValue?: number + + /** + * Minimum unstake delay. + * @default 84600 + */ + minUnstakeDelay?: number | undefined + + /** + * Number of blocks to search when calling eth_getUserOperationByHash. + * @default 100 + */ + userOperationEventBlockDistance?: number | undefined + + /** + * Maximum gas for simulating handle operations. + * @default 20000000 + */ + maxSimulateHandleOpsGas?: number | undefined + + /** + * The gas fee to use during verification estimation. + * @default 1000000000000 10K gwei + */ + verificationEstimationGasFee?: number | undefined + + /** + * Bundle transaction priority fee overhead over network value. + * @default 0 + */ + bundlePriorityFeeOverheadPercent?: number | undefined + + /** + * Priority fee mode kind. + * Possible values are base_fee_percent and priority_fee_increase_percent. + * @default priority_fee_increase_percent + */ + priorityFeeModeKind?: + | 'base_fee_percent' + | 'priority_fee_increase_percent' + | undefined + + /** + * Priority fee mode value. + * @default 0 + */ + priorityFeeModeValue?: number | undefined + + /** + * Percentage of the current network fees a user operation must have in order to be accepted into the mempool. + * @default 100 + */ + baseFeeAcceptPercent?: number | undefined + + /** + * AWS region. + * @default us-east-1 + */ + awsRegion?: string | undefined + + /** + * Interval at which the builder polls an RPC node for new blocks and mined transactions. + * @default 100 + */ + ethPollIntervalMillis?: number | undefined + + /** + * Flag for unsafe bundling mode. When set Rundler will skip checking simulation rules (and any debug_traceCall). + * + * @default true + */ + unsafe?: boolean | undefined + + /** + * Path to the mempool configuration file. + * This path can either be a local file path or an S3 url. + */ + mempoolConfigPath?: string | undefined + + metrics?: + | { + /** + * Port to listen on for metrics requests. + * @default 8080 + */ + port?: number | undefined + + /** + * Host to listen on for metrics requests. + * @default 0.0.0.0 + */ + host?: string | undefined + + /** + * Tags for metrics in the format key1=value1,key2=value2,... + */ + tags?: string | undefined + + /** + * Sample interval to use for sampling metrics. + * @default 1000 + */ + sampleIntervalMillis?: number | undefined + } + | undefined + + logging?: + | { + /** + * Log file. If not provided, logs will be written to stdout. + */ + file?: string | undefined + + /** + * If set, logs will be written in JSON format. + */ + json?: boolean | undefined + } + | undefined + + rpc?: + | { + /** + * Port to listen on for JSON-RPC requests. + * @default 3000 + */ + port?: number | undefined + + /** + * Host to listen on for JSON-RPC requests. + * @default 127.0.0.1 + */ + host?: string | undefined + + /** + * Which APIs to expose over the RPC interface. + * @default eth,rundler + */ + api?: string | undefined + + /** + * Timeout for RPC requests. + * @default 20 + */ + timeoutSeconds?: number | undefined + + /** + * Maximum number of concurrent connections. + * @default 100 + */ + maxConnections?: number | undefined + } + | undefined + + pool?: + | { + /** + * Maximum size in bytes for the pool. + * @default 500000000, 0.5 GB + */ + maxSizeInBytes?: number | undefined + + /** + * Maximum number of user operations for an unstaked sender. + * @default 4 + */ + sameSenderMempoolCount?: number | undefined + + /** + * Minimum replacement fee increase percentage. + * @default 10 + */ + minReplacementFeeIncreasePercentage?: number | undefined + + /** + * Path to a blocklist file. + * This path can either be a local file path or an S3 url. + */ + blocklistPath?: string | undefined + + /** + * Path to an allowlist file. + * This path can either be a local file path or an S3 url. + */ + allowlistPath?: string | undefined + + /** + * Size of the chain history. + */ + chainHistorySize?: number | undefined + + /** + * Boolean field that sets whether the pool server starts with paymaster tracking enabled. + * @default true + */ + paymasterTrackingEnabled?: boolean | undefined + + /** + * Length of the paymaster cache. + * @default 10_000 + */ + paymasterCacheLength?: number | undefined + + /** + * Boolean field that sets whether the pool server starts with reputation tracking enabled. + * @default true + */ + reputationTrackingEnabled?: boolean | undefined + + /** + * The minimum number of blocks that a UO must stay in the mempool before it can be requested to be dropped by the user. + * @default 10 + */ + dropMinNumBlocks?: number | undefined + } + | undefined + + builder?: + | { + /** + * Private key to use for signing transactions. + * If used with awsKmsKeyIds, then explicitly pass in `null` here. + * + * @default 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + */ + privateKey?: string | undefined + + /** + * AWS KMS key IDs to use for signing transactions (comma-separated). + * Only required if privateKey is not provided. + */ + awsKmsKeyIds?: string | undefined + + /** + * Redis URI to use for KMS leasing. + * Only required when awsKmsKeyIds are provided. + * + * @default "" + */ + redisUri?: string | undefined + + /** + * Redis lock TTL in milliseconds. + * Only required when awsKmsKeyIds are provided. + * @default 60000 + */ + redisLockTtlMillis?: number | undefined + + /** + * Maximum number of ops to include in one bundle. + * @default 128 + */ + maxBundleSize?: number | undefined + + /** + * If present, the URL of the ETH provider that will be used to send transactions. + * Defaults to the value of nodeHttp. + */ + submitUrl?: string | undefined + + /** + * Choice of what sender type to use for transaction submission. + * @default raw + * options: raw, conditional, flashbots, polygon_bloxroute + */ + sender?: + | 'raw' + | 'conditional' + | 'flashbots' + | 'polygonBloxroute' + | undefined + + /** + * After submitting a bundle transaction, the maximum number of blocks to wait for that transaction to mine before trying to resend with higher gas fees. + * @default 2 + */ + maxBlocksToWaitForMine?: number | undefined + + /** + * Percentage amount to increase gas fees when retrying a transaction after it failed to mine. + * @default 10 + */ + replacementFeePercentIncrease?: number | undefined + + /** + * Maximum number of fee increases to attempt. + * Seven increases of 10% is roughly 2x the initial fees. + * @default 7 + */ + maxFeeIncreases?: number | undefined + + /** + * Additional builders to send bundles to through the Flashbots relay RPC (comma-separated). + * List of builders that the Flashbots RPC supports can be found here. + * @default flashbots + */ + flashbotsRelayBuilders?: string | undefined + + /** + * Authorization key to use with the Flashbots relay. + * See here for more info. + * @default None + */ + flashbotsRelayAuthKey?: string | undefined + + /** + * If using the bloxroute transaction sender on Polygon, this is the auth header to supply with the requests. + * @default None + */ + bloxrouteAuthHeader?: string | undefined + + /** + * If running multiple builder processes, this is the index offset to assign unique indexes to each bundle sender. + * @default 0 + */ + indexOffset?: number | undefined + } + | undefined + } +} diff --git a/src/utils.test.ts b/src/internal/utils.test.ts similarity index 100% rename from src/utils.test.ts rename to src/internal/utils.test.ts diff --git a/src/utils.ts b/src/internal/utils.ts similarity index 100% rename from src/utils.ts rename to src/internal/utils.ts diff --git a/src/processes/execa.test.ts b/src/processes/execa.test.ts index 51ef52f..e584732 100644 --- a/src/processes/execa.test.ts +++ b/src/processes/execa.test.ts @@ -1,8 +1,8 @@ import { EventEmitter } from 'eventemitter3' import { afterEach, expect, test } from 'vitest' -import { type ExecaProcess, execa } from './execa.js' +import { execa } from './execa.js' -const processes: ExecaProcess[] = [] +const processes: execa.ReturnType[] = [] function createProcess() { const process = execa({ name: 'foo' }) processes.push(process) diff --git a/src/processes/execa.ts b/src/processes/execa.ts index 07fad6d..7be5b74 100644 --- a/src/processes/execa.ts +++ b/src/processes/execa.ts @@ -1,21 +1,20 @@ import type { SignalConstants } from 'node:os' import { execa as exec, type ResultPromise } from 'execa' -import type { InstanceStartOptions_internal } from '../instance.js' -import { stripColors } from '../utils.js' +import type * as Instance from '../Instance.js' +import { stripColors } from '../internal/utils.js' export type Process_internal = ResultPromise<{ cleanup: true; reject: false }> -export type ExecaStartOptions = InstanceStartOptions_internal & { - resolver(options: { - process: Process_internal - reject(data: string): Promise - resolve(): void - }): void -} - -export type ExecaParameters = { name: string } +export type ExecaStartOptions = + Instance.define.InstanceStartOptions_internal & { + resolver(options: { + process: Process_internal + reject(data: string): Promise + resolve(): void + }): void + } -export type ExecaProcess = { +export type Process = { _internal: { process: Process_internal } @@ -26,9 +25,8 @@ export type ExecaProcess = { ): Promise stop(signal?: keyof SignalConstants | number): Promise } -export type ExecaReturnType = ExecaProcess -export function execa(parameters: ExecaParameters): ExecaReturnType { +export function execa(parameters: execa.Parameters): execa.ReturnType { const { name } = parameters const errorMessages: string[] = [] @@ -112,3 +110,9 @@ export function execa(parameters: ExecaParameters): ExecaReturnType { }, } } + +export declare namespace execa { + export type Parameters = { name: string } + + export type ReturnType = Process +} diff --git a/src/processes/index.ts b/src/processes/index.ts new file mode 100644 index 0000000..1335055 --- /dev/null +++ b/src/processes/index.ts @@ -0,0 +1 @@ +export * as execa from './execa.js' diff --git a/src/processes/package.json b/src/processes/package.json deleted file mode 100644 index a71f0b8..0000000 --- a/src/processes/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "module", - "types": "../_lib/exports/processes/index.d.ts", - "module": "../_lib/exports/processes/index.js" -} From 3bf6732206c8184d02ed873fd5db5a368b2b3c59 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:10:36 +1100 Subject: [PATCH 04/21] chore: mv --- .github/{ => actions}/install-dependencies/action.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ => actions}/install-dependencies/action.yml (100%) diff --git a/.github/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml similarity index 100% rename from .github/install-dependencies/action.yml rename to .github/actions/install-dependencies/action.yml From 2e9844d8c0a290eeffa862626a77dd929f71800f Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:00:45 +1100 Subject: [PATCH 05/21] chore: up --- .changeset/giant-knives-rhyme.md | 2 +- .changeset/lazy-toys-report.md | 7 +- .github/workflows/verify.yml | 6 - README.md | 43 +-- src/Instance.ts | 1 - src/Pool.test.ts | 5 +- src/Server.test.ts | 40 +-- src/instances/rundler.test.ts | 92 ------ src/instances/rundler.ts | 471 ------------------------------- test/utils.ts | 15 - 10 files changed, 6 insertions(+), 676 deletions(-) delete mode 100644 src/instances/rundler.test.ts delete mode 100644 src/instances/rundler.ts diff --git a/.changeset/giant-knives-rhyme.md b/.changeset/giant-knives-rhyme.md index f5713ad..bc95701 100644 --- a/.changeset/giant-knives-rhyme.md +++ b/.changeset/giant-knives-rhyme.md @@ -2,4 +2,4 @@ "prool": minor --- -**Breaking:** Removed `silius` + `stackup` instances. +**Breaking:** Removed `silius`, `stackup`, `rundler` instances. diff --git a/.changeset/lazy-toys-report.md b/.changeset/lazy-toys-report.md index 26b76e0..39c162c 100644 --- a/.changeset/lazy-toys-report.md +++ b/.changeset/lazy-toys-report.md @@ -8,7 +8,7 @@ ```diff - import { createServer } from 'prool' -- import { anvil, alto, rundler } from 'prool/instances' +- import { anvil, alto } from 'prool/instances' - import { defineInstance } from 'prool' - import { definePool } from 'prool' + import { Instance, Pool, Server } from 'prool' @@ -24,7 +24,7 @@ }) ``` -### `anvil`, `alto`, `rundler` → `Instance.anvil`, `Instance.alto`, `Instance.rundler` +### `anvil`, `alto` → `Instance.anvil`, `Instance.alto` ```diff - const instance = anvil({ ... }) @@ -32,9 +32,6 @@ - const instance = alto({ ... }) + const instance = Instance.alto({ ... }) - -- const instance = rundler({ ... }) -+ const instance = Instance.rundler({ ... }) ``` ### `defineInstance` → `Instance.define` diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 2360c9c..099cf94 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -34,12 +34,6 @@ jobs: - name: Set up Foundry uses: foundry-rs/foundry-toolchain@v1 - - name: Set up Rundler - uses: jaxxstorm/action-install-gh-release@v1.12.0 - with: - repo: alchemyplatform/rundler - platform: linux - - name: Set up Docker uses: docker/setup-docker-action@v4 diff --git a/README.md b/README.md index 777be27..db6375a 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Prool is a library that provides programmatic HTTP testing instances for Ethereu Prool contains a set of pre-configured instances that can be used to simulate Ethereum server environments, being: - **Local Execution Nodes:** [`anvil`](#anvil-execution-node) -- **ERC-4337 Bundler Nodes:** [`alto`](#alto-bundler-node), [`rundler`](#rundler-bundler-node) +- **ERC-4337 Bundler Nodes:** [`alto`](#alto-bundler-node) You can also create your own custom instances by using the [`Instance.define` function](#instancedefine). @@ -49,7 +49,6 @@ You can also create your own custom instances by using the [`Instance.define` fu - [Getting Started](#getting-started) - [Anvil (Execution Node)](#anvil-execution-node) - [Alto (ERC-4337 Bundler Node)](#alto-bundler-node) - - [Rundler (ERC-4337 Bundler Node)](#rundler-bundler-node) - [Reference](#reference) - [`Server.create`](#servercreate) - [`Instance.define`](#instancedefine) @@ -141,46 +140,6 @@ await bundlerServer.start() See [`AltoParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/alto.ts#L7). -### Rundler (Bundler Node) - -#### Requirements - -- [Rundler](https://github.com/alchemyplatform/rundler) binary installed - - [Download](https://github.com/alchemyplatform/rundler/releases) - -#### Usage - -```ts -import { Instance, Server } from 'prool' - -const executionServer = Server.create({ - instance: Instance.anvil(), - port: 8545 -}) -await executionServer.start() -// Instances accessible at: -// "http://localhost:8545/1" -// "http://localhost:8545/2" -// "http://localhost:8545/3" -// "http://localhost:8545/n" - -const bundlerServer = Server.create({ - instance: (key) => Instance.rundler({ - nodeHttp: `http://localhost:8545/${key}`, - }) -}) -await bundlerServer.start() -// Instances accessible at: -// "http://localhost:3000/1" (→ http://localhost:8545/1) -// "http://localhost:3000/2" (→ http://localhost:8545/2) -// "http://localhost:3000/3" (→ http://localhost:8545/3) -// "http://localhost:3000/n" (→ http://localhost:8545/n) -``` - -#### Parameters - -See [RundlerParameters](). - ## Reference ### `Server.create` diff --git a/src/Instance.ts b/src/Instance.ts index ef8cd41..1e84874 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -2,7 +2,6 @@ import { EventEmitter } from 'eventemitter3' export { alto } from './instances/alto.js' export { anvil } from './instances/anvil.js' -export { rundler } from './instances/rundler.js' type EventTypes = { exit: [code: number | null, signal: NodeJS.Signals | null] diff --git a/src/Pool.test.ts b/src/Pool.test.ts index 11e2f0b..62866df 100644 --- a/src/Pool.test.ts +++ b/src/Pool.test.ts @@ -2,7 +2,7 @@ import getPort from 'get-port' import { Instance, Pool, Server } from 'prool' import { afterEach, beforeAll, describe, expect, test } from 'vitest' -import { altoOptions, rundlerOptions } from '../test/utils.js' +import { altoOptions } from '../test/utils.js' let pool: ReturnType const port = await getPort() @@ -30,9 +30,6 @@ describe.each([ { instance: Instance.alto(altoOptions({ port, pool: true })), }, - { - instance: Instance.rundler(rundlerOptions({ port, pool: true })), - }, ])('instance: $instance.name', ({ instance }) => { test('default', async () => { pool = Pool.define({ diff --git a/src/Server.test.ts b/src/Server.test.ts index b36de57..4dffca1 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -2,7 +2,7 @@ import getPort from 'get-port' import { Instance, Server } from 'prool' import { beforeAll, describe, expect, test } from 'vitest' import { type MessageEvent, WebSocket } from 'ws' -import { altoOptions, rundlerOptions } from '../test/utils.js' +import { altoOptions } from '../test/utils.js' const port = await getPort() @@ -21,9 +21,6 @@ describe.each([ { instance: Instance.alto(altoOptions({ port, pool: true })), }, - { - instance: Instance.rundler(rundlerOptions({ port, pool: true })), - }, ])('instance: $instance.name', ({ instance }) => { test('default', async () => { const server = Server.create({ @@ -401,41 +398,6 @@ describe("instance: 'alto'", () => { }) }) -describe("instance: 'rundler'", () => { - test('request: /{id}', async () => { - const server = Server.create({ - instance: Instance.rundler(rundlerOptions({ port, pool: true })), - }) - - const stop = await server.start() - const { port: port_2 } = server.address()! - const response = await fetch(`http://localhost:${port_2}/1`, { - body: JSON.stringify({ - method: 'eth_supportedEntryPoints', - params: [], - id: 0, - jsonrpc: '2.0', - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }) - expect(response.status).toBe(200) - expect(await response.json()).toMatchInlineSnapshot(` - { - "id": 0, - "jsonrpc": "2.0", - "result": [ - "0x0000000071727De22E5E9d8BAf0edAc6f37da032", - ], - } - `) - - await stop() - }) -}) - test('404', async () => { const server = Server.create({ instance: Instance.anvil(), diff --git a/src/instances/rundler.test.ts b/src/instances/rundler.test.ts deleted file mode 100644 index 204bf5b..0000000 --- a/src/instances/rundler.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Instance } from 'prool' -import { afterEach, expect, test } from 'vitest' - -const instances: Instance.Instance[] = [] - -const defineInstance = (parameters: Instance.rundler.Parameters = {}) => { - const instance = Instance.rundler(parameters) - instances.push(instance) - return instance -} - -afterEach(async () => { - for (const instance of instances) await instance.stop() -}) - -test('default', async () => { - const messages: string[] = [] - const stdouts: string[] = [] - - const instance = defineInstance() - - instance.on('message', (m) => messages.push(m)) - instance.on('stdout', (m) => stdouts.push(m)) - - expect(instance.messages.get()).toMatchInlineSnapshot('[]') - - await instance.start() - expect(instance.status).toEqual('started') - - expect(messages.join('')).toBeDefined() - expect(stdouts.join('')).toBeDefined() - expect(instance.messages.get().join('')).toBeDefined() - - await instance.stop() - expect(instance.status).toEqual('stopped') - - expect(messages.join('')).toBeDefined() - expect(stdouts.join('')).toBeDefined() - expect(instance.messages.get()).toMatchInlineSnapshot('[]') -}) - -test('behavior: instance errored (duplicate ports)', async () => { - const instance_1 = defineInstance({ - rpc: { - port: 1337, - }, - }) - const instance_2 = defineInstance({ - rpc: { - port: 1337, - }, - }) - - await instance_1.start() - await expect(() => instance_2.start()).rejects.toThrowError( - 'Failed to start process "rundler"', - ) -}) - -test('behavior: start and stop multiple times', async () => { - const instance = defineInstance() - - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() - await instance.start() - await instance.stop() -}) - -test('behavior: can subscribe to stderr', async () => { - const messages: string[] = [] - - const instance_1 = defineInstance({ - rpc: { - port: 1339, - }, - }) - const instance_2 = defineInstance({ - rpc: { - port: 1339, - }, - }) - - await instance_1.start() - instance_2.on('stderr', (message) => messages.push(message)) - await expect(() => instance_2.start()).rejects.toThrowError( - 'Failed to start process "rundler"', - ) -}) diff --git a/src/instances/rundler.ts b/src/instances/rundler.ts deleted file mode 100644 index 57aa1e5..0000000 --- a/src/instances/rundler.ts +++ /dev/null @@ -1,471 +0,0 @@ -import getPort from 'get-port' - -import * as Instance from '../Instance.js' -import { toArgs } from '../internal/utils.js' -import { execa } from '../processes/execa.js' - -/** - * Defines a Rundler instance. - * - * @example - * ```ts - * const instance = Instance.rundler({ - * nodeHttp: 'http://localhost:8545', - * }); - * - * await instance.start() - * // ... - * await instance.stop() - * ``` - */ -export const rundler = Instance.define((parameters?: rundler.Parameters) => { - const { binary = 'rundler', ...args } = (parameters ?? - {}) as rundler.Parameters - - const host = '127.0.0.1' - const name = 'rundler' - const process = execa({ name }) - - return { - _internal: { - args, - get process() { - return process._internal.process - }, - }, - host, - port: args.rpc?.port ?? 3000, - name, - async start({ port = args.rpc?.port ?? 3000 }, options) { - const args_ = { - ...args, - builder: { - ...args.builder, - privateKey: - args.builder?.privateKey ?? - '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', - }, - entryPointVersion: undefined, - maxVerificationGas: args.maxVerificationGas ?? 10000000, - network: args.network ?? 'dev', - nodeHttp: args.nodeHttp ?? 'http://localhost:8545', - metrics: { - ...args.metrics, - port: await getPort(), - }, - rpc: { - ...args.rpc, - port, - }, - unsafe: args.unsafe ?? true, - userOperationEventBlockDistance: - args.userOperationEventBlockDistance ?? 100, - } satisfies rundler.Parameters - - const entrypointArgs = (() => { - if (args.entryPointVersion === '0.6.0') - return ['--disable_entry_point_v0_7'] - return ['--disable_entry_point_v0_6'] - })() - - return await process.start( - ($) => - $( - binary, - ['node', ...toArgs(args_, { casing: 'snake' }), ...entrypointArgs], - { - env: { - RUST_LOG: 'debug', - }, - }, - ), - { - ...options, - resolver({ process, reject, resolve }) { - process.stdout.on('data', (data) => { - const message = data.toString() - if (message.includes('Started RPC server')) resolve() - }) - process.stderr.on('data', (data) => { - reject(data.toString()) - }) - }, - }, - ) - }, - async stop() { - await process.stop() - }, - } -}) - -export declare namespace rundler { - export type Parameters = { - /** - * The path to the rundler binary - * - * @default rundler - */ - binary?: string | undefined - - /** - * The version of the entrypoint to use - * - * @default 0.6.0 - */ - entryPointVersion?: '0.6.0' | '0.7.0' | undefined - - /** - * Network to look up a hardcoded chain spec. - * @default dev - */ - network?: string | undefined - - /** - * Path to a chain spec TOML file. - */ - chainSpec?: string | undefined - - /** - * EVM Node HTTP URL to use. - * - * @default http://localhost:8545 - */ - nodeHttp?: string | undefined - - /** - * Maximum verification gas. - * @default 5000000 - */ - maxVerificationGas?: number | undefined - - /** - * Maximum bundle gas. - * @default 25000000 - */ - maxBundleGas?: number | undefined - - /** - * Minimum stake value. - * @default 1000000000000000000 - */ - minStakeValue?: number - - /** - * Minimum unstake delay. - * @default 84600 - */ - minUnstakeDelay?: number | undefined - - /** - * Number of blocks to search when calling eth_getUserOperationByHash. - * @default 100 - */ - userOperationEventBlockDistance?: number | undefined - - /** - * Maximum gas for simulating handle operations. - * @default 20000000 - */ - maxSimulateHandleOpsGas?: number | undefined - - /** - * The gas fee to use during verification estimation. - * @default 1000000000000 10K gwei - */ - verificationEstimationGasFee?: number | undefined - - /** - * Bundle transaction priority fee overhead over network value. - * @default 0 - */ - bundlePriorityFeeOverheadPercent?: number | undefined - - /** - * Priority fee mode kind. - * Possible values are base_fee_percent and priority_fee_increase_percent. - * @default priority_fee_increase_percent - */ - priorityFeeModeKind?: - | 'base_fee_percent' - | 'priority_fee_increase_percent' - | undefined - - /** - * Priority fee mode value. - * @default 0 - */ - priorityFeeModeValue?: number | undefined - - /** - * Percentage of the current network fees a user operation must have in order to be accepted into the mempool. - * @default 100 - */ - baseFeeAcceptPercent?: number | undefined - - /** - * AWS region. - * @default us-east-1 - */ - awsRegion?: string | undefined - - /** - * Interval at which the builder polls an RPC node for new blocks and mined transactions. - * @default 100 - */ - ethPollIntervalMillis?: number | undefined - - /** - * Flag for unsafe bundling mode. When set Rundler will skip checking simulation rules (and any debug_traceCall). - * - * @default true - */ - unsafe?: boolean | undefined - - /** - * Path to the mempool configuration file. - * This path can either be a local file path or an S3 url. - */ - mempoolConfigPath?: string | undefined - - metrics?: - | { - /** - * Port to listen on for metrics requests. - * @default 8080 - */ - port?: number | undefined - - /** - * Host to listen on for metrics requests. - * @default 0.0.0.0 - */ - host?: string | undefined - - /** - * Tags for metrics in the format key1=value1,key2=value2,... - */ - tags?: string | undefined - - /** - * Sample interval to use for sampling metrics. - * @default 1000 - */ - sampleIntervalMillis?: number | undefined - } - | undefined - - logging?: - | { - /** - * Log file. If not provided, logs will be written to stdout. - */ - file?: string | undefined - - /** - * If set, logs will be written in JSON format. - */ - json?: boolean | undefined - } - | undefined - - rpc?: - | { - /** - * Port to listen on for JSON-RPC requests. - * @default 3000 - */ - port?: number | undefined - - /** - * Host to listen on for JSON-RPC requests. - * @default 127.0.0.1 - */ - host?: string | undefined - - /** - * Which APIs to expose over the RPC interface. - * @default eth,rundler - */ - api?: string | undefined - - /** - * Timeout for RPC requests. - * @default 20 - */ - timeoutSeconds?: number | undefined - - /** - * Maximum number of concurrent connections. - * @default 100 - */ - maxConnections?: number | undefined - } - | undefined - - pool?: - | { - /** - * Maximum size in bytes for the pool. - * @default 500000000, 0.5 GB - */ - maxSizeInBytes?: number | undefined - - /** - * Maximum number of user operations for an unstaked sender. - * @default 4 - */ - sameSenderMempoolCount?: number | undefined - - /** - * Minimum replacement fee increase percentage. - * @default 10 - */ - minReplacementFeeIncreasePercentage?: number | undefined - - /** - * Path to a blocklist file. - * This path can either be a local file path or an S3 url. - */ - blocklistPath?: string | undefined - - /** - * Path to an allowlist file. - * This path can either be a local file path or an S3 url. - */ - allowlistPath?: string | undefined - - /** - * Size of the chain history. - */ - chainHistorySize?: number | undefined - - /** - * Boolean field that sets whether the pool server starts with paymaster tracking enabled. - * @default true - */ - paymasterTrackingEnabled?: boolean | undefined - - /** - * Length of the paymaster cache. - * @default 10_000 - */ - paymasterCacheLength?: number | undefined - - /** - * Boolean field that sets whether the pool server starts with reputation tracking enabled. - * @default true - */ - reputationTrackingEnabled?: boolean | undefined - - /** - * The minimum number of blocks that a UO must stay in the mempool before it can be requested to be dropped by the user. - * @default 10 - */ - dropMinNumBlocks?: number | undefined - } - | undefined - - builder?: - | { - /** - * Private key to use for signing transactions. - * If used with awsKmsKeyIds, then explicitly pass in `null` here. - * - * @default 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - */ - privateKey?: string | undefined - - /** - * AWS KMS key IDs to use for signing transactions (comma-separated). - * Only required if privateKey is not provided. - */ - awsKmsKeyIds?: string | undefined - - /** - * Redis URI to use for KMS leasing. - * Only required when awsKmsKeyIds are provided. - * - * @default "" - */ - redisUri?: string | undefined - - /** - * Redis lock TTL in milliseconds. - * Only required when awsKmsKeyIds are provided. - * @default 60000 - */ - redisLockTtlMillis?: number | undefined - - /** - * Maximum number of ops to include in one bundle. - * @default 128 - */ - maxBundleSize?: number | undefined - - /** - * If present, the URL of the ETH provider that will be used to send transactions. - * Defaults to the value of nodeHttp. - */ - submitUrl?: string | undefined - - /** - * Choice of what sender type to use for transaction submission. - * @default raw - * options: raw, conditional, flashbots, polygon_bloxroute - */ - sender?: - | 'raw' - | 'conditional' - | 'flashbots' - | 'polygonBloxroute' - | undefined - - /** - * After submitting a bundle transaction, the maximum number of blocks to wait for that transaction to mine before trying to resend with higher gas fees. - * @default 2 - */ - maxBlocksToWaitForMine?: number | undefined - - /** - * Percentage amount to increase gas fees when retrying a transaction after it failed to mine. - * @default 10 - */ - replacementFeePercentIncrease?: number | undefined - - /** - * Maximum number of fee increases to attempt. - * Seven increases of 10% is roughly 2x the initial fees. - * @default 7 - */ - maxFeeIncreases?: number | undefined - - /** - * Additional builders to send bundles to through the Flashbots relay RPC (comma-separated). - * List of builders that the Flashbots RPC supports can be found here. - * @default flashbots - */ - flashbotsRelayBuilders?: string | undefined - - /** - * Authorization key to use with the Flashbots relay. - * See here for more info. - * @default None - */ - flashbotsRelayAuthKey?: string | undefined - - /** - * If using the bloxroute transaction sender on Polygon, this is the auth header to supply with the requests. - * @default None - */ - bloxrouteAuthHeader?: string | undefined - - /** - * If running multiple builder processes, this is the index offset to assign unique indexes to each bundle sender. - * @default 0 - */ - indexOffset?: number | undefined - } - | undefined - } -} diff --git a/test/utils.ts b/test/utils.ts index 2a97496..d347476 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -10,18 +10,3 @@ export const altoOptions = ({ port, pool }: { port: number; pool: boolean }) => utilityPrivateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', }) as const - -export const rundlerOptions = ({ - port, - pool, -}: { - port: number - pool: boolean -}) => - ({ - nodeHttp: `http://localhost:${port}${pool ? `/${poolId}` : ''}`, - builder: { - privateKey: - '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', - }, - }) as const From f226472bf7ff65a6736ffa6686b6016012af53f5 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:02:57 +1100 Subject: [PATCH 06/21] chore: up --- src/instances/alto.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/instances/alto.test.ts b/src/instances/alto.test.ts index 165b44a..a7966ad 100644 --- a/src/instances/alto.test.ts +++ b/src/instances/alto.test.ts @@ -61,7 +61,7 @@ test.skip('behavior: instance errored (duplicate ports)', async () => { await expect(() => instance_2.start()).rejects.toThrowError() }) -test('behavior: start and stop multiple times', async () => { +test.skip('behavior: start and stop multiple times', async () => { const instance = defineInstance() await instance.start() From 6515f07db63a732fffb5c91ef150e69d9aa89172 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:41:47 +1100 Subject: [PATCH 07/21] feat: add tempo --- README.md | 30 +- package.json | 2 +- pnpm-lock.yaml | 683 +++++++++++++++++++++++++++++++++++- src/Instance.ts | 1 + src/Pool.test.ts | 43 ++- src/Server.test.ts | 1 + src/instances/tempo.test.ts | 83 +++++ src/instances/tempo.ts | 158 +++++++++ 8 files changed, 960 insertions(+), 41 deletions(-) create mode 100644 src/instances/tempo.test.ts create mode 100644 src/instances/tempo.ts diff --git a/README.md b/README.md index db6375a..95c7e31 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Prool is a library that provides programmatic HTTP testing instances for Ethereu Prool contains a set of pre-configured instances that can be used to simulate Ethereum server environments, being: -- **Local Execution Nodes:** [`anvil`](#anvil-execution-node) +- **Local Execution Nodes:** [`anvil`](#anvil-execution-node), [`tempo`](#tempo-execution-node) - **ERC-4337 Bundler Nodes:** [`alto`](#alto-bundler-node) You can also create your own custom instances by using the [`Instance.define` function](#instancedefine). @@ -95,9 +95,29 @@ await server.start() // "http://localhost:8545/n" ``` -#### Parameters +### Tempo (Execution Node) -See [`AnvilParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/anvil.ts#L5). +#### Requirements + +- [Tempo](https://docs.tempo.xyz/guide/node/installation) binary installed + - Download: `curl -L https://tempo.xyz/install | bash` + +#### Usage + +```ts +import { Instance, Server } from 'prool' + +const server = Server.create({ + instance: Instance.tempo(), +}) + +await server.start() +// Instances accessible at: +// "http://localhost:8545/1" +// "http://localhost:8545/2" +// "http://localhost:8545/3" +// "http://localhost:8545/n" +``` ### Alto (Bundler Node) @@ -136,10 +156,6 @@ await bundlerServer.start() // "http://localhost:3000/n" (→ http://localhost:8545/n) ``` -#### Parameters - -See [`AltoParameters`](https://github.com/wevm/prool/blob/801ede06ded8b2cb2d59c95294aae795e548897c/src/instances/alto.ts#L7). - ## Reference ### `Server.create` diff --git a/package.json b/package.json index eae6040..5a8a7ed 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "check:types": "tsc", "dev": "zile dev", "postinstall": "pnpm dev", - "test": "vitest" + "test": "vitest --testTimeout=100000" }, "devDependencies": { "@biomejs/biome": "^2.3.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e1d613..7e714a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: tar: specifier: 7.2.0 version: 7.2.0 + testcontainers: + specifier: ^11.9.0 + version: 11.9.0 devDependencies: '@biomejs/biome': specifier: ^2.3.8 @@ -50,13 +53,13 @@ importers: version: 8.18.1 '@vitest/coverage-v8': specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2)) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.15 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2) ws: specifier: ^8.18.3 version: 8.18.3 @@ -90,6 +93,9 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -389,11 +395,20 @@ packages: resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} engines: {node: '>=12.10.0'} + '@grpc/grpc-js@1.14.2': + resolution: {integrity: sha512-QzVUtEFyu05UNx2xr0fCQmStUO17uVQhGNowtxs00IgTZT6/W2PBLfUkj30s0FKJ29VtTa3ArVNIhNP6akQhqA==} + engines: {node: '>=12.10.0'} + '@grpc/proto-loader@0.7.13': resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} engines: {node: '>=6'} hasBin: true + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -885,6 +900,12 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.47': + resolution: {integrity: sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -909,6 +930,15 @@ packages: '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/ssh2-streams@0.1.13': + resolution: {integrity: sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==} + + '@types/ssh2@0.5.52': + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + + '@types/ssh2@1.15.5': + resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -1027,6 +1057,14 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1037,6 +1075,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1044,9 +1085,15 @@ packages: ast-v8-to-istanbul@0.3.8: resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + async-mutex@0.4.1: resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1054,12 +1101,61 @@ packages: avvio@8.3.2: resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.5.2: + resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1067,6 +1163,9 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1074,13 +1173,28 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buildcheck@0.0.7: + resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} + engines: {node: '>=10.0.0'} + bull@4.16.5: resolution: {integrity: sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==} engines: {node: '>=12'} + byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1095,6 +1209,9 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -1124,10 +1241,30 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -1151,6 +1288,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -1167,6 +1313,18 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + docker-compose@1.3.0: + resolution: {integrity: sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==} + engines: {node: '>= 6.0.0'} + + docker-modem@5.0.6: + resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} + engines: {node: '>= 8.0'} + + dockerode@4.0.9: + resolution: {integrity: sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==} + engines: {node: '>= 8.0'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -1224,6 +1382,9 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -1251,6 +1412,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1322,6 +1486,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1450,6 +1617,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -1466,6 +1637,9 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1518,6 +1692,10 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} @@ -1582,6 +1760,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1597,6 +1779,14 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -1612,6 +1802,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpackr-extract@3.0.3: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true @@ -1619,6 +1812,9 @@ packages: msgpackr@1.11.2: resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + nan@2.24.0: + resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1637,6 +1833,10 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1777,6 +1977,9 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} @@ -1788,10 +1991,21 @@ packages: resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} engines: {node: '>=10'} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} + protobufjs@7.3.0: resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} engines: {node: '>=12.0.0'} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -1816,6 +2030,9 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1824,6 +2041,9 @@ packages: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -1866,6 +2086,10 @@ packages: resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} engines: {node: '>=10'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1886,6 +2110,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1924,6 +2151,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1948,6 +2178,9 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -1955,6 +2188,13 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + + ssh2@1.17.0: + resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} + engines: {node: '>=10.16.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1967,6 +2207,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1975,6 +2218,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2006,6 +2252,19 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@7.2.0: resolution: {integrity: sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==} engines: {node: '>=18'} @@ -2017,6 +2276,12 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + testcontainers@11.9.0: + resolution: {integrity: sha512-SQ6OqQUig7HcGVF72i+ZVIMvxPSpEz8cgC/B63ekqMzgf98DnveoBbOmqux/Wa5wQAQCt4mEPNMa/Jz7vMg9fQ==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} @@ -2038,6 +2303,10 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2062,6 +2331,9 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + type-fest@4.39.0: resolution: {integrity: sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==} engines: {node: '>=16'} @@ -2077,6 +2349,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2087,6 +2363,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -2232,6 +2512,11 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2256,6 +2541,10 @@ packages: typescript: optional: true + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod-validation-error@1.5.0: resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} engines: {node: '>=16.0.0'} @@ -2286,6 +2575,8 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@balena/dockerignore@1.0.2': {} + '@bcoe/v8-coverage@1.0.2': {} '@biomejs/biome@2.3.8': @@ -2601,6 +2892,11 @@ snapshots: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 + '@grpc/grpc-js@1.14.2': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + '@grpc/proto-loader@0.7.13': dependencies: lodash.camelcase: 4.3.0 @@ -2608,6 +2904,13 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.5.4 + yargs: 17.7.2 + '@inquirer/external-editor@1.0.3(@types/node@24.10.2)': dependencies: chardet: 2.1.1 @@ -3148,6 +3451,17 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 24.10.2 + '@types/ssh2': 1.15.5 + + '@types/dockerode@3.3.47': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 24.10.2 + '@types/ssh2': 1.15.5 + '@types/estree@1.0.5': {} '@types/estree@1.0.8': {} @@ -3170,11 +3484,24 @@ snapshots: '@types/shimmer@1.2.0': {} + '@types/ssh2-streams@0.1.13': + dependencies: + '@types/node': 24.10.2 + + '@types/ssh2@0.5.52': + dependencies: + '@types/node': 24.10.2 + '@types/ssh2-streams': 0.1.13 + + '@types/ssh2@1.15.5': + dependencies: + '@types/node': 18.19.34 + '@types/ws@8.18.1': dependencies: '@types/node': 24.10.2 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -3187,7 +3514,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -3200,13 +3527,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2))': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.7(@types/node@24.10.2) + vite: 7.2.7(@types/node@24.10.2)(yaml@2.8.2) '@vitest/pretty-format@4.0.15': dependencies: @@ -3286,6 +3613,29 @@ snapshots: ansi-styles@6.2.1: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.3.16 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -3294,6 +3644,10 @@ snapshots: array-union@2.1.0: {} + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + assertion-error@2.0.1: {} ast-v8-to-istanbul@0.3.8: @@ -3302,10 +3656,14 @@ snapshots: estree-walker: 3.0.3 js-tokens: 9.0.1 + async-lock@1.4.1: {} + async-mutex@0.4.1: dependencies: tslib: 2.6.3 + async@3.2.6: {} + atomic-sleep@1.0.0: {} avvio@8.3.2: @@ -3313,16 +3671,65 @@ snapshots: '@fastify/error': 3.4.1 fastq: 1.17.1 + b4a@1.7.3: {} + balanced-match@1.0.2: {} + bare-events@2.8.2: {} + + bare-fs@4.5.2: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.7.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-os@3.6.2: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.2 + optional: true + + bare-stream@2.7.0(bare-events@2.8.2): + dependencies: + streamx: 2.23.0 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 + optional: true + base64-js@1.5.1: {} + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 bintrees@1.0.2: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3331,11 +3738,21 @@ snapshots: dependencies: fill-range: 7.1.1 + buffer-crc32@1.0.0: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buildcheck@0.0.7: + optional: true + bull@4.16.5: dependencies: cron-parser: 4.9.0 @@ -3348,6 +3765,8 @@ snapshots: transitivePeerDependencies: - supports-color + byline@5.0.0: {} + cac@6.7.14: {} chai@6.2.1: {} @@ -3356,6 +3775,8 @@ snapshots: chardet@2.1.1: {} + chownr@1.1.4: {} + chownr@3.0.0: {} ci-info@3.9.0: {} @@ -3378,8 +3799,31 @@ snapshots: colorette@2.0.20: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + cookie@0.6.0: {} + core-util-is@1.0.3: {} + + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.7 + nan: 2.24.0 + optional: true + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + cron-parser@4.9.0: dependencies: luxon: 3.6.1 @@ -3398,6 +3842,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.3: + dependencies: + ms: 2.1.3 + denque@2.1.0: {} detect-indent@6.1.0: {} @@ -3409,6 +3857,31 @@ snapshots: dependencies: path-type: 4.0.0 + docker-compose@1.3.0: + dependencies: + yaml: 2.8.2 + + docker-modem@5.0.6: + dependencies: + debug: 4.4.3 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.17.0 + transitivePeerDependencies: + - supports-color + + dockerode@4.0.9: + dependencies: + '@balena/dockerignore': 1.0.2 + '@grpc/grpc-js': 1.14.2 + '@grpc/proto-loader': 0.7.13 + docker-modem: 5.0.6 + protobufjs: 7.5.4 + tar-fs: 2.1.4 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color + dotenv@16.4.5: {} dotenv@8.6.0: {} @@ -3480,6 +3953,12 @@ snapshots: eventemitter3@5.0.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} execa@9.1.0: @@ -3509,6 +3988,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3594,6 +4075,8 @@ snapshots: forwarded@0.2.0: {} + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3725,6 +4208,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-stream@2.0.1: {} + is-stream@4.0.1: {} is-subdir@1.2.0: @@ -3735,6 +4220,8 @@ snapshots: is-windows@1.0.2: {} + isarray@1.0.0: {} + isexe@2.0.0: {} isows@1.0.6(ws@8.18.1): @@ -3791,6 +4278,10 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + lie@3.1.1: dependencies: immediate: 3.0.6 @@ -3853,6 +4344,10 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -3866,6 +4361,10 @@ snapshots: minipass: 7.1.1 rimraf: 5.0.7 + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} module-details-from-path@1.0.3: {} @@ -3874,6 +4373,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + msgpackr-extract@3.0.3: dependencies: node-gyp-build-optional-packages: 5.2.2 @@ -3890,6 +4391,9 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 + nan@2.24.0: + optional: true + nanoid@3.3.11: {} node-fetch@2.7.0: @@ -3901,6 +4405,8 @@ snapshots: detect-libc: 2.0.3 optional: true + normalize-path@3.0.0: {} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -4059,6 +4565,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} + process-warning@3.0.0: {} process@0.11.10: {} @@ -4067,6 +4575,16 @@ snapshots: dependencies: tdigest: 0.1.2 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + properties-reader@2.3.0: + dependencies: + mkdirp: 1.0.4 + protobufjs@7.3.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -4082,6 +4600,21 @@ snapshots: '@types/node': 24.10.2 long: 5.2.3 + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 24.10.2 + long: 5.2.3 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -4107,6 +4640,16 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -4121,6 +4664,10 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + real-require@0.2.0: {} redis-errors@1.2.0: {} @@ -4155,6 +4702,8 @@ snapshots: ret@0.4.3: {} + retry@0.12.0: {} + reusify@1.0.4: {} rfdc@1.3.1: {} @@ -4195,6 +4744,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex2@3.1.0: @@ -4221,6 +4772,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} sisteransi@1.0.5: {} @@ -4242,10 +4795,25 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + split-ca@1.0.1: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} + ssh-remote-port-forward@1.0.4: + dependencies: + '@types/ssh2': 0.5.52 + ssh2: 1.17.0 + + ssh2@1.17.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.24.0 + stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -4254,6 +4822,15 @@ snapshots: stream-shift@1.0.3: {} + streamx@2.23.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4266,6 +4843,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -4290,6 +4871,42 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tar-fs@2.1.4: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-fs@3.1.1: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.5.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + tar@7.2.0: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -4305,6 +4922,35 @@ snapshots: term-size@2.2.1: {} + testcontainers@11.9.0: + dependencies: + '@balena/dockerignore': 1.0.2 + '@types/dockerode': 3.3.47 + archiver: 7.0.1 + async-lock: 1.4.1 + byline: 5.0.0 + debug: 4.4.3 + docker-compose: 1.3.0 + dockerode: 4.0.9 + get-port: 7.1.0 + proper-lockfile: 4.1.2 + properties-reader: 2.3.0 + ssh-remote-port-forward: 1.0.4 + tar-fs: 3.1.1 + tmp: 0.2.5 + undici: 7.16.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + text-decoder@1.2.3: + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -4324,6 +4970,8 @@ snapshots: tinyrainbow@3.0.3: {} + tmp@0.2.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4338,6 +4986,8 @@ snapshots: tslib@2.6.3: {} + tweetnacl@0.14.5: {} + type-fest@4.39.0: {} typescript@5.9.3: {} @@ -4346,6 +4996,8 @@ snapshots: undici-types@7.16.0: {} + undici@7.16.0: {} + universalify@0.1.2: {} uri-js@4.4.1: @@ -4354,6 +5006,8 @@ snapshots: util-deprecate@1.0.2: {} + uuid@10.0.0: {} + uuid@8.3.2: {} viem@2.24.3(typescript@5.9.3)(zod@3.23.8): @@ -4373,7 +5027,7 @@ snapshots: - utf-8-validate - zod - vite@7.2.7(@types/node@24.10.2): + vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -4384,11 +5038,12 @@ snapshots: optionalDependencies: '@types/node': 24.10.2 fsevents: 2.3.3 + yaml: 2.8.2 - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)) + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -4405,7 +5060,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.7(@types/node@24.10.2) + vite: 7.2.7(@types/node@24.10.2)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -4461,6 +5116,8 @@ snapshots: yallist@5.0.0: {} + yaml@2.8.2: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -4483,6 +5140,12 @@ snapshots: optionalDependencies: typescript: 5.9.3 + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 + zod-validation-error@1.5.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/src/Instance.ts b/src/Instance.ts index 1e84874..e473e57 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -2,6 +2,7 @@ import { EventEmitter } from 'eventemitter3' export { alto } from './instances/alto.js' export { anvil } from './instances/anvil.js' +export { tempo } from './instances/tempo.js' type EventTypes = { exit: [code: number | null, signal: NodeJS.Signals | null] diff --git a/src/Pool.test.ts b/src/Pool.test.ts index 62866df..e8c74f8 100644 --- a/src/Pool.test.ts +++ b/src/Pool.test.ts @@ -27,6 +27,7 @@ afterEach(async () => { describe.each([ { instance: Instance.anvil({ port: await getPort() }) }, + { instance: Instance.tempo({ port: await getPort() }) }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, @@ -113,29 +114,25 @@ describe.each([ expect(pool.size).toEqual(0) }) - test( - 'restart', - { timeout: 10_000 }, - async () => { - pool = Pool.define({ - instance, - }) - - const instance_1 = await pool.start(1) - const instance_2 = await pool.start(2) - const instance_3 = await pool.start(3) - - expect(instance_1.status).toBe('started') - expect(instance_2.status).toBe('started') - expect(instance_3.status).toBe('started') - expect(pool.size).toEqual(3) - - const promise_1 = pool.restart(1) - expect(instance_1.status).toBe('restarting') - await promise_1 - expect(instance_1.status).toBe('started') - }, - ) + test('restart', { timeout: 10_000 }, async () => { + pool = Pool.define({ + instance, + }) + + const instance_1 = await pool.start(1) + const instance_2 = await pool.start(2) + const instance_3 = await pool.start(3) + + expect(instance_1.status).toBe('started') + expect(instance_2.status).toBe('started') + expect(instance_3.status).toBe('started') + expect(pool.size).toEqual(3) + + const promise_1 = pool.restart(1) + expect(instance_1.status).toBe('restarting') + await promise_1 + expect(instance_1.status).toBe('started') + }) test('start > stop > start', async () => { pool = Pool.define({ diff --git a/src/Server.test.ts b/src/Server.test.ts index 4dffca1..995f959 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -18,6 +18,7 @@ beforeAll(async () => { describe.each([ { instance: Instance.anvil() }, + { instance: Instance.tempo() }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, diff --git a/src/instances/tempo.test.ts b/src/instances/tempo.test.ts new file mode 100644 index 0000000..7b3dfac --- /dev/null +++ b/src/instances/tempo.test.ts @@ -0,0 +1,83 @@ +import { setTimeout } from 'node:timers/promises' +import { afterEach, expect, test } from 'vitest' +import type { Instance } from '../Instance.js' +import { type TempoParameters, tempo } from './tempo.js' + +const instances: Instance[] = [] + +const defineInstance = (parameters: TempoParameters = {}) => { + const instance = tempo(parameters) + instances.push(instance) + return instance +} + +afterEach(async () => { + for (const instance of instances) await instance.stop().catch(() => {}) +}) + +test('default', async () => { + const messages: string[] = [] + const stdouts: string[] = [] + + const instance = defineInstance() + + instance.on('message', (m) => messages.push(m)) + instance.on('stdout', (m) => stdouts.push(m)) + + expect(instance.messages.get()).toMatchInlineSnapshot('[]') + + await instance.start() + expect(instance.status).toEqual('started') + + expect(messages.join('')).toBeDefined() + expect(stdouts.join('')).toBeDefined() + expect(instance.messages.get().join('')).toBeDefined() + + await instance.stop() + expect(instance.status).toEqual('stopped') + + expect(messages.join('')).toBeDefined() + expect(stdouts.join('')).toBeDefined() + expect(instance.messages.get()).toMatchInlineSnapshot('[]') +}) + +test('behavior: instance errored (duplicate ports)', async () => { + const instance_1 = defineInstance({ port: 8545 }) + const instance_2 = defineInstance({ port: 8545 }) + + await instance_1.start() + await expect(() => instance_2.start()).rejects.toThrowError('Failed to start') +}) + +test('behavior: start and stop multiple times', async () => { + const instance = defineInstance() + + await instance.start() + await instance.stop() + await instance.start() + await instance.stop() + await instance.start() + await instance.stop() + await instance.start() + await instance.stop() +}) + +test('behavior: can subscribe to stdout', async () => { + const messages: string[] = [] + const instance = defineInstance() + instance.on('stdout', (message) => messages.push(message)) + + await instance.start() + expect(messages.length).toBeGreaterThanOrEqual(1) +}) + +test('behavior: can subscribe to stderr', async () => { + const messages: string[] = [] + + const instance_1 = defineInstance({ port: 8545 }) + const instance_2 = defineInstance({ port: 8545 }) + + await instance_1.start() + instance_2.on('stderr', (message) => messages.push(message)) + await expect(instance_2.start()).rejects.toThrow('Failed to start') +}) diff --git a/src/instances/tempo.ts b/src/instances/tempo.ts new file mode 100644 index 0000000..1f3ed3d --- /dev/null +++ b/src/instances/tempo.ts @@ -0,0 +1,158 @@ +import * as os from 'node:os' +import * as path from 'node:path' +import * as Instance from '../Instance.js' +import { execa } from '../processes/execa.js' + +export type TempoParameters = { + /** + * Path or alias to the Tempo binary. + */ + binary?: string | undefined + /** + * Interval between blocks. + */ + blockTime?: string | undefined + /** + * Faucet options. + */ + faucet?: + | { + /** + * Target token addresses for the faucet to be funding with + */ + addresses?: string[] | undefined + /** + * Amount for each faucet funding transaction + */ + amount?: bigint | undefined + /** + * Faucet funding mnemonic + */ + privateKey?: string | undefined + } + | undefined + /** + * Rust log level configuration (sets RUST_LOG environment variable). + * Can be a log level or a custom filter string. + */ + log?: + | 'trace' + | 'debug' + | 'info' + | 'warn' + | 'error' + | (string & {}) + | boolean + | undefined + /** + * Host the server will listen on. + */ + host?: string | undefined + /** + * Port the server will listen on. + */ + port?: number | undefined +} + +/** + * Defines a Tempo instance. + * + * @example + * ```ts + * const instance = tempo({ port: 8545 }) + * await instance.start() + * // ... + * await instance.stop() + * ``` + */ +export const tempo = Instance.define((parameters?: TempoParameters) => { + const { binary = 'tempo', log: log_, ...args } = parameters || {} + + const log = (() => { + try { + return JSON.parse(log_ as string) + } catch { + return log_ + } + })() + + const name = 'tempo' + const process = execa({ name }) + + return { + _internal: { + args, + get process() { + return process._internal.process + }, + }, + host: args.host ?? 'localhost', + name, + port: args.port ?? 8545, + async start({ port = args.port }, options) { + const rustLog = log && typeof log !== 'boolean' ? log : '' + const dataDir = path.join(os.tmpdir(), '.prool', `tempo.${port}`) + + return await process.start( + ($) => + $({ + env: { + RUST_LOG: rustLog, + }, + })`${[ + binary, + 'node', + `--authrpc.port=${port! + 30}`, + `--datadir=${dataDir}`, + '--dev', + `--dev.block-time=${parameters?.blockTime ?? '50ms'}`, + '--engine.disable-precompile-cache', + '--engine.legacy-state-root', + '--faucet.address', + ...(parameters?.faucet?.addresses ?? [ + '0x20c0000000000000000000000000000000000000', + '0x20c0000000000000000000000000000000000001', + '0x20c0000000000000000000000000000000000002', + '0x20c0000000000000000000000000000000000003', + ]), + `--faucet.amount=${parameters?.faucet?.amount ?? '1000000000000'}`, + '--faucet.enabled', + `--faucet.private-key=${parameters?.faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`, + '--http', + '--http.addr=0.0.0.0', + '--http.api=all', + '--http.corsdomain=*', + `--http.port=${port!}`, + `--port=${port! + 10}`, + '--txpool.basefee-max-count=10000000000000', + '--txpool.basefee-max-size=10000', + '--txpool.max-account-slots=500000', + '--txpool.pending-max-count=10000000000000', + '--txpool.pending-max-size=10000', + '--txpool.queued-max-count=10000000000000', + '--txpool.queued-max-size=10000', + `--ws.port=${port! + 20}`, + ]}`, + { + ...options, + // Resolve when the process is listening via "RPC HTTP server started" message. + resolver({ process, reject, resolve }) { + process.stdout.on('data', (data) => { + const message = data.toString() + if (log) console.log(message) + if (message.includes('RPC HTTP server started')) resolve() + if (message.includes('shutting down')) reject('shutting down') + }) + process.stderr.on('data', (data) => { + const message = data.toString() + if (log) console.error(message) + }) + }, + }, + ) + }, + async stop() { + await process.stop() + }, + } +}) From d570cd76b3b96268d6a5779df5113b8b0a66dc4a Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:44:00 +1100 Subject: [PATCH 08/21] ci: up --- .github/workflows/verify.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 099cf94..8723a1c 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -34,6 +34,9 @@ jobs: - name: Set up Foundry uses: foundry-rs/foundry-toolchain@v1 + - name: Set up Tempo + run: curl -L https://tempo.xyz/install | bash + - name: Set up Docker uses: docker/setup-docker-action@v4 From 2d5583f7576eb54ae13c3978d5f02d6bd603e6de Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:44:55 +1100 Subject: [PATCH 09/21] chore: u --- pnpm-lock.yaml | 683 +------------------------------------------------ 1 file changed, 10 insertions(+), 673 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e714a2..1e1d613 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,9 +26,6 @@ importers: tar: specifier: 7.2.0 version: 7.2.0 - testcontainers: - specifier: ^11.9.0 - version: 11.9.0 devDependencies: '@biomejs/biome': specifier: ^2.3.8 @@ -53,13 +50,13 @@ importers: version: 8.18.1 '@vitest/coverage-v8': specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.15 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2) + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) ws: specifier: ^8.18.3 version: 8.18.3 @@ -93,9 +90,6 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@balena/dockerignore@1.0.2': - resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -395,20 +389,11 @@ packages: resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} engines: {node: '>=12.10.0'} - '@grpc/grpc-js@1.14.2': - resolution: {integrity: sha512-QzVUtEFyu05UNx2xr0fCQmStUO17uVQhGNowtxs00IgTZT6/W2PBLfUkj30s0FKJ29VtTa3ArVNIhNP6akQhqA==} - engines: {node: '>=12.10.0'} - '@grpc/proto-loader@0.7.13': resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} engines: {node: '>=6'} hasBin: true - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} - engines: {node: '>=6'} - hasBin: true - '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -900,12 +885,6 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/docker-modem@3.0.6': - resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} - - '@types/dockerode@3.3.47': - resolution: {integrity: sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==} - '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -930,15 +909,6 @@ packages: '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} - '@types/ssh2-streams@0.1.13': - resolution: {integrity: sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==} - - '@types/ssh2@0.5.52': - resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} - - '@types/ssh2@1.15.5': - resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -1057,14 +1027,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} - - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1075,9 +1037,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1085,15 +1044,9 @@ packages: ast-v8-to-istanbul@0.3.8: resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} - async-lock@1.4.1: - resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} - async-mutex@0.4.1: resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1101,61 +1054,12 @@ packages: avvio@8.3.2: resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - - bare-fs@4.5.2: - resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1163,9 +1067,6 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1173,28 +1074,13 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - buildcheck@0.0.7: - resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} - engines: {node: '>=10.0.0'} - bull@4.16.5: resolution: {integrity: sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==} engines: {node: '>=12'} - byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1209,9 +1095,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -1241,30 +1124,10 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cpu-features@0.0.10: - resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} - engines: {node: '>=10.0.0'} - - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} - cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -1288,15 +1151,6 @@ packages: supports-color: optional: true - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -1313,18 +1167,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - docker-compose@1.3.0: - resolution: {integrity: sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==} - engines: {node: '>= 6.0.0'} - - docker-modem@5.0.6: - resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} - engines: {node: '>= 8.0'} - - dockerode@4.0.9: - resolution: {integrity: sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==} - engines: {node: '>= 8.0'} - dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -1382,9 +1224,6 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -1412,9 +1251,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1486,9 +1322,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1617,10 +1450,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -1637,9 +1466,6 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1692,10 +1518,6 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} @@ -1760,10 +1582,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1779,14 +1597,6 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -1802,9 +1612,6 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true @@ -1812,9 +1619,6 @@ packages: msgpackr@1.11.2: resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} - nan@2.24.0: - resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1833,10 +1637,6 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1977,9 +1777,6 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} @@ -1991,21 +1788,10 @@ packages: resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} engines: {node: '>=10'} - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - - properties-reader@2.3.0: - resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} - engines: {node: '>=14'} - protobufjs@7.3.0: resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} engines: {node: '>=12.0.0'} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -2030,9 +1816,6 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2041,9 +1824,6 @@ packages: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -2086,10 +1866,6 @@ packages: resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} engines: {node: '>=10'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2110,9 +1886,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -2151,9 +1924,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2178,9 +1948,6 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - split-ca@1.0.1: - resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -2188,13 +1955,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - ssh-remote-port-forward@1.0.4: - resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} - - ssh2@1.17.0: - resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} - engines: {node: '>=10.16.0'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2207,9 +1967,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2218,9 +1975,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2252,19 +2006,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.2.0: resolution: {integrity: sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==} engines: {node: '>=18'} @@ -2276,12 +2017,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - testcontainers@11.9.0: - resolution: {integrity: sha512-SQ6OqQUig7HcGVF72i+ZVIMvxPSpEz8cgC/B63ekqMzgf98DnveoBbOmqux/Wa5wQAQCt4mEPNMa/Jz7vMg9fQ==} - - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} @@ -2303,10 +2038,6 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2331,9 +2062,6 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-fest@4.39.0: resolution: {integrity: sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==} engines: {node: '>=16'} @@ -2349,10 +2077,6 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@7.16.0: - resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} - engines: {node: '>=20.18.1'} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2363,10 +2087,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -2512,11 +2232,6 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2541,10 +2256,6 @@ packages: typescript: optional: true - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} - zod-validation-error@1.5.0: resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} engines: {node: '>=16.0.0'} @@ -2575,8 +2286,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@balena/dockerignore@1.0.2': {} - '@bcoe/v8-coverage@1.0.2': {} '@biomejs/biome@2.3.8': @@ -2892,11 +2601,6 @@ snapshots: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 - '@grpc/grpc-js@1.14.2': - dependencies: - '@grpc/proto-loader': 0.8.0 - '@js-sdsl/ordered-map': 4.4.2 - '@grpc/proto-loader@0.7.13': dependencies: lodash.camelcase: 4.3.0 @@ -2904,13 +2608,6 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 - '@grpc/proto-loader@0.8.0': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.5.4 - yargs: 17.7.2 - '@inquirer/external-editor@1.0.3(@types/node@24.10.2)': dependencies: chardet: 2.1.1 @@ -3451,17 +3148,6 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/docker-modem@3.0.6': - dependencies: - '@types/node': 24.10.2 - '@types/ssh2': 1.15.5 - - '@types/dockerode@3.3.47': - dependencies: - '@types/docker-modem': 3.0.6 - '@types/node': 24.10.2 - '@types/ssh2': 1.15.5 - '@types/estree@1.0.5': {} '@types/estree@1.0.8': {} @@ -3484,24 +3170,11 @@ snapshots: '@types/shimmer@1.2.0': {} - '@types/ssh2-streams@0.1.13': - dependencies: - '@types/node': 24.10.2 - - '@types/ssh2@0.5.52': - dependencies: - '@types/node': 24.10.2 - '@types/ssh2-streams': 0.1.13 - - '@types/ssh2@1.15.5': - dependencies: - '@types/node': 18.19.34 - '@types/ws@8.18.1': dependencies: '@types/node': 24.10.2 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -3514,7 +3187,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2) + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) transitivePeerDependencies: - supports-color @@ -3527,13 +3200,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2))': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.7(@types/node@24.10.2)(yaml@2.8.2) + vite: 7.2.7(@types/node@24.10.2) '@vitest/pretty-format@4.0.15': dependencies: @@ -3613,29 +3286,6 @@ snapshots: ansi-styles@6.2.1: {} - archiver-utils@5.0.2: - dependencies: - glob: 10.3.16 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.17.21 - normalize-path: 3.0.0 - readable-stream: 4.5.2 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.6 - buffer-crc32: 1.0.0 - readable-stream: 4.5.2 - readdir-glob: 1.1.3 - tar-stream: 3.1.7 - zip-stream: 6.0.1 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -3644,10 +3294,6 @@ snapshots: array-union@2.1.0: {} - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - assertion-error@2.0.1: {} ast-v8-to-istanbul@0.3.8: @@ -3656,14 +3302,10 @@ snapshots: estree-walker: 3.0.3 js-tokens: 9.0.1 - async-lock@1.4.1: {} - async-mutex@0.4.1: dependencies: tslib: 2.6.3 - async@3.2.6: {} - atomic-sleep@1.0.0: {} avvio@8.3.2: @@ -3671,65 +3313,16 @@ snapshots: '@fastify/error': 3.4.1 fastq: 1.17.1 - b4a@1.7.3: {} - balanced-match@1.0.2: {} - bare-events@2.8.2: {} - - bare-fs@4.5.2: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-os@3.6.2: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.2 - optional: true - - bare-stream@2.7.0(bare-events@2.8.2): - dependencies: - streamx: 2.23.0 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-url@2.3.2: - dependencies: - bare-path: 3.0.0 - optional: true - base64-js@1.5.1: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 bintrees@1.0.2: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3738,21 +3331,11 @@ snapshots: dependencies: fill-range: 7.1.1 - buffer-crc32@1.0.0: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - buildcheck@0.0.7: - optional: true - bull@4.16.5: dependencies: cron-parser: 4.9.0 @@ -3765,8 +3348,6 @@ snapshots: transitivePeerDependencies: - supports-color - byline@5.0.0: {} - cac@6.7.14: {} chai@6.2.1: {} @@ -3775,8 +3356,6 @@ snapshots: chardet@2.1.1: {} - chownr@1.1.4: {} - chownr@3.0.0: {} ci-info@3.9.0: {} @@ -3799,31 +3378,8 @@ snapshots: colorette@2.0.20: {} - compress-commons@6.0.2: - dependencies: - crc-32: 1.2.2 - crc32-stream: 6.0.0 - is-stream: 2.0.1 - normalize-path: 3.0.0 - readable-stream: 4.5.2 - cookie@0.6.0: {} - core-util-is@1.0.3: {} - - cpu-features@0.0.10: - dependencies: - buildcheck: 0.0.7 - nan: 2.24.0 - optional: true - - crc-32@1.2.2: {} - - crc32-stream@6.0.0: - dependencies: - crc-32: 1.2.2 - readable-stream: 4.5.2 - cron-parser@4.9.0: dependencies: luxon: 3.6.1 @@ -3842,10 +3398,6 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.3: - dependencies: - ms: 2.1.3 - denque@2.1.0: {} detect-indent@6.1.0: {} @@ -3857,31 +3409,6 @@ snapshots: dependencies: path-type: 4.0.0 - docker-compose@1.3.0: - dependencies: - yaml: 2.8.2 - - docker-modem@5.0.6: - dependencies: - debug: 4.4.3 - readable-stream: 3.6.2 - split-ca: 1.0.1 - ssh2: 1.17.0 - transitivePeerDependencies: - - supports-color - - dockerode@4.0.9: - dependencies: - '@balena/dockerignore': 1.0.2 - '@grpc/grpc-js': 1.14.2 - '@grpc/proto-loader': 0.7.13 - docker-modem: 5.0.6 - protobufjs: 7.5.4 - tar-fs: 2.1.4 - uuid: 10.0.0 - transitivePeerDependencies: - - supports-color - dotenv@16.4.5: {} dotenv@8.6.0: {} @@ -3953,12 +3480,6 @@ snapshots: eventemitter3@5.0.1: {} - events-universal@1.0.1: - dependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - events@3.3.0: {} execa@9.1.0: @@ -3988,8 +3509,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4075,8 +3594,6 @@ snapshots: forwarded@0.2.0: {} - fs-constants@1.0.0: {} - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -4208,8 +3725,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-stream@2.0.1: {} - is-stream@4.0.1: {} is-subdir@1.2.0: @@ -4220,8 +3735,6 @@ snapshots: is-windows@1.0.2: {} - isarray@1.0.0: {} - isexe@2.0.0: {} isows@1.0.6(ws@8.18.1): @@ -4278,10 +3791,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - lie@3.1.1: dependencies: immediate: 3.0.6 @@ -4344,10 +3853,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -4361,10 +3866,6 @@ snapshots: minipass: 7.1.1 rimraf: 5.0.7 - mkdirp-classic@0.5.3: {} - - mkdirp@1.0.4: {} - mkdirp@3.0.1: {} module-details-from-path@1.0.3: {} @@ -4373,8 +3874,6 @@ snapshots: ms@2.1.2: {} - ms@2.1.3: {} - msgpackr-extract@3.0.3: dependencies: node-gyp-build-optional-packages: 5.2.2 @@ -4391,9 +3890,6 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 - nan@2.24.0: - optional: true - nanoid@3.3.11: {} node-fetch@2.7.0: @@ -4405,8 +3901,6 @@ snapshots: detect-libc: 2.0.3 optional: true - normalize-path@3.0.0: {} - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -4565,8 +4059,6 @@ snapshots: dependencies: parse-ms: 4.0.0 - process-nextick-args@2.0.1: {} - process-warning@3.0.0: {} process@0.11.10: {} @@ -4575,16 +4067,6 @@ snapshots: dependencies: tdigest: 0.1.2 - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - - properties-reader@2.3.0: - dependencies: - mkdirp: 1.0.4 - protobufjs@7.3.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -4600,21 +4082,6 @@ snapshots: '@types/node': 24.10.2 long: 5.2.3 - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.2 - long: 5.2.3 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -4640,16 +4107,6 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -4664,10 +4121,6 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.6 - real-require@0.2.0: {} redis-errors@1.2.0: {} @@ -4702,8 +4155,6 @@ snapshots: ret@0.4.3: {} - retry@0.12.0: {} - reusify@1.0.4: {} rfdc@1.3.1: {} @@ -4744,8 +4195,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-regex2@3.1.0: @@ -4772,8 +4221,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} sisteransi@1.0.5: {} @@ -4795,25 +4242,10 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - split-ca@1.0.1: {} - split2@4.2.0: {} sprintf-js@1.0.3: {} - ssh-remote-port-forward@1.0.4: - dependencies: - '@types/ssh2': 0.5.52 - ssh2: 1.17.0 - - ssh2@1.17.0: - dependencies: - asn1: 0.2.6 - bcrypt-pbkdf: 1.0.2 - optionalDependencies: - cpu-features: 0.0.10 - nan: 2.24.0 - stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -4822,15 +4254,6 @@ snapshots: stream-shift@1.0.3: {} - streamx@2.23.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4843,10 +4266,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -4871,42 +4290,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tar-fs@2.1.4: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - tar-fs@3.1.1: - dependencies: - pump: 3.0.0 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.5.2 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar-stream@3.1.7: - dependencies: - b4a: 1.7.3 - fast-fifo: 1.3.2 - streamx: 2.23.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - tar@7.2.0: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -4922,35 +4305,6 @@ snapshots: term-size@2.2.1: {} - testcontainers@11.9.0: - dependencies: - '@balena/dockerignore': 1.0.2 - '@types/dockerode': 3.3.47 - archiver: 7.0.1 - async-lock: 1.4.1 - byline: 5.0.0 - debug: 4.4.3 - docker-compose: 1.3.0 - dockerode: 4.0.9 - get-port: 7.1.0 - proper-lockfile: 4.1.2 - properties-reader: 2.3.0 - ssh-remote-port-forward: 1.0.4 - tar-fs: 3.1.1 - tmp: 0.2.5 - undici: 7.16.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - - text-decoder@1.2.3: - dependencies: - b4a: 1.7.3 - transitivePeerDependencies: - - react-native-b4a - thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -4970,8 +4324,6 @@ snapshots: tinyrainbow@3.0.3: {} - tmp@0.2.5: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4986,8 +4338,6 @@ snapshots: tslib@2.6.3: {} - tweetnacl@0.14.5: {} - type-fest@4.39.0: {} typescript@5.9.3: {} @@ -4996,8 +4346,6 @@ snapshots: undici-types@7.16.0: {} - undici@7.16.0: {} - universalify@0.1.2: {} uri-js@4.4.1: @@ -5006,8 +4354,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@10.0.0: {} - uuid@8.3.2: {} viem@2.24.3(typescript@5.9.3)(zod@3.23.8): @@ -5027,7 +4373,7 @@ snapshots: - utf-8-validate - zod - vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2): + vite@7.2.7(@types/node@24.10.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -5038,12 +4384,11 @@ snapshots: optionalDependencies: '@types/node': 24.10.2 fsevents: 2.3.3 - yaml: 2.8.2 - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2)) + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -5060,7 +4405,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.7(@types/node@24.10.2)(yaml@2.8.2) + vite: 7.2.7(@types/node@24.10.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -5116,8 +4461,6 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.2: {} - yargs-parser@21.1.1: {} yargs@17.7.2: @@ -5140,12 +4483,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - zip-stream@6.0.1: - dependencies: - archiver-utils: 5.0.2 - compress-commons: 6.0.2 - readable-stream: 4.5.2 - zod-validation-error@1.5.0(zod@3.23.8): dependencies: zod: 3.23.8 From 73a567ead63a0996343048502476986e81525f59 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:48:39 +1100 Subject: [PATCH 10/21] chore: mv --- .github/workflows/verify.yml | 6 ++++-- package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 8723a1c..f4fc1e0 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -35,12 +35,14 @@ jobs: uses: foundry-rs/foundry-toolchain@v1 - name: Set up Tempo - run: curl -L https://tempo.xyz/install | bash + run: | + curl -L https://tempo.xyz/install | bash + echo "$HOME/.tempo/bin" >> $GITHUB_PATH - name: Set up Docker uses: docker/setup-docker-action@v4 - name: Run tests - run: pnpm test + run: pnpm test --bail=1 env: VITE_FORK_URL: ${{ secrets.VITE_FORK_URL }} diff --git a/package.json b/package.json index 5a8a7ed..eae6040 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "check:types": "tsc", "dev": "zile dev", "postinstall": "pnpm dev", - "test": "vitest --testTimeout=100000" + "test": "vitest" }, "devDependencies": { "@biomejs/biome": "^2.3.8", From 107dde0186fce73cc17266a5aaaebada18a83764 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:14:36 +1100 Subject: [PATCH 11/21] chore: up tests --- package.json | 2 +- src/Instance.test.ts | 1 - src/Pool.test.ts | 4 ++-- src/Server.test.ts | 4 ++-- src/instances/tempo.test.ts | 6 ++++-- src/processes/execa.test.ts | 4 +++- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index eae6040..4730e68 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "check:types": "tsc", "dev": "zile dev", "postinstall": "pnpm dev", - "test": "vitest" + "test": "vitest --testTimeout=10000" }, "devDependencies": { "@biomejs/biome": "^2.3.8", diff --git a/src/Instance.test.ts b/src/Instance.test.ts index fe68de5..ccef925 100644 --- a/src/Instance.test.ts +++ b/src/Instance.test.ts @@ -7,7 +7,6 @@ test('default', async () => { return { name: 'foo', host: 'localhost', - port: 3000, async start() { started = true }, diff --git a/src/Pool.test.ts b/src/Pool.test.ts index e8c74f8..fbc89b3 100644 --- a/src/Pool.test.ts +++ b/src/Pool.test.ts @@ -26,8 +26,8 @@ afterEach(async () => { }) describe.each([ - { instance: Instance.anvil({ port: await getPort() }) }, - { instance: Instance.tempo({ port: await getPort() }) }, + { instance: Instance.anvil({ port: port + 1 }) }, + { instance: Instance.tempo({ port: port + 2 }) }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, diff --git a/src/Server.test.ts b/src/Server.test.ts index 995f959..d6c167f 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -17,8 +17,8 @@ beforeAll(async () => { }) describe.each([ - { instance: Instance.anvil() }, - { instance: Instance.tempo() }, + { instance: Instance.anvil({ port: port + 1 }) }, + { instance: Instance.tempo({ port: port + 2 }) }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, diff --git a/src/instances/tempo.test.ts b/src/instances/tempo.test.ts index 7b3dfac..028f312 100644 --- a/src/instances/tempo.test.ts +++ b/src/instances/tempo.test.ts @@ -1,12 +1,14 @@ -import { setTimeout } from 'node:timers/promises' import { afterEach, expect, test } from 'vitest' import type { Instance } from '../Instance.js' import { type TempoParameters, tempo } from './tempo.js' +import getPort from 'get-port' const instances: Instance[] = [] +const port = await getPort() + const defineInstance = (parameters: TempoParameters = {}) => { - const instance = tempo(parameters) + const instance = tempo({ ...parameters, port }) instances.push(instance) return instance } diff --git a/src/processes/execa.test.ts b/src/processes/execa.test.ts index e584732..8aeb9ac 100644 --- a/src/processes/execa.test.ts +++ b/src/processes/execa.test.ts @@ -1,6 +1,7 @@ import { EventEmitter } from 'eventemitter3' import { afterEach, expect, test } from 'vitest' import { execa } from './execa.js' +import getPort from 'get-port' const processes: execa.ReturnType[] = [] function createProcess() { @@ -121,7 +122,8 @@ test('behavior: exit when status is starting', async () => { emitter.on('exit', resolvers.exit.resolve) // Invalid argument - await process.start(($) => $`anvil`, { + const port = await getPort() + await process.start(($) => $`anvil --port ${port}`, { emitter, status: 'starting', resolver({ process, resolve }) { From 90045e8cc88585582bebc16dfd5c6cc4c1dae688 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:17:13 +1100 Subject: [PATCH 12/21] chore: mv --- src/Instance.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Instance.test.ts b/src/Instance.test.ts index ccef925..fe68de5 100644 --- a/src/Instance.test.ts +++ b/src/Instance.test.ts @@ -7,6 +7,7 @@ test('default', async () => { return { name: 'foo', host: 'localhost', + port: 3000, async start() { started = true }, From 3adf8ac1b937c905ddd7db036f33b09a925fdddd Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:20:36 +1100 Subject: [PATCH 13/21] chore: up tests --- .github/workflows/verify.yml | 3 --- src/Server.test.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index f4fc1e0..088ba46 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -39,9 +39,6 @@ jobs: curl -L https://tempo.xyz/install | bash echo "$HOME/.tempo/bin" >> $GITHUB_PATH - - name: Set up Docker - uses: docker/setup-docker-action@v4 - - name: Run tests run: pnpm test --bail=1 env: diff --git a/src/Server.test.ts b/src/Server.test.ts index d6c167f..c337e4e 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -18,7 +18,7 @@ beforeAll(async () => { describe.each([ { instance: Instance.anvil({ port: port + 1 }) }, - { instance: Instance.tempo({ port: port + 2 }) }, + { instance: Instance.tempo({ port: port + 2, log: true }) }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, From b0dfc3812d25fca93b51a3ba3906bc7e5d18ebc1 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:24:03 +1100 Subject: [PATCH 14/21] chore: mv --- package.json | 2 +- src/Server.test.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 4730e68..dbca762 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "check:types": "tsc", "dev": "zile dev", "postinstall": "pnpm dev", - "test": "vitest --testTimeout=10000" + "test": "vitest Server.test --testTimeout=10000" }, "devDependencies": { "@biomejs/biome": "^2.3.8", diff --git a/src/Server.test.ts b/src/Server.test.ts index c337e4e..eb284d5 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -17,11 +17,11 @@ beforeAll(async () => { }) describe.each([ - { instance: Instance.anvil({ port: port + 1 }) }, - { instance: Instance.tempo({ port: port + 2, log: true }) }, - { - instance: Instance.alto(altoOptions({ port, pool: true })), - }, + // { instance: Instance.anvil({ port: port + 1 }) }, + { instance: Instance.tempo({ port: port + 2 }) }, + // { + // instance: Instance.alto(altoOptions({ port, pool: true })), + // }, ])('instance: $instance.name', ({ instance }) => { test('default', async () => { const server = Server.create({ From aaadfcb0db98f58b6927ff32c0527b0195019798 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:25:15 +1100 Subject: [PATCH 15/21] chore: mv --- src/Server.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Server.test.ts b/src/Server.test.ts index eb284d5..d6c167f 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -17,11 +17,11 @@ beforeAll(async () => { }) describe.each([ - // { instance: Instance.anvil({ port: port + 1 }) }, + { instance: Instance.anvil({ port: port + 1 }) }, { instance: Instance.tempo({ port: port + 2 }) }, - // { - // instance: Instance.alto(altoOptions({ port, pool: true })), - // }, + { + instance: Instance.alto(altoOptions({ port, pool: true })), + }, ])('instance: $instance.name', ({ instance }) => { test('default', async () => { const server = Server.create({ From c58865e5d0016dca3c6b01d25a33971a697be562 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:33:31 +1100 Subject: [PATCH 16/21] chore: mv --- package.json | 2 +- src/Pool.test.ts | 4 ++-- src/Server.test.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index dbca762..4730e68 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "check:types": "tsc", "dev": "zile dev", "postinstall": "pnpm dev", - "test": "vitest Server.test --testTimeout=10000" + "test": "vitest --testTimeout=10000" }, "devDependencies": { "@biomejs/biome": "^2.3.8", diff --git a/src/Pool.test.ts b/src/Pool.test.ts index fbc89b3..e8c74f8 100644 --- a/src/Pool.test.ts +++ b/src/Pool.test.ts @@ -26,8 +26,8 @@ afterEach(async () => { }) describe.each([ - { instance: Instance.anvil({ port: port + 1 }) }, - { instance: Instance.tempo({ port: port + 2 }) }, + { instance: Instance.anvil({ port: await getPort() }) }, + { instance: Instance.tempo({ port: await getPort() }) }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, diff --git a/src/Server.test.ts b/src/Server.test.ts index d6c167f..fba35eb 100644 --- a/src/Server.test.ts +++ b/src/Server.test.ts @@ -17,8 +17,8 @@ beforeAll(async () => { }) describe.each([ - { instance: Instance.anvil({ port: port + 1 }) }, - { instance: Instance.tempo({ port: port + 2 }) }, + { instance: Instance.anvil({ port: await getPort() }) }, + { instance: Instance.tempo({ port: await getPort() }) }, { instance: Instance.alto(altoOptions({ port, pool: true })), }, From 6c2b42d6af1b46bdc2507434449ba10ef665b0d3 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:36:02 +1100 Subject: [PATCH 17/21] chore: mv --- src/instances/tempo.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/instances/tempo.test.ts b/src/instances/tempo.test.ts index 028f312..96111b3 100644 --- a/src/instances/tempo.test.ts +++ b/src/instances/tempo.test.ts @@ -44,8 +44,8 @@ test('default', async () => { }) test('behavior: instance errored (duplicate ports)', async () => { - const instance_1 = defineInstance({ port: 8545 }) - const instance_2 = defineInstance({ port: 8545 }) + const instance_1 = defineInstance({ port: 8546 }) + const instance_2 = defineInstance({ port: 8546 }) await instance_1.start() await expect(() => instance_2.start()).rejects.toThrowError('Failed to start') @@ -76,8 +76,8 @@ test('behavior: can subscribe to stdout', async () => { test('behavior: can subscribe to stderr', async () => { const messages: string[] = [] - const instance_1 = defineInstance({ port: 8545 }) - const instance_2 = defineInstance({ port: 8545 }) + const instance_1 = defineInstance({ port: 8546 }) + const instance_2 = defineInstance({ port: 8546 }) await instance_1.start() instance_2.on('stderr', (message) => messages.push(message)) From d642a6f350e9be3bc8c3b45f216ec1a3237d6438 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:48:09 +1100 Subject: [PATCH 18/21] chore: files --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 4730e68..3a8358a 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "version": "0.0.25", "type": "module", "sideEffects": false, + "files": ["src", "dist"], "engines": { "node": ">=22" }, From 8374a9f25e01a47a3f59ce9d9e84cd11cba3d293 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 14:54:13 +1100 Subject: [PATCH 19/21] chore: up --- .github/workflows/verify.yml | 6 +- README.md | 11 +- package.json | 12 +- pnpm-lock.yaml | 683 ++++++++++++++++++++++++++++++++++- src/instances/tempo.test.ts | 11 +- src/instances/tempo.ts | 269 ++++++++------ src/processes/execa.test.ts | 2 +- 7 files changed, 848 insertions(+), 146 deletions(-) diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 088ba46..48733f5 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -34,10 +34,8 @@ jobs: - name: Set up Foundry uses: foundry-rs/foundry-toolchain@v1 - - name: Set up Tempo - run: | - curl -L https://tempo.xyz/install | bash - echo "$HOME/.tempo/bin" >> $GITHUB_PATH + - name: Set up Docker + uses: docker/setup-docker-action@v4 - name: Run tests run: pnpm test --bail=1 diff --git a/README.md b/README.md index 95c7e31..2eda133 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,9 @@ bun i prool #### Requirements -- [Foundry](https://getfoundry.sh/) binary installed - - Download: `curl -L https://foundry.paradigm.xyz | bash` +```bash +curl -L https://foundry.paradigm.xyz | bash # Install Foundry +``` #### Usage @@ -99,8 +100,10 @@ await server.start() #### Requirements -- [Tempo](https://docs.tempo.xyz/guide/node/installation) binary installed - - Download: `curl -L https://tempo.xyz/install | bash` +```bash +curl -L https://get.docker.com/ | bash # Install Docker +npm i testcontainers # Install `testcontainers` +``` #### Usage diff --git a/package.json b/package.json index 3a8358a..d054d93 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@types/node": "^24.10.2", "@types/ws": "^8.18.1", "@vitest/coverage-v8": "^4.0.15", + "testcontainers": "^11.10.0", "typescript": "^5.9.3", "vitest": "^4.0.15", "ws": "^8.18.3", @@ -30,7 +31,10 @@ "version": "0.0.25", "type": "module", "sideEffects": false, - "files": ["src", "dist"], + "files": [ + "src", + "dist" + ], "engines": { "node": ">=22" }, @@ -50,11 +54,15 @@ "tar": "7.2.0" }, "peerDependencies": { - "@pimlico/alto": "*" + "@pimlico/alto": "*", + "testcontainers": ">=11.10.0" }, "peerDependenciesMeta": { "@pimlico/alto": { "optional": true + }, + "testcontainers": { + "optional": true } }, "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e1d613..0373e3b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,13 +50,16 @@ importers: version: 8.18.1 '@vitest/coverage-v8': specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2)) + testcontainers: + specifier: ^11.10.0 + version: 11.10.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.15 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2) ws: specifier: ^8.18.3 version: 8.18.3 @@ -90,6 +93,9 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -389,11 +395,20 @@ packages: resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} engines: {node: '>=12.10.0'} + '@grpc/grpc-js@1.14.2': + resolution: {integrity: sha512-QzVUtEFyu05UNx2xr0fCQmStUO17uVQhGNowtxs00IgTZT6/W2PBLfUkj30s0FKJ29VtTa3ArVNIhNP6akQhqA==} + engines: {node: '>=12.10.0'} + '@grpc/proto-loader@0.7.13': resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} engines: {node: '>=6'} hasBin: true + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -885,6 +900,12 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.47': + resolution: {integrity: sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -909,6 +930,15 @@ packages: '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/ssh2-streams@0.1.13': + resolution: {integrity: sha512-faHyY3brO9oLEA0QlcO8N2wT7R0+1sHWZvQ+y3rMLwdY1ZyS1z0W3t65j9PqT4HmQ6ALzNe7RZlNuCNE0wBSWA==} + + '@types/ssh2@0.5.52': + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + + '@types/ssh2@1.15.5': + resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -1027,6 +1057,14 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1037,6 +1075,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1044,9 +1085,15 @@ packages: ast-v8-to-istanbul@0.3.8: resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + async-mutex@0.4.1: resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1054,12 +1101,61 @@ packages: avvio@8.3.2: resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.5.2: + resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1067,6 +1163,9 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1074,13 +1173,28 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buildcheck@0.0.7: + resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} + engines: {node: '>=10.0.0'} + bull@4.16.5: resolution: {integrity: sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==} engines: {node: '>=12'} + byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1095,6 +1209,9 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -1124,10 +1241,30 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -1151,6 +1288,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -1167,6 +1313,18 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + docker-compose@1.3.0: + resolution: {integrity: sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==} + engines: {node: '>= 6.0.0'} + + docker-modem@5.0.6: + resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} + engines: {node: '>= 8.0'} + + dockerode@4.0.9: + resolution: {integrity: sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==} + engines: {node: '>= 8.0'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -1224,6 +1382,9 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -1251,6 +1412,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1322,6 +1486,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1450,6 +1617,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -1466,6 +1637,9 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1518,6 +1692,10 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} @@ -1582,6 +1760,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1597,6 +1779,14 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -1612,6 +1802,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpackr-extract@3.0.3: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true @@ -1619,6 +1812,9 @@ packages: msgpackr@1.11.2: resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + nan@2.24.0: + resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1637,6 +1833,10 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1777,6 +1977,9 @@ packages: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} @@ -1788,10 +1991,21 @@ packages: resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} engines: {node: '>=10'} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} + protobufjs@7.3.0: resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} engines: {node: '>=12.0.0'} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -1816,6 +2030,9 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1824,6 +2041,9 @@ packages: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -1866,6 +2086,10 @@ packages: resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} engines: {node: '>=10'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1886,6 +2110,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1924,6 +2151,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1948,6 +2178,9 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -1955,6 +2188,13 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + + ssh2@1.17.0: + resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} + engines: {node: '>=10.16.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1967,6 +2207,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1975,6 +2218,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2006,6 +2252,19 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@7.2.0: resolution: {integrity: sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==} engines: {node: '>=18'} @@ -2017,6 +2276,12 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + testcontainers@11.10.0: + resolution: {integrity: sha512-8hwK2EnrOZfrHPpDC7CPe03q7H8Vv8j3aXdcmFFyNV8dzpBzgZYmqyDtduJ8YQ5kbzj+A+jUXMQ6zI8B5U3z+g==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} @@ -2038,6 +2303,10 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2062,6 +2331,9 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + type-fest@4.39.0: resolution: {integrity: sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==} engines: {node: '>=16'} @@ -2077,6 +2349,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2087,6 +2363,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -2232,6 +2512,11 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2256,6 +2541,10 @@ packages: typescript: optional: true + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod-validation-error@1.5.0: resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} engines: {node: '>=16.0.0'} @@ -2286,6 +2575,8 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@balena/dockerignore@1.0.2': {} + '@bcoe/v8-coverage@1.0.2': {} '@biomejs/biome@2.3.8': @@ -2601,6 +2892,11 @@ snapshots: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 + '@grpc/grpc-js@1.14.2': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + '@grpc/proto-loader@0.7.13': dependencies: lodash.camelcase: 4.3.0 @@ -2608,6 +2904,13 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.5.4 + yargs: 17.7.2 + '@inquirer/external-editor@1.0.3(@types/node@24.10.2)': dependencies: chardet: 2.1.1 @@ -3148,6 +3451,17 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 24.10.2 + '@types/ssh2': 1.15.5 + + '@types/dockerode@3.3.47': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 24.10.2 + '@types/ssh2': 1.15.5 + '@types/estree@1.0.5': {} '@types/estree@1.0.8': {} @@ -3170,11 +3484,24 @@ snapshots: '@types/shimmer@1.2.0': {} + '@types/ssh2-streams@0.1.13': + dependencies: + '@types/node': 24.10.2 + + '@types/ssh2@0.5.52': + dependencies: + '@types/node': 24.10.2 + '@types/ssh2-streams': 0.1.13 + + '@types/ssh2@1.15.5': + dependencies: + '@types/node': 18.19.34 + '@types/ws@8.18.1': dependencies: '@types/node': 24.10.2 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -3187,7 +3514,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2) + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -3200,13 +3527,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2))': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.7(@types/node@24.10.2) + vite: 7.2.7(@types/node@24.10.2)(yaml@2.8.2) '@vitest/pretty-format@4.0.15': dependencies: @@ -3286,6 +3613,29 @@ snapshots: ansi-styles@6.2.1: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.3.16 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -3294,6 +3644,10 @@ snapshots: array-union@2.1.0: {} + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + assertion-error@2.0.1: {} ast-v8-to-istanbul@0.3.8: @@ -3302,10 +3656,14 @@ snapshots: estree-walker: 3.0.3 js-tokens: 9.0.1 + async-lock@1.4.1: {} + async-mutex@0.4.1: dependencies: tslib: 2.6.3 + async@3.2.6: {} + atomic-sleep@1.0.0: {} avvio@8.3.2: @@ -3313,16 +3671,65 @@ snapshots: '@fastify/error': 3.4.1 fastq: 1.17.1 + b4a@1.7.3: {} + balanced-match@1.0.2: {} + bare-events@2.8.2: {} + + bare-fs@4.5.2: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.7.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-os@3.6.2: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.2 + optional: true + + bare-stream@2.7.0(bare-events@2.8.2): + dependencies: + streamx: 2.23.0 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 + optional: true + base64-js@1.5.1: {} + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 bintrees@1.0.2: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3331,11 +3738,21 @@ snapshots: dependencies: fill-range: 7.1.1 + buffer-crc32@1.0.0: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buildcheck@0.0.7: + optional: true + bull@4.16.5: dependencies: cron-parser: 4.9.0 @@ -3348,6 +3765,8 @@ snapshots: transitivePeerDependencies: - supports-color + byline@5.0.0: {} + cac@6.7.14: {} chai@6.2.1: {} @@ -3356,6 +3775,8 @@ snapshots: chardet@2.1.1: {} + chownr@1.1.4: {} + chownr@3.0.0: {} ci-info@3.9.0: {} @@ -3378,8 +3799,31 @@ snapshots: colorette@2.0.20: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + cookie@0.6.0: {} + core-util-is@1.0.3: {} + + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.7 + nan: 2.24.0 + optional: true + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + cron-parser@4.9.0: dependencies: luxon: 3.6.1 @@ -3398,6 +3842,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.3: + dependencies: + ms: 2.1.3 + denque@2.1.0: {} detect-indent@6.1.0: {} @@ -3409,6 +3857,31 @@ snapshots: dependencies: path-type: 4.0.0 + docker-compose@1.3.0: + dependencies: + yaml: 2.8.2 + + docker-modem@5.0.6: + dependencies: + debug: 4.4.3 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.17.0 + transitivePeerDependencies: + - supports-color + + dockerode@4.0.9: + dependencies: + '@balena/dockerignore': 1.0.2 + '@grpc/grpc-js': 1.14.2 + '@grpc/proto-loader': 0.7.13 + docker-modem: 5.0.6 + protobufjs: 7.5.4 + tar-fs: 2.1.4 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color + dotenv@16.4.5: {} dotenv@8.6.0: {} @@ -3480,6 +3953,12 @@ snapshots: eventemitter3@5.0.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} execa@9.1.0: @@ -3509,6 +3988,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3594,6 +4075,8 @@ snapshots: forwarded@0.2.0: {} + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3725,6 +4208,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-stream@2.0.1: {} + is-stream@4.0.1: {} is-subdir@1.2.0: @@ -3735,6 +4220,8 @@ snapshots: is-windows@1.0.2: {} + isarray@1.0.0: {} + isexe@2.0.0: {} isows@1.0.6(ws@8.18.1): @@ -3791,6 +4278,10 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + lie@3.1.1: dependencies: immediate: 3.0.6 @@ -3853,6 +4344,10 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -3866,6 +4361,10 @@ snapshots: minipass: 7.1.1 rimraf: 5.0.7 + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} module-details-from-path@1.0.3: {} @@ -3874,6 +4373,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + msgpackr-extract@3.0.3: dependencies: node-gyp-build-optional-packages: 5.2.2 @@ -3890,6 +4391,9 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 + nan@2.24.0: + optional: true + nanoid@3.3.11: {} node-fetch@2.7.0: @@ -3901,6 +4405,8 @@ snapshots: detect-libc: 2.0.3 optional: true + normalize-path@3.0.0: {} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -4059,6 +4565,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} + process-warning@3.0.0: {} process@0.11.10: {} @@ -4067,6 +4575,16 @@ snapshots: dependencies: tdigest: 0.1.2 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + properties-reader@2.3.0: + dependencies: + mkdirp: 1.0.4 + protobufjs@7.3.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -4082,6 +4600,21 @@ snapshots: '@types/node': 24.10.2 long: 5.2.3 + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 24.10.2 + long: 5.2.3 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -4107,6 +4640,16 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -4121,6 +4664,10 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + real-require@0.2.0: {} redis-errors@1.2.0: {} @@ -4155,6 +4702,8 @@ snapshots: ret@0.4.3: {} + retry@0.12.0: {} + reusify@1.0.4: {} rfdc@1.3.1: {} @@ -4195,6 +4744,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex2@3.1.0: @@ -4221,6 +4772,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} sisteransi@1.0.5: {} @@ -4242,10 +4795,25 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + split-ca@1.0.1: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} + ssh-remote-port-forward@1.0.4: + dependencies: + '@types/ssh2': 0.5.52 + ssh2: 1.17.0 + + ssh2@1.17.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.24.0 + stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -4254,6 +4822,15 @@ snapshots: stream-shift@1.0.3: {} + streamx@2.23.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4266,6 +4843,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -4290,6 +4871,42 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tar-fs@2.1.4: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-fs@3.1.1: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.5.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + tar@7.2.0: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -4305,6 +4922,35 @@ snapshots: term-size@2.2.1: {} + testcontainers@11.10.0: + dependencies: + '@balena/dockerignore': 1.0.2 + '@types/dockerode': 3.3.47 + archiver: 7.0.1 + async-lock: 1.4.1 + byline: 5.0.0 + debug: 4.4.3 + docker-compose: 1.3.0 + dockerode: 4.0.9 + get-port: 7.1.0 + proper-lockfile: 4.1.2 + properties-reader: 2.3.0 + ssh-remote-port-forward: 1.0.4 + tar-fs: 3.1.1 + tmp: 0.2.5 + undici: 7.16.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + text-decoder@1.2.3: + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -4324,6 +4970,8 @@ snapshots: tinyrainbow@3.0.3: {} + tmp@0.2.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4338,6 +4986,8 @@ snapshots: tslib@2.6.3: {} + tweetnacl@0.14.5: {} + type-fest@4.39.0: {} typescript@5.9.3: {} @@ -4346,6 +4996,8 @@ snapshots: undici-types@7.16.0: {} + undici@7.16.0: {} + universalify@0.1.2: {} uri-js@4.4.1: @@ -4354,6 +5006,8 @@ snapshots: util-deprecate@1.0.2: {} + uuid@10.0.0: {} + uuid@8.3.2: {} viem@2.24.3(typescript@5.9.3)(zod@3.23.8): @@ -4373,7 +5027,7 @@ snapshots: - utf-8-validate - zod - vite@7.2.7(@types/node@24.10.2): + vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -4384,11 +5038,12 @@ snapshots: optionalDependencies: '@types/node': 24.10.2 fsevents: 2.3.3 + yaml: 2.8.2 - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.2)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)) + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.2)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -4405,7 +5060,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.7(@types/node@24.10.2) + vite: 7.2.7(@types/node@24.10.2)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -4461,6 +5116,8 @@ snapshots: yallist@5.0.0: {} + yaml@2.8.2: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -4483,6 +5140,12 @@ snapshots: optionalDependencies: typescript: 5.9.3 + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 + zod-validation-error@1.5.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/src/instances/tempo.test.ts b/src/instances/tempo.test.ts index 96111b3..fb79b91 100644 --- a/src/instances/tempo.test.ts +++ b/src/instances/tempo.test.ts @@ -1,14 +1,13 @@ -import { afterEach, expect, test } from 'vitest' -import type { Instance } from '../Instance.js' -import { type TempoParameters, tempo } from './tempo.js' import getPort from 'get-port' +import { Instance } from 'prool' +import { afterEach, expect, test } from 'vitest' -const instances: Instance[] = [] +const instances: Instance.Instance[] = [] const port = await getPort() -const defineInstance = (parameters: TempoParameters = {}) => { - const instance = tempo({ ...parameters, port }) +const defineInstance = (parameters: Instance.tempo.Parameters = {}) => { + const instance = Instance.tempo({ port, ...parameters }) instances.push(instance) return instance } diff --git a/src/instances/tempo.ts b/src/instances/tempo.ts index 1f3ed3d..666d331 100644 --- a/src/instances/tempo.ts +++ b/src/instances/tempo.ts @@ -1,58 +1,11 @@ import * as os from 'node:os' import * as path from 'node:path' +import { + GenericContainer, + type StartedTestContainer, + Wait, +} from 'testcontainers' import * as Instance from '../Instance.js' -import { execa } from '../processes/execa.js' - -export type TempoParameters = { - /** - * Path or alias to the Tempo binary. - */ - binary?: string | undefined - /** - * Interval between blocks. - */ - blockTime?: string | undefined - /** - * Faucet options. - */ - faucet?: - | { - /** - * Target token addresses for the faucet to be funding with - */ - addresses?: string[] | undefined - /** - * Amount for each faucet funding transaction - */ - amount?: bigint | undefined - /** - * Faucet funding mnemonic - */ - privateKey?: string | undefined - } - | undefined - /** - * Rust log level configuration (sets RUST_LOG environment variable). - * Can be a log level or a custom filter string. - */ - log?: - | 'trace' - | 'debug' - | 'info' - | 'warn' - | 'error' - | (string & {}) - | boolean - | undefined - /** - * Host the server will listen on. - */ - host?: string | undefined - /** - * Port the server will listen on. - */ - port?: number | undefined -} /** * Defines a Tempo instance. @@ -65,8 +18,13 @@ export type TempoParameters = { * await instance.stop() * ``` */ -export const tempo = Instance.define((parameters?: TempoParameters) => { - const { binary = 'tempo', log: log_, ...args } = parameters || {} +export const tempo = Instance.define((parameters?: tempo.Parameters) => { + const { + containerName = `tempo.${crypto.randomUUID()}`, + image = 'ghcr.io/tempoxyz/tempo:latest', + log: log_, + ...args + } = parameters || {} const log = (() => { try { @@ -75,84 +33,157 @@ export const tempo = Instance.define((parameters?: TempoParameters) => { return log_ } })() + const RUST_LOG = log && typeof log !== 'boolean' ? log : '' const name = 'tempo' - const process = execa({ name }) + let container: StartedTestContainer | undefined return { _internal: { args, - get process() { - return process._internal.process - }, }, host: args.host ?? 'localhost', name, port: args.port ?? 8545, - async start({ port = args.port }, options) { - const rustLog = log && typeof log !== 'boolean' ? log : '' - const dataDir = path.join(os.tmpdir(), '.prool', `tempo.${port}`) + async start({ port = args.port }, { emitter }) { + const promise = Promise.withResolvers() + + const dataDir = path.join(os.tmpdir(), '.prool', containerName) + const c = new GenericContainer(image) + .withPlatform('linux/x86_64') + .withNetworkMode('host') + .withExtraHosts([ + { host: 'host.docker.internal', ipAddress: 'host-gateway' }, + { host: 'localhost', ipAddress: 'host-gateway' }, + ]) + .withName(containerName) + .withEnvironment({ RUST_LOG }) + .withCommand([ + 'node', + `--authrpc.port=${port! + 30}`, + `--datadir=${dataDir}`, + '--dev', + `--dev.block-time=${parameters?.blockTime ?? '50ms'}`, + '--engine.disable-precompile-cache', + '--engine.legacy-state-root', + '--faucet.address', + ...(parameters?.faucet?.addresses ?? [ + '0x20c0000000000000000000000000000000000000', + '0x20c0000000000000000000000000000000000001', + '0x20c0000000000000000000000000000000000002', + '0x20c0000000000000000000000000000000000003', + ]), + `--faucet.amount=${parameters?.faucet?.amount ?? '1000000000000'}`, + '--faucet.enabled', + `--faucet.private-key=${parameters?.faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`, + '--http', + '--http.addr=0.0.0.0', + '--http.api=all', + '--http.corsdomain=*', + `--http.port=${port!}`, + `--port=${port! + 10}`, + '--txpool.basefee-max-count=10000000000000', + '--txpool.basefee-max-size=10000', + '--txpool.max-account-slots=500000', + '--txpool.pending-max-count=10000000000000', + '--txpool.pending-max-size=10000', + '--txpool.queued-max-count=10000000000000', + '--txpool.queued-max-size=10000', + `--ws.port=${port! + 20}`, + ]) + .withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/)) + .withLogConsumer((stream) => { + stream.on('data', (data) => { + const message = data.toString() + emitter.emit('message', message) + emitter.emit('stdout', message) + if (log) console.log(message) + if (message.includes('shutting down')) + promise.reject(new Error(`Failed to start: ${message}`)) + }) + stream.on('error', (error) => { + if (log) console.error(error.message) + emitter.emit('message', error.message) + emitter.emit('stderr', error.message) + promise.reject(new Error(`Failed to start: ${error.message}`)) + }) + }) + .withStartupTimeout(120_000) + + c.start() + .then((c) => { + container = c + promise.resolve() + }) + .catch(promise.reject) - return await process.start( - ($) => - $({ - env: { - RUST_LOG: rustLog, - }, - })`${[ - binary, - 'node', - `--authrpc.port=${port! + 30}`, - `--datadir=${dataDir}`, - '--dev', - `--dev.block-time=${parameters?.blockTime ?? '50ms'}`, - '--engine.disable-precompile-cache', - '--engine.legacy-state-root', - '--faucet.address', - ...(parameters?.faucet?.addresses ?? [ - '0x20c0000000000000000000000000000000000000', - '0x20c0000000000000000000000000000000000001', - '0x20c0000000000000000000000000000000000002', - '0x20c0000000000000000000000000000000000003', - ]), - `--faucet.amount=${parameters?.faucet?.amount ?? '1000000000000'}`, - '--faucet.enabled', - `--faucet.private-key=${parameters?.faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`, - '--http', - '--http.addr=0.0.0.0', - '--http.api=all', - '--http.corsdomain=*', - `--http.port=${port!}`, - `--port=${port! + 10}`, - '--txpool.basefee-max-count=10000000000000', - '--txpool.basefee-max-size=10000', - '--txpool.max-account-slots=500000', - '--txpool.pending-max-count=10000000000000', - '--txpool.pending-max-size=10000', - '--txpool.queued-max-count=10000000000000', - '--txpool.queued-max-size=10000', - `--ws.port=${port! + 20}`, - ]}`, - { - ...options, - // Resolve when the process is listening via "RPC HTTP server started" message. - resolver({ process, reject, resolve }) { - process.stdout.on('data', (data) => { - const message = data.toString() - if (log) console.log(message) - if (message.includes('RPC HTTP server started')) resolve() - if (message.includes('shutting down')) reject('shutting down') - }) - process.stderr.on('data', (data) => { - const message = data.toString() - if (log) console.error(message) - }) - }, - }, - ) + return promise.promise }, async stop() { - await process.stop() + if (!container) return + await container.stop() + container = undefined }, } }) + +export declare namespace tempo { + export type Parameters = { + /** + * Interval between blocks. + */ + blockTime?: string | undefined + /** + * Name of the container. + */ + containerName?: string | undefined + /** + * Chain this node is running. + */ + chain?: string | undefined + /** + * Docker image to use. + */ + image?: string | undefined + /** + * Faucet options. + */ + faucet?: + | { + /** + * Target token addresses for the faucet to be funding with + */ + addresses?: string[] | undefined + /** + * Amount for each faucet funding transaction + */ + amount?: bigint | undefined + /** + * Faucet funding mnemonic + */ + privateKey?: string | undefined + } + | undefined + /** + * Rust log level configuration (sets RUST_LOG environment variable). + * Can be a log level or a custom filter string. + */ + log?: + | 'trace' + | 'debug' + | 'info' + | 'warn' + | 'error' + | (string & {}) + | boolean + | undefined + /** + * Host the server will listen on. + */ + host?: string | undefined + /** + * Port the server will listen on. + */ + port?: number | undefined + } +} diff --git a/src/processes/execa.test.ts b/src/processes/execa.test.ts index 8aeb9ac..9432b06 100644 --- a/src/processes/execa.test.ts +++ b/src/processes/execa.test.ts @@ -1,7 +1,7 @@ import { EventEmitter } from 'eventemitter3' +import getPort from 'get-port' import { afterEach, expect, test } from 'vitest' import { execa } from './execa.js' -import getPort from 'get-port' const processes: execa.ReturnType[] = [] function createProcess() { From ee03ab82e23477c7576611ae40c61b0742e2d46d Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:24:01 +1100 Subject: [PATCH 20/21] chore: up --- README.md | 3 +- src/Instance.ts | 2 +- src/instances/tempo.ts | 281 +++++++++++++++++++++++++++-------------- 3 files changed, 187 insertions(+), 99 deletions(-) diff --git a/README.md b/README.md index 2eda133..b018d80 100644 --- a/README.md +++ b/README.md @@ -101,8 +101,7 @@ await server.start() #### Requirements ```bash -curl -L https://get.docker.com/ | bash # Install Docker -npm i testcontainers # Install `testcontainers` +curl -L https://tempo.xyz/install | bash # Install Tempo ``` #### Usage diff --git a/src/Instance.ts b/src/Instance.ts index e473e57..e3f1b88 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -2,7 +2,7 @@ import { EventEmitter } from 'eventemitter3' export { alto } from './instances/alto.js' export { anvil } from './instances/anvil.js' -export { tempo } from './instances/tempo.js' +export { tempo, tempoDocker } from './instances/tempo.js' type EventTypes = { exit: [code: number | null, signal: NodeJS.Signals | null] diff --git a/src/instances/tempo.ts b/src/instances/tempo.ts index 666d331..26d28eb 100644 --- a/src/instances/tempo.ts +++ b/src/instances/tempo.ts @@ -6,25 +6,59 @@ import { Wait, } from 'testcontainers' import * as Instance from '../Instance.js' +import { execa } from '../processes/execa.js' + +export function command(parameters: tempo.Parameters): string[] { + const { faucet, port } = parameters + const dataDir = path.join(os.tmpdir(), '.prool', `tempo.${port}`) + return [ + 'node', + `--authrpc.port=${port! + 30}`, + `--datadir=${dataDir}`, + '--dev', + `--dev.block-time=${parameters?.blockTime ?? '50ms'}`, + '--engine.disable-precompile-cache', + '--engine.legacy-state-root', + '--faucet.address', + ...(faucet?.addresses ?? [ + '0x20c0000000000000000000000000000000000000', + '0x20c0000000000000000000000000000000000001', + '0x20c0000000000000000000000000000000000002', + '0x20c0000000000000000000000000000000000003', + ]), + `--faucet.amount=${faucet?.amount ?? '1000000000000'}`, + '--faucet.enabled', + `--faucet.private-key=${faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`, + '--http', + '--http.addr=0.0.0.0', + '--http.api=all', + '--http.corsdomain=*', + `--http.port=${port!}`, + `--port=${port! + 10}`, + '--txpool.basefee-max-count=10000000000000', + '--txpool.basefee-max-size=10000', + '--txpool.max-account-slots=500000', + '--txpool.pending-max-count=10000000000000', + '--txpool.pending-max-size=10000', + '--txpool.queued-max-count=10000000000000', + '--txpool.queued-max-size=10000', + `--ws.port=${port! + 20}`, + ] +} /** * Defines a Tempo instance. * * @example * ```ts - * const instance = tempo({ port: 8545 }) + * const instance = Instance.tempo({ port: 8545 }) * await instance.start() * // ... * await instance.stop() * ``` */ export const tempo = Instance.define((parameters?: tempo.Parameters) => { - const { - containerName = `tempo.${crypto.randomUUID()}`, - image = 'ghcr.io/tempoxyz/tempo:latest', - log: log_, - ...args - } = parameters || {} + const { binary = 'tempo', log: log_, ...args } = parameters || {} const log = (() => { try { @@ -36,93 +70,46 @@ export const tempo = Instance.define((parameters?: tempo.Parameters) => { const RUST_LOG = log && typeof log !== 'boolean' ? log : '' const name = 'tempo' - let container: StartedTestContainer | undefined + const process = execa({ name }) return { _internal: { args, + get process() { + return process._internal.process + }, }, host: args.host ?? 'localhost', name, port: args.port ?? 8545, - async start({ port = args.port }, { emitter }) { - const promise = Promise.withResolvers() - - const dataDir = path.join(os.tmpdir(), '.prool', containerName) - const c = new GenericContainer(image) - .withPlatform('linux/x86_64') - .withNetworkMode('host') - .withExtraHosts([ - { host: 'host.docker.internal', ipAddress: 'host-gateway' }, - { host: 'localhost', ipAddress: 'host-gateway' }, - ]) - .withName(containerName) - .withEnvironment({ RUST_LOG }) - .withCommand([ - 'node', - `--authrpc.port=${port! + 30}`, - `--datadir=${dataDir}`, - '--dev', - `--dev.block-time=${parameters?.blockTime ?? '50ms'}`, - '--engine.disable-precompile-cache', - '--engine.legacy-state-root', - '--faucet.address', - ...(parameters?.faucet?.addresses ?? [ - '0x20c0000000000000000000000000000000000000', - '0x20c0000000000000000000000000000000000001', - '0x20c0000000000000000000000000000000000002', - '0x20c0000000000000000000000000000000000003', - ]), - `--faucet.amount=${parameters?.faucet?.amount ?? '1000000000000'}`, - '--faucet.enabled', - `--faucet.private-key=${parameters?.faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`, - '--http', - '--http.addr=0.0.0.0', - '--http.api=all', - '--http.corsdomain=*', - `--http.port=${port!}`, - `--port=${port! + 10}`, - '--txpool.basefee-max-count=10000000000000', - '--txpool.basefee-max-size=10000', - '--txpool.max-account-slots=500000', - '--txpool.pending-max-count=10000000000000', - '--txpool.pending-max-size=10000', - '--txpool.queued-max-count=10000000000000', - '--txpool.queued-max-size=10000', - `--ws.port=${port! + 20}`, - ]) - .withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/)) - .withLogConsumer((stream) => { - stream.on('data', (data) => { - const message = data.toString() - emitter.emit('message', message) - emitter.emit('stdout', message) - if (log) console.log(message) - if (message.includes('shutting down')) - promise.reject(new Error(`Failed to start: ${message}`)) - }) - stream.on('error', (error) => { - if (log) console.error(error.message) - emitter.emit('message', error.message) - emitter.emit('stderr', error.message) - promise.reject(new Error(`Failed to start: ${error.message}`)) - }) - }) - .withStartupTimeout(120_000) - - c.start() - .then((c) => { - container = c - promise.resolve() - }) - .catch(promise.reject) - - return promise.promise + async start({ port = args.port }, options) { + return await process.start( + ($) => + $({ + env: { + RUST_LOG, + }, + })`${[binary, ...command({ ...parameters, port })]}`, + { + ...options, + // Resolve when the process is listening via "RPC HTTP server started" message. + resolver({ process, reject, resolve }) { + process.stdout.on('data', (data) => { + const message = data.toString() + if (log) console.log(message) + if (message.includes('RPC HTTP server started')) resolve() + if (message.includes('shutting down')) reject('shutting down') + }) + process.stderr.on('data', (data) => { + const message = data.toString() + if (log) console.error(message) + }) + }, + }, + ) }, async stop() { - if (!container) return - await container.stop() - container = undefined + await process.stop() }, } }) @@ -130,21 +117,13 @@ export const tempo = Instance.define((parameters?: tempo.Parameters) => { export declare namespace tempo { export type Parameters = { /** - * Interval between blocks. - */ - blockTime?: string | undefined - /** - * Name of the container. - */ - containerName?: string | undefined - /** - * Chain this node is running. + * Path or alias to the Tempo binary. */ - chain?: string | undefined + binary?: string | undefined /** - * Docker image to use. + * Interval between blocks. */ - image?: string | undefined + blockTime?: string | undefined /** * Faucet options. */ @@ -187,3 +166,113 @@ export declare namespace tempo { port?: number | undefined } } + +/** + * Defines a Tempo instance. + * + * @example + * ```ts + * const instance = Instance.tempoDocker({ port: 8545 }) + * await instance.start() + * // ... + * await instance.stop() + * ``` + */ +export const tempoDocker = Instance.define( + (parameters?: tempoDocker.Parameters) => { + const { + containerName = `tempo.${crypto.randomUUID()}`, + image = 'ghcr.io/tempoxyz/tempo:latest', + log: log_, + ...args + } = parameters || {} + + const log = (() => { + try { + return JSON.parse(log_ as string) + } catch { + return log_ + } + })() + const RUST_LOG = log && typeof log !== 'boolean' ? log : '' + + const name = 'tempo' + let container: StartedTestContainer | undefined + + return { + _internal: { + args, + }, + host: args.host ?? 'localhost', + name, + port: args.port ?? 8545, + async start({ port = args.port }, { emitter }) { + const promise = Promise.withResolvers() + + const c = new GenericContainer(image) + .withPlatform('linux/x86_64') + .withNetworkMode('host') + .withExtraHosts([ + { host: 'host.docker.internal', ipAddress: 'host-gateway' }, + { host: 'localhost', ipAddress: 'host-gateway' }, + ]) + .withName(containerName) + .withEnvironment({ RUST_LOG }) + .withCommand(command({ ...parameters, port })) + .withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/)) + .withLogConsumer((stream) => { + stream.on('data', (data) => { + const message = data.toString() + emitter.emit('message', message) + emitter.emit('stdout', message) + if (log) console.log(message) + if (message.includes('shutting down')) + promise.reject(new Error(`Failed to start: ${message}`)) + }) + stream.on('error', (error) => { + if (log) console.error(error.message) + emitter.emit('message', error.message) + emitter.emit('stderr', error.message) + promise.reject(new Error(`Failed to start: ${error.message}`)) + }) + }) + .withStartupTimeout(10_000) + + c.start() + .then((c) => { + container = c + promise.resolve() + }) + .catch(promise.reject) + + return promise.promise + }, + async stop() { + if (!container) return + await container.stop() + container = undefined + }, + } + }, +) + +export declare namespace tempoDocker { + export type Parameters = Omit & { + /** + * Name of the container. + */ + containerName?: string | undefined + /** + * Docker image to use. + */ + image?: string | undefined + /** + * Host the server will listen on. + */ + host?: string | undefined + /** + * Port the server will listen on. + */ + port?: number | undefined + } +} From 96c7b46693e1857b581155dc35b89a9fb2e60d73 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:49:42 +1100 Subject: [PATCH 21/21] chore: up --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 77dcf86..7881259 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,7 +15,6 @@ jobs: changesets: name: Changesets - needs: verify permissions: contents: write id-token: write