From e4faf6fd6c9327f8b354d40fe1cf3ace2c4e42bf Mon Sep 17 00:00:00 2001 From: Fuxing Loh <4266087+fuxingloh@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:50:22 +0800 Subject: [PATCH] feat: implement chainfile (#75) * feat: implement chainfile * fix lock file * add read permission * fix imports --- .github/dependabot.yml | 15 + .github/renovate.json | 33 -- .github/workflows/ci.yml | 38 +- .gitignore | 11 +- ...ana-container.iml => chainfile-solana.iml} | 5 +- .idea/modules.xml | 2 +- README.md | 81 +-- package.json | 14 +- packages/chainfile-solana/package.json | 22 + packages/chainfile-solana/test-validator.json | 38 ++ .../chainfile-solana/test-validator.test.ts | 27 + packages/solana-container/LICENSE | 373 ------------ packages/solana-container/package.json | 15 - packages/solana-container/version.js | 4 - .../solana-docker/.dockerignore | 0 .../Dockerfile | 0 packages/solana-docker/docker.mjs | 47 ++ packages/solana-docker/package.json | 15 + packages/solana-testcontainers/LICENSE | 373 ------------ packages/solana-testcontainers/README.md | 45 ++ packages/solana-testcontainers/index.test.ts | 51 -- packages/solana-testcontainers/index.ts | 33 -- packages/solana-testcontainers/package.json | 22 +- .../solana-testcontainers/src/index.test.ts | 46 ++ packages/solana-testcontainers/src/index.ts | 48 ++ .../solana-testcontainers/tsconfig.build.json | 9 +- packages/solana-testcontainers/turbo.json | 10 - pnpm-lock.yaml | 561 +++++++++--------- .../tsconfig.json => tsconfig.json | 0 turbo.json | 19 +- workspace/eslint-config/package.json | 4 +- workspace/tsconfig/tsconfig.json | 3 +- 32 files changed, 701 insertions(+), 1263 deletions(-) create mode 100644 .github/dependabot.yml delete mode 100644 .github/renovate.json rename .idea/{solana-container.iml => chainfile-solana.iml} (78%) create mode 100644 packages/chainfile-solana/package.json create mode 100644 packages/chainfile-solana/test-validator.json create mode 100644 packages/chainfile-solana/test-validator.test.ts delete mode 100644 packages/solana-container/LICENSE delete mode 100644 packages/solana-container/package.json delete mode 100644 packages/solana-container/version.js rename .dockerignore => packages/solana-docker/.dockerignore (100%) rename packages/{solana-container => solana-docker}/Dockerfile (100%) create mode 100644 packages/solana-docker/docker.mjs create mode 100644 packages/solana-docker/package.json delete mode 100644 packages/solana-testcontainers/LICENSE create mode 100644 packages/solana-testcontainers/README.md delete mode 100644 packages/solana-testcontainers/index.test.ts delete mode 100644 packages/solana-testcontainers/index.ts create mode 100644 packages/solana-testcontainers/src/index.test.ts create mode 100644 packages/solana-testcontainers/src/index.ts delete mode 100644 packages/solana-testcontainers/turbo.json rename packages/solana-testcontainers/tsconfig.json => tsconfig.json (100%) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..fa30b9d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'weekly' + - package-ecosystem: npm + directory: '/' + schedule: + interval: 'weekly' + groups: + eslint: + patterns: + - 'eslint' + - '@eslint/*' diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index 321a05a..0000000 --- a/.github/renovate.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "helpers:pinGitHubActionDigests", ":semanticCommits", ":semanticCommitTypeAll(bump)"], - "dependencyDashboard": true, - "dependencyDashboardAutoclose": false, - "major": { - "dependencyDashboardApproval": false - }, - "rangeStrategy": "bump", - "regexManagers": [ - { - "fileMatch": ["version.js", "index.ts"], - "matchStrings": [ - "datasource=(?.*?) depName=(?.*?)( versioning=(?.*?))?\\sconst .*?_VERSION *= *'(?.*)';\\s" - ], - "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}" - } - ], - "packageRules": [ - { - "matchPackageNames": ["node", "typescript", "@types/node"], - "enabled": false - }, - { - "matchPackagePatterns": ["^@contentedjs/"], - "groupName": "@contentedjs" - }, - { - "matchPackagePatterns": ["^@eslint/", "^eslint$"], - "groupName": "@eslint" - } - ] -} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8627863..9020af2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,7 @@ concurrency: permissions: contents: read + packages: read jobs: build: @@ -30,9 +31,27 @@ jobs: - run: pnpm turbo run build - test: - name: Test + test_plan: + name: Test [plan] runs-on: ubuntu-latest + outputs: + packages: ${{ steps.plan.outputs.packages }} + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + + - uses: fuxingloh/turbo-plan@4bd6ef3cdb543fbf5fca55b6b5b74892acecdfa5 # v2 + id: plan + with: + task: test + + test_run: + name: Test [run] + needs: test_plan + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + package: ${{ fromJSON(needs.test_plan.outputs.packages) }} steps: - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 @@ -44,10 +63,19 @@ jobs: - run: pnpm install --frozen-lockfile - # Pre-run build steps, required for the test step - - run: pnpm --filter=solana-container run build:docker + - run: pnpm turbo run test --filter=${{ matrix.package }} - - run: pnpm turbo run test + test_completed: + name: Test [completed] + runs-on: ubuntu-latest + if: always() + needs: + - test_run + steps: + - run: | + if ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'skipped') || contains(needs.*.result, 'cancelled') }} ; then + exit 1 + fi lint_prettier: name: Lint [prettier] diff --git a/.gitignore b/.gitignore index 4d60ae9..18fa918 100644 --- a/.gitignore +++ b/.gitignore @@ -8,14 +8,5 @@ build *.tgz coverage .nyc_output - -# tsconfig.json -packages/*/**/*.d.ts -packages/*/**/*.d.ts.map -packages/*/**/*.js - -# turborepo .turbo - -# contented -.contented \ No newline at end of file +.chainfile \ No newline at end of file diff --git a/.idea/solana-container.iml b/.idea/chainfile-solana.iml similarity index 78% rename from .idea/solana-container.iml rename to .idea/chainfile-solana.iml index 1a8e613..743c66c 100644 --- a/.idea/solana-container.iml +++ b/.idea/chainfile-solana.iml @@ -6,9 +6,8 @@ - - - + + diff --git a/.idea/modules.xml b/.idea/modules.xml index f7ee094..5f9a178 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/README.md b/README.md index 7605ac8..4a2015a 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,60 @@ -# Solana Container +# Chainfile Solana -```typescript -import { SolanaContainer, StartedSolanaContainer } from 'solana-testcontainers'; -import { Connection, PublicKey } from '@solana/web3.js'; +Part of the [Chainfile](https://chainfile.org) ecosystem, +this library provides a Docker image for running `solana-test-validator` in a container for toolchain isolation. +This is particularly useful for language-agnostic development and parallelization of systems. -describe('SolanaContainer', () => { - let container: StartedSolanaContainer; - let connection: Connection; +> The default [solanalabs/solana](https://hub.docker.com/r/solanalabs/solana) is an optimized image, +> when used on a host system that does not support AVX, it will fail with the following error: +> `Incompatible CPU detected: missing AVX support. Please build from source on the target.` - beforeAll(async () => { - container = await new SolanaContainer().start(); - connection = new Connection(container.getHostRpcEndpoint(), { - commitment: 'processed', - wsEndpoint: container.getHostWsEndpoint(), - }); - }); +## `solana-testcontainers` - afterAll(async () => { - await container.stop(); - }); +This is a standalone testcontainers-node package for running `solana-test-validator` in a container for testing +purposes. You don't need to use the Chainfile ecosystem to use this package. - it('should get processed block height', async () => { - const blockHeight = await connection.getBlockHeight('processed'); - expect(blockHeight).toBeGreaterThanOrEqual(0); - }); +```shell +npm i -D solana-testcontainers @solana/web3.js +``` + +```typescript +import { afterAll, beforeAll, expect, it } from '@jest/globals'; +import { Connection, PublicKey } from '@solana/web3.js'; + +import { SolanaContainer, StartedSolanaContainer } from './index'; - it('should fund address with 5129000000 lamports with confirmation', async () => { - const publicKey = new PublicKey('Emp8JcXpFnCXzdWBC3ChRPtNQHiiQW6kr61wopT3hbNL'); - const lamports = 5_129_000_000; +let container: StartedSolanaContainer; +let connection: Connection; - const block = await connection.getLatestBlockhash('processed'); - const signature = await connection.requestAirdrop(publicKey, lamports); - await connection.confirmTransaction({ signature, ...block }, 'processed'); +beforeAll(async () => { + container = await new SolanaContainer().start(); + connection = container.connection; +}); + +afterAll(async () => { + await container.stop(); +}); - const balance = await connection.getBalance(publicKey, 'processed'); - expect(balance).toStrictEqual(lamports); +it('should get block 0', async () => { + const block = await connection.getBlock(0); + expect(block).toMatchObject({ + blockHeight: 0, + blockhash: expect.any(String), }); }); -``` -## Motivation +it('should fund address with 5129000000 lamports with confirmation', async () => { + const publicKey = new PublicKey('Emp8JcXpFnCXzdWBC3ChRPtNQHiiQW6kr61wopT3hbNL'); + const lamports = 5_129_000_000; -This library creates a Docker image that isolates the toolchain for Solana from the host system. -This is particularly useful for language-agnostic development and parallelization of systems. + const block = await connection.getLatestBlockhash('processed'); + const signature = await connection.requestAirdrop(publicKey, lamports); + await connection.confirmTransaction({ signature, ...block }, 'processed'); -The default [solanalabs/solana](https://hub.docker.com/r/solanalabs/solana) is an optimized image, -when used on a host system that does not support AVX, it will fail with the following error: -Incompatible CPU detected: missing AVX support. -Please build from source on the target. + const balance = await connection.getBalance(publicKey, 'processed'); + expect(balance).toStrictEqual(lamports); +}); +``` ## License diff --git a/package.json b/package.json index 8ffc8ed..58414ff 100644 --- a/package.json +++ b/package.json @@ -15,18 +15,20 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", - "@swc/core": "^1.5.24", - "@swc/jest": "^0.2.36", - "@types/node": "^20.11.30", + "@swc/core": "^1.5.28", + "@swc/jest": "0.2.36", + "@types/node": "^20.14.2", "@workspace/eslint-config": "workspace:*", + "@workspace/jest-preset": "workspace:*", "@workspace/prettier-config": "workspace:*", + "@workspace/tsconfig": "workspace:*", "eslint": "^8.57.0", "husky": "^9.0.11", "jest": "29.7.0", "lint-staged": "^15.2.5", - "prettier": "^3.2.5", - "turbo": "^1.13.3", - "typescript": "5.4.3", + "prettier": "^3.3.2", + "turbo": "^2.0.3", + "typescript": "5.4.5", "wait-for-expect": "^3.0.2" }, "packageManager": "pnpm@8.15.8", diff --git a/packages/chainfile-solana/package.json b/packages/chainfile-solana/package.json new file mode 100644 index 0000000..b644a53 --- /dev/null +++ b/packages/chainfile-solana/package.json @@ -0,0 +1,22 @@ +{ + "name": "chainfile-solana", + "version": "0.0.0", + "private": false, + "repository": { + "url": "git+https://github.com/vetumorg/chainfile-solana" + }, + "license": "MPL-2.0", + "files": [ + "*.json" + ], + "scripts": { + "lint": "eslint .", + "test": "jest" + }, + "jest": { + "preset": "@workspace/jest-preset" + }, + "devDependencies": { + "@chainfile/testcontainers": "^0.5.0" + } +} diff --git a/packages/chainfile-solana/test-validator.json b/packages/chainfile-solana/test-validator.json new file mode 100644 index 0000000..371b0d1 --- /dev/null +++ b/packages/chainfile-solana/test-validator.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://chainfile.org/schema.json", + "caip2": "solana:00000000000000000000000000000000", + "name": "Solana Test Validator", + "values": { + "version": "1.18.15" + }, + "containers": { + "solana": { + "image": "ghcr.io/vetumorg/solana-test-validator", + "tag": { + "$value": "version" + }, + "source": "https://github.com/vetumorg/chainfile-solana", + "resources": { + "cpu": 0.25, + "memory": 256 + }, + "endpoints": { + "rpc": { + "port": 8899, + "protocol": "HTTP JSON-RPC 2.0", + "probes": { + "readiness": { + "params": [], + "method": "getBlockHeight", + "match": { + "result": { + "type": "number" + } + } + } + } + } + } + } + } +} diff --git a/packages/chainfile-solana/test-validator.test.ts b/packages/chainfile-solana/test-validator.test.ts new file mode 100644 index 0000000..6782554 --- /dev/null +++ b/packages/chainfile-solana/test-validator.test.ts @@ -0,0 +1,27 @@ +import { ChainfileTestcontainers } from '@chainfile/testcontainers'; +import { afterAll, beforeAll, describe, expect, it } from '@jest/globals'; + +import test from './test-validator.json'; + +const testcontainers = new ChainfileTestcontainers(test); + +beforeAll(async () => { + await testcontainers.start(); +}); + +afterAll(async () => { + await testcontainers.stop(); +}); + +describe('solana', () => { + it('should rpc(getBlockHeight)', async () => { + const response = await testcontainers.get('solana').rpc({ + method: 'getBlockHeight', + }); + + expect(response.status).toStrictEqual(200); + expect(await response.json()).toMatchObject({ + result: 0, + }); + }); +}); diff --git a/packages/solana-container/LICENSE b/packages/solana-container/LICENSE deleted file mode 100644 index a612ad9..0000000 --- a/packages/solana-container/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packages/solana-container/package.json b/packages/solana-container/package.json deleted file mode 100644 index bf1ca3f..0000000 --- a/packages/solana-container/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "solana-container", - "version": "0.0.0", - "private": true, - "license": "MPL-2.0", - "scripts": { - "build:docker": "docker buildx build --progress=plain -t ghcr.io/fuxingloh/solana-container:$(node -p \"require('./version.js')\") -f Dockerfile ../../ --build-arg SOLANA_VERSION=$(node -p \"require('./version.js')\") --cache-from type=registry,ref=ghcr.io/fuxingloh/solana-container:build-cache", - "push:docker": "docker buildx build --progress=plain -t ghcr.io/fuxingloh/solana-container:$(node -p \"require('./version.js')\") -f Dockerfile ../../ --output type=registry --platform linux/amd64,linux/arm64 --build-arg SOLANA_VERSION=$(node -p \"require('./version.js')\") --cache-to type=registry,ref=ghcr.io/fuxingloh/solana-container:build-cache,mode=max --cache-from type=registry,ref=ghcr.io/fuxingloh/solana-container:build-cache" - }, - "lint-staged": { - "*": [ - "prettier --write --ignore-unknown" - ] - } -} diff --git a/packages/solana-container/version.js b/packages/solana-container/version.js deleted file mode 100644 index 0812d78..0000000 --- a/packages/solana-container/version.js +++ /dev/null @@ -1,4 +0,0 @@ -// renovate: datasource=github-releases depName=solana-labs/solana -const SOLANA_VERSION = '1.18.15'; - -module.exports = SOLANA_VERSION; diff --git a/.dockerignore b/packages/solana-docker/.dockerignore similarity index 100% rename from .dockerignore rename to packages/solana-docker/.dockerignore diff --git a/packages/solana-container/Dockerfile b/packages/solana-docker/Dockerfile similarity index 100% rename from packages/solana-container/Dockerfile rename to packages/solana-docker/Dockerfile diff --git a/packages/solana-docker/docker.mjs b/packages/solana-docker/docker.mjs new file mode 100644 index 0000000..2120220 --- /dev/null +++ b/packages/solana-docker/docker.mjs @@ -0,0 +1,47 @@ +import { spawn } from 'node:child_process'; + +/** + * Get latest GitHub release from solana-labs/solana + * @return {Promise} + */ +async function getLatestTag() { + const response = await fetch('https://api.github.com/repos/solana-labs/solana/releases/latest'); + const { tag_name } = await response.json(); + if (tag_name.match(/^v[0-9]+\.[0-9]+\.[0-9]+$/)) { + return tag_name.replace(/^v/, ''); + } + throw new Error(`Unexpected tag_name: ${tag_name}`); +} + +async function run(version, type) { + const args = [ + 'buildx', + 'build', + '.', + '--progress=plain', + '-t', + `ghcr.io/vetumorg/solana-test-validator:${version}`, + '--build-arg', + `SOLANA_VERSION=${version}`, + '--cache-from', + 'type=registry,ref=ghcr.io/vetumorg/solana-test-validator:build-cache', + ]; + + if (type === 'push') { + args.push( + '-t', + 'ghcr.io/vetumorg/solana-test-validator:latest', + '--output', + 'type=registry', + '--platform', + 'linux/amd64,linux/arm64', + '--cache-to', + 'type=registry,ref=ghcr.io/vetumorg/solana-test-validator:build-cache', + ); + } + + spawn('docker', args, { stdio: 'inherit' }); +} + +const tag = await getLatestTag(); +await run(tag, process.argv[2]); diff --git a/packages/solana-docker/package.json b/packages/solana-docker/package.json new file mode 100644 index 0000000..f0e47da --- /dev/null +++ b/packages/solana-docker/package.json @@ -0,0 +1,15 @@ +{ + "name": "solana-docker", + "version": "0.0.0", + "private": true, + "license": "MPL-2.0", + "scripts": { + "build:docker": "node docker.mjs build", + "push:docker": "node docker.mjs push" + }, + "lint-staged": { + "*": [ + "prettier --write --ignore-unknown" + ] + } +} diff --git a/packages/solana-testcontainers/LICENSE b/packages/solana-testcontainers/LICENSE deleted file mode 100644 index a612ad9..0000000 --- a/packages/solana-testcontainers/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packages/solana-testcontainers/README.md b/packages/solana-testcontainers/README.md new file mode 100644 index 0000000..121e8a4 --- /dev/null +++ b/packages/solana-testcontainers/README.md @@ -0,0 +1,45 @@ +This project is part of the [Chainfile](https://chainfile.org) ecosystem; +it provides a Docker image for running `solana-test-validator` in a container for toolchain isolation. + +```shell +npm i -D solana-testcontainers @solana/web3.js +``` + +```typescript +import { afterAll, beforeAll, expect, it } from '@jest/globals'; +import { Connection, PublicKey } from '@solana/web3.js'; + +import { SolanaContainer, StartedSolanaContainer } from './index'; + +let container: StartedSolanaContainer; +let connection: Connection; + +beforeAll(async () => { + container = await new SolanaContainer().start(); + connection = container.connection; +}); + +afterAll(async () => { + await container.stop(); +}); + +it('should get block 0', async () => { + const block = await connection.getBlock(0); + expect(block).toMatchObject({ + blockHeight: 0, + blockhash: expect.any(String), + }); +}); + +it('should fund address with 5129000000 lamports with confirmation', async () => { + const publicKey = new PublicKey('Emp8JcXpFnCXzdWBC3ChRPtNQHiiQW6kr61wopT3hbNL'); + const lamports = 5_129_000_000; + + const block = await connection.getLatestBlockhash('processed'); + const signature = await connection.requestAirdrop(publicKey, lamports); + await connection.confirmTransaction({ signature, ...block }, 'processed'); + + const balance = await connection.getBalance(publicKey, 'processed'); + expect(balance).toStrictEqual(lamports); +}); +``` diff --git a/packages/solana-testcontainers/index.test.ts b/packages/solana-testcontainers/index.test.ts deleted file mode 100644 index b1de5e9..0000000 --- a/packages/solana-testcontainers/index.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { afterAll, beforeAll, describe, expect, it } from '@jest/globals'; -import { Connection, PublicKey } from '@solana/web3.js'; - -import { SolanaContainer, StartedSolanaContainer } from './index'; - -describe('SolanaContainer', () => { - let container: StartedSolanaContainer; - let connection: Connection; - - beforeAll(async () => { - container = await new SolanaContainer().start(); - connection = new Connection(container.getHostRpcEndpoint(), { - commitment: 'confirmed', - wsEndpoint: container.getHostWsEndpoint(), - }); - }); - - afterAll(async () => { - await container.stop(); - }); - - it('should expose host rpc endpoint', async () => { - expect(container.getHostRpcEndpoint()).toMatch(/http:\/\/localhost:\d+/); - }); - - it('should get processed block height', async () => { - const blockHeight = await connection.getBlockHeight('processed'); - expect(blockHeight).toBeGreaterThanOrEqual(0); - }); - - it('should get block 0', async () => { - const block = await connection.getBlock(0); - expect(block).toMatchObject({ - blockHeight: 0, - // Not deterministic - blockhash: expect.any(String), - }); - }); - - it('should fund address with 5129000000 lamports with confirmation', async () => { - const publicKey = new PublicKey('Emp8JcXpFnCXzdWBC3ChRPtNQHiiQW6kr61wopT3hbNL'); - const lamports = 5_129_000_000; - - const block = await connection.getLatestBlockhash('processed'); - const signature = await connection.requestAirdrop(publicKey, lamports); - await connection.confirmTransaction({ signature, ...block }, 'processed'); - - const balance = await connection.getBalance(publicKey, 'processed'); - expect(balance).toStrictEqual(lamports); - }); -}); diff --git a/packages/solana-testcontainers/index.ts b/packages/solana-testcontainers/index.ts deleted file mode 100644 index 121c3cd..0000000 --- a/packages/solana-testcontainers/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AbstractStartedContainer, GenericContainer, StartedTestContainer, Wait } from 'testcontainers'; - -// renovate: datasource=github-releases depName=solana-labs/solana -const SOLANA_VERSION = '1.18.15'; - -export class SolanaContainer extends GenericContainer { - constructor(image: string = `ghcr.io/fuxingloh/solana-container:${SOLANA_VERSION}`) { - super(image); - this.withWaitStrategy(Wait.forLogMessage('Processed Slot:')); - this.withExposedPorts( - 8899, // RPC - 8900, // WS - ); - } - - async start(): Promise { - return new StartedSolanaContainer(await super.start()); - } -} - -export class StartedSolanaContainer extends AbstractStartedContainer { - constructor(startedTestContainer: StartedTestContainer) { - super(startedTestContainer); - } - - getHostRpcEndpoint(): string { - return `http://${this.getHost()}:${this.getMappedPort(8899)}`; - } - - getHostWsEndpoint(): string { - return `ws://${this.getHost()}:${this.getMappedPort(8900)}`; - } -} diff --git a/packages/solana-testcontainers/package.json b/packages/solana-testcontainers/package.json index e8b1cc4..2b09b4e 100644 --- a/packages/solana-testcontainers/package.json +++ b/packages/solana-testcontainers/package.json @@ -3,21 +3,19 @@ "version": "0.0.0", "private": false, "repository": { - "url": "git+https://github.com/fuxingloh/solana-container" + "url": "git+https://github.com/vetumorg/chainfile-solana" }, "license": "MPL-2.0", - "main": "index.js", - "types": "index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "files": [ - "index.js", - "index.d.ts", - "index.d.ts.map" + "dist/**" ], "scripts": { "build": "tsc --project tsconfig.build.json", - "clean": "tsc --build --clean", + "clean": "rm -rf dist", "lint": "eslint .", - "test": "jest --passWithNoTests --forceExit" + "test": "jest --forceExit" }, "lint-staged": { "*": [ @@ -35,9 +33,9 @@ "testcontainers": "^10.9.0" }, "devDependencies": { - "@solana/web3.js": "1.91.8", - "@workspace/jest-preset": "workspace:*", - "@workspace/tsconfig": "workspace:*", - "solana-container": "workspace:*" + "@solana/web3.js": "1.91.8" + }, + "peerDependencies": { + "@solana/web3.js": "^1" } } diff --git a/packages/solana-testcontainers/src/index.test.ts b/packages/solana-testcontainers/src/index.test.ts new file mode 100644 index 0000000..9e8d8b7 --- /dev/null +++ b/packages/solana-testcontainers/src/index.test.ts @@ -0,0 +1,46 @@ +import { afterAll, beforeAll, expect, it } from '@jest/globals'; +import { Connection, PublicKey } from '@solana/web3.js'; + +import { SolanaContainer, StartedSolanaContainer } from './index'; + +let container: StartedSolanaContainer; +let connection: Connection; + +beforeAll(async () => { + container = await new SolanaContainer().start(); + connection = container.connection; +}); + +afterAll(async () => { + await container.stop(); +}); + +it('should expose host rpc endpoint', async () => { + expect(container.getHostRpcEndpoint()).toMatch(/http:\/\/localhost:\d+/); +}); + +it('should get processed block height', async () => { + const blockHeight = await connection.getBlockHeight('processed'); + expect(blockHeight).toBeGreaterThanOrEqual(0); +}); + +it('should get block 0', async () => { + const block = await connection.getBlock(0); + expect(block).toMatchObject({ + blockHeight: 0, + // Not deterministic + blockhash: expect.any(String), + }); +}); + +it('should fund address with 5129000000 lamports with confirmation', async () => { + const publicKey = new PublicKey('Emp8JcXpFnCXzdWBC3ChRPtNQHiiQW6kr61wopT3hbNL'); + const lamports = 5_129_000_000; + + const block = await connection.getLatestBlockhash('processed'); + const signature = await connection.requestAirdrop(publicKey, lamports); + await connection.confirmTransaction({ signature, ...block }, 'processed'); + + const balance = await connection.getBalance(publicKey, 'processed'); + expect(balance).toStrictEqual(lamports); +}); diff --git a/packages/solana-testcontainers/src/index.ts b/packages/solana-testcontainers/src/index.ts new file mode 100644 index 0000000..cbe44ae --- /dev/null +++ b/packages/solana-testcontainers/src/index.ts @@ -0,0 +1,48 @@ +import { Connection, ConnectionConfig } from '@solana/web3.js'; +import { AbstractStartedContainer, GenericContainer, StartedTestContainer, Wait } from 'testcontainers'; + +export class SolanaContainer extends GenericContainer { + constructor(image: string = `ghcr.io/vetumorg/solana-test-validator:1.18.15`) { + super(image); + this.withWaitStrategy(Wait.forLogMessage('Processed Slot:')); + this.withExposedPorts( + 8899, // RPC + 8900, // WS + ); + } + + async start(): Promise { + return new StartedSolanaContainer(await super.start()); + } +} + +export class StartedSolanaContainer extends AbstractStartedContainer { + /** + * Default connection to the Solana node. + * Use createConnection to create a new custom connection. + */ + public readonly connection: Connection; + + constructor(startedTestContainer: StartedTestContainer) { + super(startedTestContainer); + this.connection = this.createConnection(); + } + + getHostRpcEndpoint(host: string = this.getHost()): string { + return `http://${host}:${this.getMappedPort(8899)}`; + } + + getHostWsEndpoint(host: string = this.getHost()): string { + return `ws://${host}:${this.getMappedPort(8900)}`; + } + + createConnection( + hostRpcEndpoint: string = this.getHostRpcEndpoint(), + config: ConnectionConfig = { + commitment: 'confirmed', + wsEndpoint: this.getHostWsEndpoint(), + }, + ): Connection { + return new Connection(hostRpcEndpoint, config); + } +} diff --git a/packages/solana-testcontainers/tsconfig.build.json b/packages/solana-testcontainers/tsconfig.build.json index 0245746..d8a1ea0 100644 --- a/packages/solana-testcontainers/tsconfig.build.json +++ b/packages/solana-testcontainers/tsconfig.build.json @@ -1,4 +1,9 @@ { - "extends": "./tsconfig.json", - "exclude": ["**/*.test.ts", "**/*.js"] + "extends": "@workspace/tsconfig", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"] } diff --git a/packages/solana-testcontainers/turbo.json b/packages/solana-testcontainers/turbo.json deleted file mode 100644 index 6873308..0000000 --- a/packages/solana-testcontainers/turbo.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"], - "pipeline": { - "test": { - "inputs": ["tsconfig.json", "./**/*.ts", "./**/*.test.ts"], - "dependsOn": ["solana-container#build:docker", "^build"] - } - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3fefeb..4b50c7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,20 +12,26 @@ importers: specifier: ^29.7.0 version: 29.7.0 '@swc/core': - specifier: ^1.5.24 - version: 1.5.24 + specifier: ^1.5.28 + version: 1.5.28 '@swc/jest': - specifier: ^0.2.36 - version: 0.2.36(@swc/core@1.5.24) + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.5.28) '@types/node': - specifier: ^20.11.30 - version: 20.11.30 + specifier: ^20.14.2 + version: 20.14.2 '@workspace/eslint-config': specifier: workspace:* version: link:workspace/eslint-config + '@workspace/jest-preset': + specifier: workspace:* + version: link:workspace/jest-preset '@workspace/prettier-config': specifier: workspace:* version: link:workspace/prettier-config + '@workspace/tsconfig': + specifier: workspace:* + version: link:workspace/tsconfig eslint: specifier: ^8.57.0 version: 8.57.0 @@ -34,24 +40,30 @@ importers: version: 9.0.11 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.11.30) + version: 29.7.0(@types/node@20.14.2) lint-staged: specifier: ^15.2.5 version: 15.2.5 prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.2 + version: 3.3.2 turbo: - specifier: ^1.13.3 - version: 1.13.3 + specifier: ^2.0.3 + version: 2.0.3 typescript: - specifier: 5.4.3 - version: 5.4.3 + specifier: 5.4.5 + version: 5.4.5 wait-for-expect: specifier: ^3.0.2 version: 3.0.2 - packages/solana-container: {} + packages/chainfile-solana: + devDependencies: + '@chainfile/testcontainers': + specifier: ^0.5.0 + version: 0.5.0 + + packages/solana-docker: {} packages/solana-testcontainers: dependencies: @@ -62,15 +74,6 @@ importers: '@solana/web3.js': specifier: 1.91.8 version: 1.91.8 - '@workspace/jest-preset': - specifier: workspace:* - version: link:../../workspace/jest-preset - '@workspace/tsconfig': - specifier: workspace:* - version: link:../../workspace/tsconfig - solana-container: - specifier: workspace:* - version: link:../solana-container workspace/eslint-config: dependencies: @@ -82,7 +85,7 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.13.0)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.1.0 @@ -93,11 +96,11 @@ importers: specifier: ^4.0.0 version: 4.0.0(eslint@8.57.0) globals: - specifier: ^15.3.0 - version: 15.3.0 + specifier: ^15.4.0 + version: 15.4.0 typescript-eslint: - specifier: ^7.11.0 - version: 7.11.0(eslint@8.57.0)(typescript@5.4.3) + specifier: ^7.13.0 + version: 7.13.0(eslint@8.57.0)(typescript@5.4.5) workspace/jest-preset: {} @@ -105,7 +108,7 @@ importers: dependencies: prettier-plugin-packagejson: specifier: ^2.5.0 - version: 2.5.0(prettier@3.2.5) + version: 2.5.0(prettier@3.3.2) workspace/tsconfig: {} @@ -457,12 +460,36 @@ packages: /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - dev: false /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@chainfile/docker@0.5.0: + resolution: {integrity: sha512-GYlaUDUlQpvXzVNJrqZv37Veyw/KFuP6vZJo2uBQ8cPp9FnSlyD3auGaSJPNoDwL7YGtZ1spKe8jFUKRQJYAfQ==} + dependencies: + '@chainfile/schema': 0.5.0 + ajv: 8.16.0 + ajv-formats: 3.0.1(ajv@8.16.0) + js-yaml: 4.1.0 + lodash: 4.17.21 + dev: true + + /@chainfile/schema@0.5.0: + resolution: {integrity: sha512-1E+NSoGijFTlWWaXGWwdrgm+TAh3mZcLVjnprVcaNqfJHd830qsui3yfkGAugs8iiHFk6epiovzKGnkUUA09Mw==} + dev: true + + /@chainfile/testcontainers@0.5.0: + resolution: {integrity: sha512-rmp02ct7HYfV8KPVCegNXq9X9x4wh9en8bmyMqCZ9AQkiUTc84FBoJMSjtFlRTmojb9EPolaH8AMgYKDbb5QLw==} + dependencies: + '@chainfile/docker': 0.5.0 + '@chainfile/schema': 0.5.0 + testcontainers: 10.9.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -534,7 +561,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -555,14 +582,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.30) + jest-config: 29.7.0(@types/node@20.14.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -597,7 +624,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 jest-mock: 29.7.0 dev: true @@ -624,7 +651,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.30 + '@types/node': 20.14.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -657,7 +684,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.11.30 + '@types/node': 20.14.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -730,7 +757,7 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.6 + micromatch: 4.0.5 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -745,7 +772,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.14.2 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -861,8 +888,8 @@ packages: - utf-8-validate dev: true - /@swc/core-darwin-arm64@1.5.24: - resolution: {integrity: sha512-M7oLOcC0sw+UTyAuL/9uyB9GeO4ZpaBbH76JSH6g1m0/yg7LYJZGRmplhDmwVSDAR5Fq4Sjoi1CksmmGkgihGA==} + /@swc/core-darwin-arm64@1.5.28: + resolution: {integrity: sha512-sP6g63ybzIdOWNDbn51tyHN8EMt7Mb4RMeHQEsXB7wQfDvzhpWB+AbfK6Gs3Q8fwP/pmWIrWW9csKOc1K2Mmkg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -870,8 +897,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.5.24: - resolution: {integrity: sha512-MfcFjGGYognpSBSos2pYUNYJSmqEhuw5ceGr6qAdME7ddbjGXliza4W6FggsM+JnWwpqa31+e7/R+GetW4WkaQ==} + /@swc/core-darwin-x64@1.5.28: + resolution: {integrity: sha512-Bd/agp/g7QocQG5AuorOzSC78t8OzeN+pCN/QvJj1CvPhvppjJw6e1vAbOR8vO2vvGi2pvtf3polrYQStJtSiA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -879,8 +906,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.5.24: - resolution: {integrity: sha512-amI2pwtcWV3E/m/nf+AQtn1LWDzKLZyjCmWd3ms7QjEueWYrY8cU1Y4Wp7wNNsxIoPOi8zek1Uj2wwFD/pttNQ==} + /@swc/core-linux-arm-gnueabihf@1.5.28: + resolution: {integrity: sha512-Wr3TwPGIveS9/OBWm0r9VAL8wkCR0zQn46J8K01uYCmVhUNK3Muxjs0vQBZaOrGu94mqbj9OXY+gB3W7aDvGdA==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -888,8 +915,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.5.24: - resolution: {integrity: sha512-sTSvmqMmgT1ynH/nP75Pc51s+iT4crZagHBiDOf5cq+kudUYjda9lWMs7xkXB/TUKFHPCRK0HGunl8bkwiIbuw==} + /@swc/core-linux-arm64-gnu@1.5.28: + resolution: {integrity: sha512-8G1ZwVTuLgTAVTMPD+M97eU6WeiRIlGHwKZ5fiJHPBcz1xqIC7jQcEh7XBkobkYoU5OILotls3gzjRt8CMNyDQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -897,8 +924,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.5.24: - resolution: {integrity: sha512-vd2/hfOBGbrX21FxsFdXCUaffjkHvlZkeE2UMRajdXifwv79jqOHIJg3jXG1F3ZrhCghCzirFts4tAZgcG8XWg==} + /@swc/core-linux-arm64-musl@1.5.28: + resolution: {integrity: sha512-0Ajdzb5Fzvz+XUbN5ESeHAz9aHHSYiQcm+vmsDi0TtPHmsalfnqEPZmnK0zPALPJPLQP2dDo4hELeDg3/c3xgA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -906,8 +933,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.5.24: - resolution: {integrity: sha512-Zrdzi7NqzQxm2BvAG5KyOSBEggQ7ayrxh599AqqevJmsUXJ8o2nMiWQOBvgCGp7ye+Biz3pvZn1EnRzAp+TpUg==} + /@swc/core-linux-x64-gnu@1.5.28: + resolution: {integrity: sha512-ueQ9VejnQUM2Pt+vT0IAKoF4vYBWUP6n1KHGdILpoGe3LuafQrqu7RoyQ15C7/AYii7hAeNhTFdf6gLbg8cjFg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -915,8 +942,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.5.24: - resolution: {integrity: sha512-1F8z9NRi52jdZQCGc5sflwYSctL6omxiVmIFVp8TC9nngjQKc00TtX/JC2Eo2HwvgupkFVl5YQJidAck9YtmJw==} + /@swc/core-linux-x64-musl@1.5.28: + resolution: {integrity: sha512-G5th8Mg0az8CbY4GQt9/m5hg2Y0kGIwvQBeVACuLQB6q2Y4txzdiTpjmFqUUhEvvl7Klyx1IHvNhfXs3zpt7PA==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -924,8 +951,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.5.24: - resolution: {integrity: sha512-cKpP7KvS6Xr0jFSTBXY53HZX/YfomK5EMQYpCVDOvfsZeYHN20sQSKXfpVLvA/q2igVt1zzy1XJcOhpJcgiKLg==} + /@swc/core-win32-arm64-msvc@1.5.28: + resolution: {integrity: sha512-JezwCGavZ7CkNXx4yInI4kpb71L0zxzxA9BFlmnsGKEEjVQcKc3hFpmIzfFVs+eotlBUwDNb0+Yo9m6Cb7lllA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -933,8 +960,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.5.24: - resolution: {integrity: sha512-IoPWfi0iwqjZuf7gE223+B97/ZwkKbu7qL5KzGP7g3hJrGSKAvv7eC5Y9r2iKKtLKyv5R/T6Ho0kFR/usi7rHw==} + /@swc/core-win32-ia32-msvc@1.5.28: + resolution: {integrity: sha512-q8tW5J4RkOkl7vYShnWS//VAb2Ngolfm9WOMaF2GRJUr2Y/Xeb/+cNjdsNOqea2BzW049D5vdP7XPmir3/zUZw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -942,8 +969,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.5.24: - resolution: {integrity: sha512-zHgF2k1uVJL8KIW+PnVz1To4a3Cz9THbh2z2lbehaF/gKHugH4c3djBozU4das1v35KOqf5jWIEviBLql2wDLQ==} + /@swc/core-win32-x64-msvc@1.5.28: + resolution: {integrity: sha512-jap6EiB3wG1YE1hyhNr9KLPpH4PGm+5tVMfN0l7fgKtV0ikgpcEN/YF94tru+z5m2HovqYW009+Evq9dcVGmpg==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -951,8 +978,8 @@ packages: dev: true optional: true - /@swc/core@1.5.24: - resolution: {integrity: sha512-Eph9zvO4xvqWZGVzTdtdEJ0Vqf0VIML/o/e4Qd2RLOqtfgnlRi7avmMu5C0oqciJ0tk+hqdUKVUZ4JPoPaiGvQ==} + /@swc/core@1.5.28: + resolution: {integrity: sha512-muCdNIqOTURUgYeyyOLYE3ShL8SZO6dw6bhRm6dCvxWzCZOncPc5fB0kjcPXTML+9KJoHL7ks5xg+vsQK+v6ig==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -962,38 +989,38 @@ packages: optional: true dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.7 + '@swc/types': 0.1.8 optionalDependencies: - '@swc/core-darwin-arm64': 1.5.24 - '@swc/core-darwin-x64': 1.5.24 - '@swc/core-linux-arm-gnueabihf': 1.5.24 - '@swc/core-linux-arm64-gnu': 1.5.24 - '@swc/core-linux-arm64-musl': 1.5.24 - '@swc/core-linux-x64-gnu': 1.5.24 - '@swc/core-linux-x64-musl': 1.5.24 - '@swc/core-win32-arm64-msvc': 1.5.24 - '@swc/core-win32-ia32-msvc': 1.5.24 - '@swc/core-win32-x64-msvc': 1.5.24 + '@swc/core-darwin-arm64': 1.5.28 + '@swc/core-darwin-x64': 1.5.28 + '@swc/core-linux-arm-gnueabihf': 1.5.28 + '@swc/core-linux-arm64-gnu': 1.5.28 + '@swc/core-linux-arm64-musl': 1.5.28 + '@swc/core-linux-x64-gnu': 1.5.28 + '@swc/core-linux-x64-musl': 1.5.28 + '@swc/core-win32-arm64-msvc': 1.5.28 + '@swc/core-win32-ia32-msvc': 1.5.28 + '@swc/core-win32-x64-msvc': 1.5.28 dev: true /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@swc/jest@0.2.36(@swc/core@1.5.24): + /@swc/jest@0.2.36(@swc/core@1.5.28): resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.5.24 + '@swc/core': 1.5.28 '@swc/counter': 0.1.3 jsonc-parser: 3.2.1 dev: true - /@swc/types@0.1.7: - resolution: {integrity: sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==} + /@swc/types@0.1.8: + resolution: {integrity: sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA==} dependencies: '@swc/counter': 0.1.3 dev: true @@ -1030,27 +1057,25 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.2 dev: true /@types/docker-modem@3.0.6: resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.2 '@types/ssh2': 1.15.0 - dev: false /@types/dockerode@3.3.26: resolution: {integrity: sha512-/K+I9bGhRO2SvyIHisGeOsy/ypxnWLz8+Rde9S2tNNEKa3r91e0XMYIEq2D+kb7srm7xrmpAR0CDKfXoZOr4OA==} dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 20.11.30 - dev: false + '@types/node': 20.14.2 /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.2 dev: true /@types/istanbul-lib-coverage@2.0.6: @@ -1081,31 +1106,27 @@ packages: resolution: {integrity: sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==} dependencies: undici-types: 5.26.5 - dev: false - /@types/node@20.11.30: - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + /@types/node@20.14.2: + resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} dependencies: undici-types: 5.26.5 /@types/ssh2-streams@0.1.12: resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} dependencies: - '@types/node': 20.11.30 - dev: false + '@types/node': 20.14.2 /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.2 '@types/ssh2-streams': 0.1.12 - dev: false /@types/ssh2@1.15.0: resolution: {integrity: sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==} dependencies: '@types/node': 18.19.24 - dev: false /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1114,7 +1135,7 @@ packages: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.2 dev: true /@types/yargs-parser@21.0.3: @@ -1127,8 +1148,8 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} + /@typescript-eslint/eslint-plugin@7.13.0(@typescript-eslint/parser@7.13.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1139,23 +1160,23 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/parser': 7.13.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.13.0 + '@typescript-eslint/type-utils': 7.13.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.13.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.13.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} + /@typescript-eslint/parser@7.13.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1164,27 +1185,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/scope-manager': 7.13.0 + '@typescript-eslint/types': 7.13.0 + '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.13.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@7.11.0: - resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} + /@typescript-eslint/scope-manager@7.13.0: + resolution: {integrity: sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/types': 7.13.0 + '@typescript-eslint/visitor-keys': 7.13.0 dev: false - /@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} + /@typescript-eslint/type-utils@7.13.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1193,23 +1214,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.3) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.13.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@7.11.0: - resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} + /@typescript-eslint/types@7.13.0: + resolution: {integrity: sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==} engines: {node: ^18.18.0 || >=20.0.0} dev: false - /@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.3): - resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} + /@typescript-eslint/typescript-estree@7.13.0(typescript@5.4.5): + resolution: {integrity: sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1217,40 +1238,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/visitor-keys': 7.11.0 + '@typescript-eslint/types': 7.13.0 + '@typescript-eslint/visitor-keys': 7.13.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.3) - typescript: 5.4.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} + /@typescript-eslint/utils@7.13.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.11.0 - '@typescript-eslint/types': 7.11.0 - '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.13.0 + '@typescript-eslint/types': 7.13.0 + '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@7.11.0: - resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} + /@typescript-eslint/visitor-keys@7.13.0: + resolution: {integrity: sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/types': 7.13.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1284,6 +1305,17 @@ packages: humanize-ms: 1.2.1 dev: true + /ajv-formats@3.0.1(ajv@8.16.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.16.0 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -1292,6 +1324,15 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + /ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1360,7 +1401,6 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 2.3.8 - dev: false /archiver-utils@3.0.4: resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} @@ -1376,7 +1416,6 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: false /archiver@5.3.2: resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} @@ -1389,7 +1428,6 @@ packages: readdir-glob: 1.1.3 tar-stream: 2.2.0 zip-stream: 4.1.1 - dev: false /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1484,15 +1522,12 @@ packages: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 - dev: false /async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} - dev: false /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} @@ -1503,7 +1538,6 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - dev: false /babel-jest@29.7.0(@babel/core@7.24.0): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -1583,7 +1617,6 @@ packages: /bare-events@2.2.1: resolution: {integrity: sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==} requiresBuild: true - dev: false optional: true /bare-fs@2.2.2: @@ -1594,13 +1627,11 @@ packages: bare-os: 2.2.1 bare-path: 2.1.0 streamx: 2.16.1 - dev: false optional: true /bare-os@2.2.1: resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} requiresBuild: true - dev: false optional: true /bare-path@2.1.0: @@ -1608,7 +1639,6 @@ packages: requiresBuild: true dependencies: bare-os: 2.2.1 - dev: false optional: true /base-x@3.0.9: @@ -1624,7 +1654,6 @@ packages: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 - dev: false /bigint-buffer@1.1.5: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} @@ -1646,7 +1675,6 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false /bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} @@ -1670,7 +1698,13 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true /braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1703,7 +1737,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1714,7 +1747,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1735,13 +1767,11 @@ packages: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} requiresBuild: true - dev: false optional: true /byline@5.0.0: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} engines: {node: '>=0.10.0'} - dev: false /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -1800,7 +1830,6 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} @@ -1884,7 +1913,6 @@ packages: crc32-stream: 4.0.3 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: false /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1895,7 +1923,6 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false /cpu-features@0.0.9: resolution: {integrity: sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==} @@ -1904,14 +1931,12 @@ packages: dependencies: buildcheck: 0.0.6 nan: 2.19.0 - dev: false optional: true /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} hasBin: true - dev: false /crc32-stream@4.0.3: resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} @@ -1919,9 +1944,8 @@ packages: dependencies: crc-32: 1.2.2 readable-stream: 3.6.2 - dev: false - /create-jest@29.7.0(@types/node@20.11.30): + /create-jest@29.7.0(@types/node@20.14.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -1930,7 +1954,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.30) + jest-config: 29.7.0(@types/node@20.14.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2068,8 +2092,7 @@ packages: resolution: {integrity: sha512-CdHl9n0S4+bl4i6MaxDQHNjqB1FdvuDirrDTzPKmdiMpheQqCjgsny0GZ2VhvN7qHTY0833lRlKWZgrkn1i6cg==} engines: {node: '>= 6.0.0'} dependencies: - yaml: 2.4.2 - dev: false + yaml: 2.4.1 /docker-modem@3.0.8: resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} @@ -2081,7 +2104,6 @@ packages: ssh2: 1.15.0 transitivePeerDependencies: - supports-color - dev: false /dockerode@3.3.5: resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} @@ -2092,7 +2114,6 @@ packages: tar-fs: 2.0.1 transitivePeerDependencies: - supports-color - dev: false /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -2128,7 +2149,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: false /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2330,7 +2350,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.13.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -2351,7 +2371,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 7.13.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -2359,7 +2379,7 @@ packages: - supports-color dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.13.0)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -2369,7 +2389,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 7.13.0(eslint@8.57.0)(typescript@5.4.5) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 array.prototype.flat: 1.3.2 @@ -2378,7 +2398,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.13.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -2581,7 +2601,6 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: false /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -2591,7 +2610,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: false /fast-json-stable-stringify@2.1.0: @@ -2625,6 +2644,13 @@ packages: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: true + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + /fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2665,7 +2691,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2729,7 +2754,6 @@ packages: /get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} - dev: false /get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} @@ -2793,8 +2817,8 @@ packages: dependencies: type-fest: 0.20.2 - /globals@15.3.0: - resolution: {integrity: sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==} + /globals@15.4.0: + resolution: {integrity: sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==} engines: {node: '>=18'} dev: false @@ -3114,7 +3138,6 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3229,7 +3252,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -3250,7 +3273,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.11.30): + /jest-cli@29.7.0(@types/node@20.14.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3264,10 +3287,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.30) + create-jest: 29.7.0(@types/node@20.14.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.30) + jest-config: 29.7.0(@types/node@20.14.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3278,7 +3301,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.11.30): + /jest-config@29.7.0(@types/node@20.14.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3293,7 +3316,7 @@ packages: '@babel/core': 7.24.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 babel-jest: 29.7.0(@babel/core@7.24.0) chalk: 4.1.2 ci-info: 3.9.0 @@ -3308,7 +3331,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.6 + micromatch: 4.0.5 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -3353,7 +3376,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -3369,14 +3392,14 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.30 + '@types/node': 20.14.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.6 + micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -3409,7 +3432,7 @@ packages: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.6 + micromatch: 4.0.5 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -3420,7 +3443,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 jest-util: 29.7.0 dev: true @@ -3475,7 +3498,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -3506,7 +3529,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -3558,7 +3581,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -3583,7 +3606,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.14.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -3595,13 +3618,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.11.30): + /jest@29.7.0(@types/node@20.14.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3614,7 +3637,7 @@ packages: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.30) + jest-cli: 29.7.0(@types/node@20.14.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -3656,6 +3679,10 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3700,7 +3727,6 @@ packages: engines: {node: '>= 0.6.3'} dependencies: readable-stream: 2.3.8 - dev: false /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -3714,8 +3740,8 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + /lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} dev: true @@ -3732,12 +3758,12 @@ packages: commander: 12.1.0 debug: 4.3.4 execa: 8.0.1 - lilconfig: 3.1.1 + lilconfig: 3.1.2 listr2: 8.2.1 micromatch: 4.0.7 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.4.2 + yaml: 2.4.5 transitivePeerDependencies: - supports-color dev: true @@ -3769,26 +3795,25 @@ packages: /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false /lodash.difference@4.5.0: resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: false /lodash.flatten@4.4.0: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: false /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} /lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} @@ -3839,15 +3864,8 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.3 + braces: 3.0.2 picomatch: 2.3.1 - - /micromatch@4.0.6: - resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 4.0.2 dev: true /micromatch@4.0.7: @@ -3856,7 +3874,6 @@ packages: dependencies: braces: 3.0.3 picomatch: 2.3.1 - dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -3878,7 +3895,6 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: false /minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} @@ -3893,13 +3909,11 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: false /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -3910,7 +3924,6 @@ packages: /nan@2.19.0: resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} requiresBuild: true - dev: false optional: true /natural-compare@1.4.0: @@ -4116,11 +4129,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: true - /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -4148,7 +4156,7 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier-plugin-packagejson@2.5.0(prettier@3.2.5): + /prettier-plugin-packagejson@2.5.0(prettier@3.3.2): resolution: {integrity: sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg==} peerDependencies: prettier: '>= 1.16.0' @@ -4156,13 +4164,13 @@ packages: prettier: optional: true dependencies: - prettier: 3.2.5 + prettier: 3.3.2 sort-package-json: 2.10.0 synckit: 0.9.0 dev: false - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} hasBin: true @@ -4177,7 +4185,6 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -4193,21 +4200,18 @@ packages: graceful-fs: 4.2.11 retry: 0.12.0 signal-exit: 3.0.7 - dev: false /properties-reader@2.3.0: resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} engines: {node: '>=14'} dependencies: mkdirp: 1.0.4 - dev: false /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -4223,7 +4227,6 @@ packages: /queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} requiresBuild: true - dev: false /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -4239,7 +4242,6 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: false /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -4248,13 +4250,11 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: minimatch: 5.1.6 - dev: false /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -4275,6 +4275,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -4315,7 +4320,6 @@ packages: /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - dev: false /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -4359,7 +4363,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -4375,7 +4378,6 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4499,7 +4501,6 @@ packages: /split-ca@1.0.1: resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} - dev: false /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -4510,7 +4511,6 @@ packages: dependencies: '@types/ssh2': 0.5.52 ssh2: 1.15.0 - dev: false /ssh2@1.15.0: resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} @@ -4522,7 +4522,6 @@ packages: optionalDependencies: cpu-features: 0.0.9 nan: 2.19.0 - dev: false /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} @@ -4538,7 +4537,6 @@ packages: queue-tick: 1.0.1 optionalDependencies: bare-events: 2.2.1 - dev: false /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -4601,13 +4599,11 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: false /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -4689,7 +4685,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: false /tar-fs@3.0.5: resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} @@ -4699,7 +4694,6 @@ packages: optionalDependencies: bare-fs: 2.2.2 bare-path: 2.1.0 - dev: false /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -4710,7 +4704,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -4718,7 +4711,6 @@ packages: b4a: 1.6.6 fast-fifo: 1.3.2 streamx: 2.16.1 - dev: false /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -4750,7 +4742,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false /text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} @@ -4766,7 +4757,6 @@ packages: /tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} - dev: false /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -4786,13 +4776,13 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /ts-api-utils@1.3.0(typescript@5.4.3): + /ts-api-utils@1.3.0(typescript@5.4.5): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.3 + typescript: 5.4.5 dev: false /tsconfig-paths@3.15.0: @@ -4808,69 +4798,68 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false - /turbo-darwin-64@1.13.3: - resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==} + /turbo-darwin-64@2.0.3: + resolution: {integrity: sha512-v7ztJ8sxdHw3SLfO2MhGFeeU4LQhFii1hIGs9uBiXns/0YTGOvxLeifnfGqhfSrAIIhrCoByXO7nR9wlm10n3Q==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.13.3: - resolution: {integrity: sha512-/np2xD+f/+9qY8BVtuOQXRq5f9LehCFxamiQnwdqWm5iZmdjygC5T3uVSYuagVFsZKMvX3ycySwh8dylGTl6lg==} + /turbo-darwin-arm64@2.0.3: + resolution: {integrity: sha512-LUcqvkV9Bxtng6QHbevp8IK8zzwbIxM6HMjCE7FEW6yJBN1KwvTtRtsGBwwmTxaaLO0wD1Jgl3vgkXAmQ4fqUw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.13.3: - resolution: {integrity: sha512-G+HGrau54iAnbXLfl+N/PynqpDwi/uDzb6iM9hXEDG+yJnSJxaHMShhOkXYJPk9offm9prH33Khx2scXrYVW1g==} + /turbo-linux-64@2.0.3: + resolution: {integrity: sha512-xpdY1suXoEbsQsu0kPep2zrB8ijv/S5aKKrntGuQ62hCiwDFoDcA/Z7FZ8IHQ2u+dpJARa7yfiByHmizFE0r5Q==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.13.3: - resolution: {integrity: sha512-qWwEl5VR02NqRyl68/3pwp3c/olZuSp+vwlwrunuoNTm6JXGLG5pTeme4zoHNnk0qn4cCX7DFrOboArlYxv0wQ==} + /turbo-linux-arm64@2.0.3: + resolution: {integrity: sha512-MBACTcSR874L1FtLL7gkgbI4yYJWBUCqeBN/iE29D+8EFe0d3fAyviFlbQP4K/HaDYet1i26xkkOiWr0z7/V9A==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.13.3: - resolution: {integrity: sha512-Nudr4bRChfJzBPzEmpVV85VwUYRCGKecwkBFpbp2a4NtrJ3+UP1VZES653ckqCu2FRyRuS0n03v9euMbAvzH+Q==} + /turbo-windows-64@2.0.3: + resolution: {integrity: sha512-zi3YuKPkM9JxMTshZo3excPk37hUrj5WfnCqh4FjI26ux6j/LJK+Dh3SebMHd9mR7wP9CMam4GhmLCT+gDfM+w==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.13.3: - resolution: {integrity: sha512-ouJCgsVLd3icjRLmRvHQDDZnmGzT64GBupM1Y+TjtYn2LVaEBoV6hicFy8x5DUpnqdLy+YpCzRMkWlwhmkX7sQ==} + /turbo-windows-arm64@2.0.3: + resolution: {integrity: sha512-wmed4kkenLvRbidi7gISB4PU77ujBuZfgVGDZ4DXTFslE/kYpINulwzkVwJIvNXsJtHqyOq0n6jL8Zwl3BrwDg==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.13.3: - resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==} + /turbo@2.0.3: + resolution: {integrity: sha512-jF1K0tTUyryEWmgqk1V0ALbSz3VdeZ8FXUo6B64WsPksCMCE48N5jUezGOH2MN0+epdaRMH8/WcPU0QQaVfeLA==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.13.3 - turbo-darwin-arm64: 1.13.3 - turbo-linux-64: 1.13.3 - turbo-linux-arm64: 1.13.3 - turbo-windows-64: 1.13.3 - turbo-windows-arm64: 1.13.3 + turbo-darwin-64: 2.0.3 + turbo-darwin-arm64: 2.0.3 + turbo-linux-64: 2.0.3 + turbo-linux-arm64: 2.0.3 + turbo-windows-64: 2.0.3 + turbo-windows-arm64: 2.0.3 dev: true /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: false /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -4941,8 +4930,8 @@ packages: possible-typed-array-names: 1.0.0 dev: false - /typescript-eslint@7.11.0(eslint@8.57.0)(typescript@5.4.3): - resolution: {integrity: sha512-ZKe3yHF/IS/kCUE4CGE3UgtK+Q7yRk1e9kwEI0rqm9XxMTd9P1eHe0LVVtrZ3oFuIQ2unJ9Xn0vTsLApzJ3aPw==} + /typescript-eslint@7.13.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-upO0AXxyBwJ4BbiC6CRgAJKtGYha2zw4m1g7TIVPSonwYEuf7vCicw3syjS1OxdDMTz96sZIXl3Jx3vWJLLKFw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4951,17 +4940,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/eslint-plugin': 7.13.0(@typescript-eslint/parser@7.13.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.13.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.13.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 - typescript: 5.4.3 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true @@ -5003,7 +4992,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} @@ -5136,11 +5124,17 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} engines: {node: '>= 14'} hasBin: true + /yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + dev: true + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -5170,4 +5164,3 @@ packages: archiver-utils: 3.0.4 compress-commons: 4.1.2 readable-stream: 3.6.2 - dev: false diff --git a/packages/solana-testcontainers/tsconfig.json b/tsconfig.json similarity index 100% rename from packages/solana-testcontainers/tsconfig.json rename to tsconfig.json diff --git a/turbo.json b/turbo.json index 9740894..ddf457a 100644 --- a/turbo.json +++ b/turbo.json @@ -1,25 +1,28 @@ { "$schema": "https://turbo.build/schema.json", - "pipeline": { + "globalDependencies": ["tsconfig.json"], + "tasks": { "clean": { "cache": false }, "build": { - "inputs": ["tsconfig.json", "tsconfig.build.json", "./**/*.ts", "./**/*.json"], - "outputs": ["./**/*.js", "./**/*.d.ts", "./**/*.d.ts.map"], + "inputs": ["src/**"], + "outputs": ["dist/**"], "dependsOn": ["^build"] }, "build:docker": { - "inputs": ["Dockerfile", "tsconfig.json", "tsconfig.build.json", "./**/*.ts"], - "outputs": [], - "dependsOn": [] + "cache": false }, "push:docker": { "cache": false }, "test": { - "inputs": ["tsconfig.json", "./**/*.ts", "./**/*.test.ts"], - "dependsOn": ["^build"] + "dependsOn": ["solana-docker#build:docker", "^build"] + }, + "solana-testcontainers#build": { + "inputs": ["src/**"], + "outputs": ["dist/**"], + "dependsOn": ["solana-docker#build:docker", "^build"] }, "lint": { "outputs": [] diff --git a/workspace/eslint-config/package.json b/workspace/eslint-config/package.json index df185e3..e219b1f 100644 --- a/workspace/eslint-config/package.json +++ b/workspace/eslint-config/package.json @@ -9,7 +9,7 @@ "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-simple-import-sort": "^12.1.0", "eslint-plugin-unused-imports": "^4.0.0", - "globals": "^15.3.0", - "typescript-eslint": "^7.11.0" + "globals": "^15.4.0", + "typescript-eslint": "^7.13.0" } } diff --git a/workspace/tsconfig/tsconfig.json b/workspace/tsconfig/tsconfig.json index f7949d2..4e451c8 100644 --- a/workspace/tsconfig/tsconfig.json +++ b/workspace/tsconfig/tsconfig.json @@ -19,6 +19,7 @@ "preserveWatchOutput": true, "skipLibCheck": true, "strict": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "types": ["node"] } }