diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6a6..0000000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index f05ab78d1d..0000000000 --- a/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": ["crisp", "enclave-example", "crisp-client", "enclave-docs", "enclave-client"] -} diff --git a/.github/workflows/binary-releases.yml b/.github/workflows/binary-releases.yml deleted file mode 100644 index 498563f7e2..0000000000 --- a/.github/workflows/binary-releases.yml +++ /dev/null @@ -1,151 +0,0 @@ -name: Binary Releases - -on: - push: - tags: - - 'v*' - workflow_dispatch: - inputs: - tag: - description: 'Tag to release' - required: true - default: 'v0.1.0' - prerelease: - description: 'Mark as pre-release' - required: false - default: false - type: boolean - repository_dispatch: - types: [binary-release] - -permissions: - contents: write - -jobs: - build: - name: Build binaries - runs-on: ${{ matrix.os }} - strategy: - matrix: - include: - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu - os_name: linux - arch: x86_64 - - os: macos-latest - target: aarch64-apple-darwin - os_name: macos - arch: aarch64 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Add Rust targets - run: | - rustup target add ${{ matrix.target }} - - - name: Build enclave - run: cargo build --locked --release --target ${{ matrix.target }} --bin enclave - - - name: Build enclaveup - run: cargo build --locked --release --target ${{ matrix.target }} --bin enclaveup - - - name: Create release archives - run: | - mkdir -p dist - - # Get the correct binary extension - if [[ "${{ matrix.target }}" == *"windows"* ]]; then - EXT=".exe" - else - EXT="" - fi - - # Create enclave archive - cp "target/${{ matrix.target }}/release/enclave${EXT}" "./enclave${EXT}" - tar -czf "dist/enclave-${{ matrix.os_name }}-${{ matrix.arch }}.tar.gz" "enclave${EXT}" - rm "enclave${EXT}" - - # Create enclaveup archive - cp "target/${{ matrix.target }}/release/enclaveup${EXT}" "./enclaveup${EXT}" - tar -czf "dist/enclaveup-${{ matrix.os_name }}-${{ matrix.arch }}.tar.gz" "enclaveup${EXT}" - rm "enclaveup${EXT}" - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: enclave-binaries-${{ matrix.os_name }}-${{ matrix.arch }}-${{ github.run_number }} - path: dist/ - - release: - name: Create Release - runs-on: ubuntu-latest - needs: build - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: dist/ - - - name: Flatten artifacts - run: | - mkdir -p release-assets - find dist/ -name "*.tar.gz" -exec cp {} release-assets/ \; - ls -la release-assets/ - - - name: Get tag name and prerelease status - id: get_tag - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT - echo "prerelease=${{ github.event.inputs.prerelease }}" >> $GITHUB_OUTPUT - elif [ "${{ github.event_name }}" = "repository_dispatch" ]; then - VERSION="${{ github.event.client_payload.version }}" - echo "tag=v${VERSION}" >> $GITHUB_OUTPUT - echo "prerelease=false" >> $GITHUB_OUTPUT - else - TAG="${GITHUB_REF#refs/tags/}" - echo "tag=${TAG}" >> $GITHUB_OUTPUT - # Auto-detect prerelease based on tag name - if [[ "${TAG}" =~ (test|alpha|beta|rc|dev) ]]; then - echo "prerelease=true" >> $GITHUB_OUTPUT - else - echo "prerelease=false" >> $GITHUB_OUTPUT - fi - fi - - - name: Create Release - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ steps.get_tag.outputs.tag }} - name: Release ${{ steps.get_tag.outputs.tag }} - draft: false - prerelease: ${{ steps.get_tag.outputs.prerelease }} - files: release-assets/* - body: | - ## Installation - - ### Install enclaveup (the installer) - ```bash - curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash - ``` - - ### Use enclaveup to install enclave - ```bash - enclaveup install - ``` - - ## Assets - - `enclave-*`: The main Enclave CLI binary - - `enclaveup-*`: The installer binary - - Supported platforms: - - Linux (x86_64) - - macOS (x86_64, aarch64 Apple Silicon) \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49a58c88bf..0743ef0a4d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -602,7 +602,7 @@ jobs: chmod 755 contracts tests chmod 644 contracts/ImageID.sol pnpm test:integration - + test_enclave_init: runs-on: ubuntu-latest needs: [build_enclave_cli, build_e3_support_dev] diff --git a/.github/workflows/publish-evm.yml b/.github/workflows/publish-evm.yml deleted file mode 100644 index 06f0c8aebd..0000000000 --- a/.github/workflows/publish-evm.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: EVM Version release -on: - release: - types: [created] -env: - MNEMONIC: "test test test test test test test test test test test junk" - INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" - ETHERSCAN_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" -jobs: - publish-npm: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 - with: - node-version: 22 - registry-url: "https://registry.npmjs.org/" - - name: pnpm-setup - uses: pnpm/action-setup@v4 - - run: pnpm install - - run: pnpm config:release - env: - NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - - run: pnpm evm:release - env: - NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - - run: pnpm wasm:release - env: - NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - - run: pnpm sdk:release - env: - NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} - - run: pnpm react:release - env: - NODE_AUTH_TOKEN: ${{secrets.PUBLISH_NPM_TOKEN}} diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 0dc6353ebc..836eec75fd 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -1,116 +1,391 @@ -name: Releases Workflow +name: Release permissions: - pull-requests: write contents: write + packages: write on: push: - branches: [main] - paths: - - "Cargo.toml" - - "package.json" - - "crates/**" - - "packages/**" - - ".github/workflows/releases.yml" - pull_request: - branches: [main] + tags: + - 'v*.*.*' + - 'v*.*.*-*' # Pre-release tags like v1.0.0-beta.1 + +env: + MNEMONIC: "test test test test test test test test test test test junk" + INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" + ETHERSCAN_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" jobs: - release-rust: - name: Release Rust Crates + validate-and-prepare: + name: Validate Tag and Prepare Release runs-on: ubuntu-latest - # Add concurrency control to prevent conflicts with other workflows - concurrency: - group: release-rust-${{ github.ref }} - cancel-in-progress: false outputs: - releases_created: ${{ steps.release-plz.outputs.releases_created }} - version: ${{ steps.release-plz.outputs.version }} + version: ${{ steps.get_version.outputs.version }} + is_prerelease: ${{ steps.get_version.outputs.is_prerelease }} steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Install Rust toolchain + - name: Get version from tag + id: get_version + run: | + # Extract version from tag (remove 'v' prefix) + VERSION=${GITHUB_REF_NAME#v} + + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Check if it's a pre-release (contains -, like beta, alpha, rc, etc.) + if [[ "$VERSION" =~ - ]]; then + echo "is_prerelease=true" >> $GITHUB_OUTPUT + echo "šŸ“¦ Pre-release version: $VERSION" + else + echo "is_prerelease=false" >> $GITHUB_OUTPUT + echo "šŸ“¦ Release version: $VERSION" + fi + + - name: Verify versions match + run: | + VERSION=${{ steps.get_version.outputs.version }} + + # Check Cargo.toml workspace version + CARGO_VERSION=$(grep -E '^\[workspace\.package\]' -A 5 Cargo.toml | grep '^version' | head -1 | sed 's/.*"\(.*\)".*/\1/') + if [ "$CARGO_VERSION" != "$VERSION" ]; then + echo "āŒ Cargo.toml version ($CARGO_VERSION) doesn't match tag ($VERSION)" + exit 1 + fi + + # Check root package.json if it exists + if [ -f package.json ]; then + NPM_VERSION=$(node -p "require('./package.json').version") + if [ "$NPM_VERSION" != "$VERSION" ]; then + echo "āŒ package.json version ($NPM_VERSION) doesn't match tag ($VERSION)" + exit 1 + fi + fi + + echo "āœ… All versions match: $VERSION" + + build-binaries: + name: Build Binaries (${{ matrix.os_name }}-${{ matrix.arch }}) + runs-on: ${{ matrix.os }} + needs: validate-and-prepare + strategy: + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + os_name: linux + arch: x86_64 + - os: macos-latest + target: aarch64-apple-darwin + os_name: macos + arch: aarch64 + - os: macos-latest + target: x86_64-apple-darwin + os_name: macos + arch: x86_64 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} - - name: Run release-plz - id: release-plz - uses: MarcoIeni/release-plz-action@v0.5.64 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@v2 with: - version: "0.3.83" - command: ${{ github.event_name == 'pull_request' && 'release-pr --dry-run' || 'release-pr' }} + key: ${{ matrix.target }} - - uses: fregante/setup-git-user@v2.0.1 - if: steps.release-plz.outputs.prs_created == 'true' + - name: Build enclave binary + run: cargo build --locked --release --target ${{ matrix.target }} --bin enclave - - name: Install dprint - if: steps.release-plz.outputs.prs_created == 'true' - run: curl -fsSL https://dprint.dev/install.sh | sh -s 0.47.2 > /dev/null 2>&1 + - name: Build enclaveup binary + run: cargo build --locked --release --target ${{ matrix.target }} --bin enclaveup - - name: Format Rust code - if: steps.release-plz.outputs.prs_created == 'true' + - name: Create release archives + shell: bash run: | - pr_branch="${{ fromJSON(steps.release-plz.outputs.pr).head_branch }}" - git pull - git checkout "$pr_branch" - $HOME/.dprint/bin/dprint fmt - git commit -am 'chore: format files' - git push origin "$pr_branch" - - release-npm: - name: Release NPM Packages + mkdir -p dist + + # Get the correct binary extension + if [[ "${{ matrix.target }}" == *"windows"* ]]; then + EXT=".exe" + else + EXT="" + fi + + # Create enclave archive + cp "target/${{ matrix.target }}/release/enclave${EXT}" "./enclave${EXT}" + tar -czf "dist/enclave-${{ matrix.os_name }}-${{ matrix.arch }}.tar.gz" "enclave${EXT}" + rm "enclave${EXT}" + + # Create enclaveup archive + cp "target/${{ matrix.target }}/release/enclaveup${EXT}" "./enclaveup${EXT}" + tar -czf "dist/enclaveup-${{ matrix.os_name }}-${{ matrix.arch }}.tar.gz" "enclaveup${EXT}" + rm "enclaveup${EXT}" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: enclave-binaries-${{ matrix.os_name }}-${{ matrix.arch }} + path: dist/ + + publish-rust-crates: + name: Publish Rust Crates runs-on: ubuntu-latest - needs: release-rust - if: github.event_name == 'push' + needs: validate-and-prepare + # Publish ALL versions to crates.io (including pre-releases) steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@v2 + + - name: Publish to crates.io + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: | + VERSION="${{ needs.validate-and-prepare.outputs.version }}" + IS_PRERELEASE="${{ needs.validate-and-prepare.outputs.is_prerelease }}" + + if [[ "$IS_PRERELEASE" == "true" ]]; then + echo "šŸ“¦ Publishing pre-release version to crates.io: $VERSION" + else + echo "šŸ“¦ Publishing stable version to crates.io: $VERSION" + fi + + # Publish crates in dependency order + # Adjust this order based on your actual crate dependencies + + # Example order (modify based on your project): + # cargo publish -p enclave-core --no-verify || echo "enclave-core: already published or error" + # sleep 10 # Wait for crates.io to index + # cargo publish -p enclave-crypto --no-verify || echo "enclave-crypto: already published or error" + # sleep 10 + # cargo publish -p enclave-sdk --no-verify || echo "enclave-sdk: already published or error" + # sleep 10 + # cargo publish -p enclave --no-verify || echo "enclave: already published or error" + + echo "āš ļø Note: Add your crates in dependency order in the workflow file" + echo "Skipping actual publish for now - uncomment the cargo publish commands above" + + publish-npm-packages: + name: Publish NPM Packages + runs-on: ubuntu-latest + needs: validate-and-prepare + steps: + - name: Checkout code + uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "20" - registry-url: "https://registry.npmjs.org" + node-version: '22' + registry-url: 'https://registry.npmjs.org' - name: Setup pnpm - uses: pnpm/action-setup@v2 - with: - version: 10.7.1 + uses: pnpm/action-setup@v4 - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Build packages - run: pnpm build + - name: Install wasm-pack + uses: ./.github/actions/install-wasm-pack - - name: Create Release PR or Publish - uses: changesets/action@v1 - with: - publish: pnpm release + - name: Determine npm tag + id: npm_tag + run: | + if [[ "${{ needs.validate-and-prepare.outputs.is_prerelease }}" == "true" ]]; then + echo "tag=next" >> $GITHUB_OUTPUT + echo "šŸ“¦ Publishing with 'next' tag for pre-release" + else + echo "tag=latest" >> $GITHUB_OUTPUT + echo "šŸ“¦ Publishing with 'latest' tag for stable release" + fi + + - name: Publish to npm env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + # Configure npm authentication + npm config set //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN + + # Get the tag to use + TAG="${{ steps.npm_tag.outputs.tag }}" + + # Build first + pnpm build:ts + + # Publish each package explicitly with the correct tag + pnpm --filter @enclave-e3/config publish --access public --tag $TAG --no-git-checks + pnpm --filter @enclave-e3/contracts publish --access public --tag $TAG --no-git-checks + pnpm --filter @enclave-e3/wasm publish --access public --tag $TAG --no-git-checks + pnpm --filter @enclave-e3/sdk publish --access public --tag $TAG --no-git-checks + pnpm --filter @enclave-e3/react publish --access public --tag $TAG --no-git-checks - trigger-binary-release: - name: Trigger Binary Release + create-github-release: + name: Create GitHub Release runs-on: ubuntu-latest - needs: [release-rust, release-npm] - if: github.event_name == 'push' && needs.release-rust.outputs.releases_created == 'true' + needs: [validate-and-prepare, build-binaries, publish-rust-crates, publish-npm-packages] + if: always() && needs.validate-and-prepare.result == 'success' && needs.build-binaries.result == 'success' steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 - - name: Trigger binary release workflow - uses: peter-evans/repository-dispatch@v3 + - name: Download all binary artifacts + uses: actions/download-artifact@v4 with: - token: ${{ secrets.GITHUB_TOKEN }} - event-type: binary-release - client-payload: | - { - "version": "${{ needs.release-rust.outputs.version }}" - } + path: dist/ + + - name: Prepare release assets + run: | + mkdir -p release-assets + find dist/ -name "*.tar.gz" -exec cp {} release-assets/ \; + ls -la release-assets/ + + - name: Generate Release Notes + id: release_notes + run: | + VERSION=${{ needs.validate-and-prepare.outputs.version }} + IS_PRERELEASE=${{ needs.validate-and-prepare.outputs.is_prerelease }} + + # Create release notes + cat > release_notes.md << EOF + ## šŸš€ Release v${VERSION} + + EOF + + # Add pre-release warning if applicable + if [[ "${IS_PRERELEASE}" == "true" ]]; then + cat >> release_notes.md << EOF + > āš ļø **This is a pre-release version** + > Pre-release versions may contain bugs and breaking changes. + + EOF + fi + + # Extract changelog section for this version if CHANGELOG.md exists + if [ -f CHANGELOG.md ]; then + echo "### What's Changed" >> release_notes.md + echo "" >> release_notes.md + + # Try to extract the section for this version + # Fixed regex to handle both stable and pre-release versions + awk -v ver="${VERSION}" ' + /^#+ \[?'"${VERSION//./\\.}"'\]?/ { flag=1; next } + /^#+ \[?[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?/ && flag { exit } + flag { print } + ' CHANGELOG.md >> release_notes.md || echo "See CHANGELOG.md for details." >> release_notes.md + fi + + # Add installation instructions + cat >> release_notes.md << EOF + + --- + + ## šŸ“¦ Installation + + ### Install via enclaveup (Recommended) + + Install the installer: + \`\`\`bash + curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash + \`\`\` + + Then use it to install enclave: + \`\`\`bash + enclaveup install + \`\`\` + + ### NPM Packages + + EOF + + if [[ "${IS_PRERELEASE}" == "true" ]]; then + cat >> release_notes.md << EOF + \`\`\`bash + # Install pre-release versions + npm install @enclave/sdk@next + npm install @enclave/contracts@next + npm install @enclave/config@next + npm install @enclave/react@next + \`\`\` + EOF + else + cat >> release_notes.md << EOF + \`\`\`bash + # Install stable versions + npm install @enclave/sdk@latest + npm install @enclave/contracts@latest + npm install @enclave/config@latest + npm install @enclave/react@latest + \`\`\` + EOF + fi + + # Add Rust crates section only for stable releases + if [[ "${IS_PRERELEASE}" == "false" ]]; then + cat >> release_notes.md << EOF + + ### Rust Crates + + \`\`\`toml + [dependencies] + enclave = "${VERSION}" + \`\`\` + EOF + fi + + # Add binary assets information + cat >> release_notes.md << EOF + + ## šŸ’¾ Binary Assets + + - \`enclave-*\`: The main Enclave CLI binary + - \`enclaveup-*\`: The installer/version manager binary + + ### Supported Platforms + - Linux (x86_64) + - macOS (x86_64, aarch64 Apple Silicon) + + ## šŸ“ Checksums + + \`\`\` + EOF + + # Generate checksums for the binaries + cd release-assets && sha256sum *.tar.gz >> ../release_notes.md || true + cd .. + + echo '```' >> release_notes.md + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: v${{ needs.validate-and-prepare.outputs.version }} + name: v${{ needs.validate-and-prepare.outputs.version }} + body_path: release_notes.md + draft: false + prerelease: ${{ needs.validate-and-prepare.outputs.is_prerelease }} + generate_release_notes: false # We're providing our own + files: release-assets/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Update stable tag (for stable releases only) + if: needs.validate-and-prepare.outputs.is_prerelease == 'false' + run: | + git tag -f stable + git push origin stable --force + echo "āœ… Updated 'stable' tag to point to v${{ needs.validate-and-prepare.outputs.version }}" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..775ac32639 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +## [0.0.14-test](https://github.com/gnosisguild/enclave/compare/v0.1.2...v0.0.14-test) (2025-10-01) + + +### Bug Fixes + +* contracts exports ([#732](https://github.com/gnosisguild/enclave/issues/732)) ([c0686c6](https://github.com/gnosisguild/enclave/commit/c0686c6b42b351c07adf400c47d8cc5b2573f8e6)) +* ensure we don't have uncommited files ([#676](https://github.com/gnosisguild/enclave/issues/676)) ([a46e707](https://github.com/gnosisguild/enclave/commit/a46e70795655b8ff3a9896651f09f5ccee2592c7)) +* ensure we update the cargo crates too ([94f5231](https://github.com/gnosisguild/enclave/commit/94f52319cd2f3c06ad1b0428c58ff95e0ae40c63)) +* fix reentrancy issue in enclave contracts ([#752](https://github.com/gnosisguild/enclave/issues/752)) ([3806a87](https://github.com/gnosisguild/enclave/commit/3806a870b39fa47a1b4b77f9484c0a1d74bfbaa4)) +* release rust crates error ([#689](https://github.com/gnosisguild/enclave/issues/689)) ([3c25929](https://github.com/gnosisguild/enclave/commit/3c25929f2317003c81d3a21d6b4fc9b1e44573cc)) +* remove already published files from gitignore ([#680](https://github.com/gnosisguild/enclave/issues/680)) ([283205d](https://github.com/gnosisguild/enclave/commit/283205dffc665d83cc741c07f697c1ecaf2d1d84)) +* remove ci artifacts deep clean ([#681](https://github.com/gnosisguild/enclave/issues/681)) ([242aac9](https://github.com/gnosisguild/enclave/commit/242aac96b9800043b0d24b5716b3262baefd4472)) +* remove dprint in favour of cargo fmt ([412fa9b](https://github.com/gnosisguild/enclave/commit/412fa9be525672449394e41a216666a56a7821a1)) +* rust crate release error ([#694](https://github.com/gnosisguild/enclave/issues/694)) ([56e9b12](https://github.com/gnosisguild/enclave/commit/56e9b12c2b319d1ea1081df4577b6b0cd0ccfc7d)) +* rust crates release workflow ([#715](https://github.com/gnosisguild/enclave/issues/715)) ([fc330c6](https://github.com/gnosisguild/enclave/commit/fc330c625742bce01def98ef3ccec5ae15fbdb96)) +* update relative paths to use git ([#708](https://github.com/gnosisguild/enclave/issues/708)) ([e0bd2bc](https://github.com/gnosisguild/enclave/commit/e0bd2bc7a5e2515013188fc7e40927630d1f6d58)) +* wasm init ([#740](https://github.com/gnosisguild/enclave/issues/740)) ([58f7905](https://github.com/gnosisguild/enclave/commit/58f7905dd5bd33070be84b0bd5d88b5f44d98267)) + + +### Features + +* add a function to get an e3 public key ([#760](https://github.com/gnosisguild/enclave/issues/760)) ([4db5dac](https://github.com/gnosisguild/enclave/commit/4db5dacf2f60872cfbafa16728b3da4f9244c248)) +* add changelog feature to bump script ([319ef67](https://github.com/gnosisguild/enclave/commit/319ef6795e4846a89d04f526d24a2c15bd37915d)) +* add script to bump versions and bump to 0.0.15-test ([aada549](https://github.com/gnosisguild/enclave/commit/aada549f45ef35803a3dbde46c574787db7c5215)) +* optimization by concatenating coefficients ([#734](https://github.com/gnosisguild/enclave/issues/734)) ([00e2f6d](https://github.com/gnosisguild/enclave/commit/00e2f6d5eaaf2089488f414dc57675f7120cf2a0)) +* unify releases ([820ea9d](https://github.com/gnosisguild/enclave/commit/820ea9d35a25286610a1e71a6a5d7d3b15079679)) +* update bump script to also push to git ([49a35f7](https://github.com/gnosisguild/enclave/commit/49a35f722c33e9f41d9052c35a64816f09f45342)) +* upgrade to hardhat v3 and configure repo ([#677](https://github.com/gnosisguild/enclave/issues/677)) ([7ccf6fa](https://github.com/gnosisguild/enclave/commit/7ccf6fa4d62a972a4d2336bd436d71bbc9b54535)) + + + diff --git a/Cargo.lock b/Cargo.lock index 7e92d5b8bd..20426d06bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2585,7 +2585,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "e3-aggregator" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2603,7 +2603,7 @@ dependencies = [ [[package]] name = "e3-bfv-helpers" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy-dyn-abi", "alloy-primitives", @@ -2620,7 +2620,7 @@ dependencies = [ [[package]] name = "e3-cli" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2650,7 +2650,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "ark-bn254", "ark-ff 0.4.2", @@ -2666,7 +2666,7 @@ dependencies = [ [[package]] name = "e3-config" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy-primitives", "anyhow", @@ -2686,7 +2686,7 @@ dependencies = [ [[package]] name = "e3-crypto" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "aes-gcm", "anyhow", @@ -2700,7 +2700,7 @@ dependencies = [ [[package]] name = "e3-data" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2716,7 +2716,7 @@ dependencies = [ [[package]] name = "e3-entrypoint" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "actix-web", @@ -2754,7 +2754,7 @@ dependencies = [ [[package]] name = "e3-events" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "alloy", @@ -2775,7 +2775,7 @@ dependencies = [ [[package]] name = "e3-evm" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "alloy", @@ -2799,7 +2799,7 @@ dependencies = [ [[package]] name = "e3-evm-helpers" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy", "async-trait", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "e3-fhe" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "e3-fs" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "anyhow", "async-trait", @@ -2877,7 +2877,7 @@ dependencies = [ [[package]] name = "e3-indexer" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy", "async-trait", @@ -2891,7 +2891,7 @@ dependencies = [ [[package]] name = "e3-init" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "anyhow", "async-recursion", @@ -2909,7 +2909,7 @@ dependencies = [ [[package]] name = "e3-keyshare" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2926,7 +2926,7 @@ dependencies = [ [[package]] name = "e3-logger" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "base64", @@ -2936,7 +2936,7 @@ dependencies = [ [[package]] name = "e3-net" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2958,7 +2958,7 @@ dependencies = [ [[package]] name = "e3-program-server" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix-web", "anyhow", @@ -2972,7 +2972,7 @@ dependencies = [ [[package]] name = "e3-request" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "anyhow", @@ -2987,7 +2987,7 @@ dependencies = [ [[package]] name = "e3-sdk" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "e3-bfv-helpers", "e3-evm-helpers", @@ -2996,7 +2996,7 @@ dependencies = [ [[package]] name = "e3-sortition" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "alloy", @@ -3013,7 +3013,7 @@ dependencies = [ [[package]] name = "e3-support-scripts" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "anyhow", "async-trait", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "e3-test-helpers" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "bincode", @@ -3041,7 +3041,7 @@ dependencies = [ [[package]] name = "e3-tests" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "actix", "alloy", @@ -3074,7 +3074,7 @@ dependencies = [ [[package]] name = "e3-wasm" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "e3-bfv-helpers", "getrandom 0.2.16", @@ -3151,7 +3151,7 @@ dependencies = [ [[package]] name = "enclaveup" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "anyhow", "clap", diff --git a/Cargo.toml b/Cargo.toml index e3ffd14a38..275724cf8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,38 +52,38 @@ push-remote = "origin" publish = true [workspace.package] -version = "0.0.1-test" +version = "0.0.14-test" edition = "2021" license = "LGPL-3.0-only" description = "E3 — Encrypted Execution Environments" repository = "https://github.com/gnosisguild/enclave" [workspace.dependencies] -e3-aggregator = { version = "0.0.1-test", path = "./crates/aggregator" } -e3-bfv-helpers = { version = "0.0.1-test", path = "./crates/bfv-helpers" } -e3-config = { version = "0.0.1-test", path = "./crates/config" } -e3-crypto = { version = "0.0.1-test", path = "./crates/crypto" } -e3-data = { version = "0.0.1-test", path = "./crates/data" } -e3-request = { version = "0.0.1-test", path = "./crates/request" } -e3-sdk = { version = "0.0.1-test", path = "./crates/sdk" } -e3-cli = { version = "0.0.1-test", path = "./crates/cli" } -e3-entrypoint = { version = "0.0.1-test", path = "./crates/entrypoint" } -e3-init = { version = "0.0.1-test", path = "./crates/init" } -e3-events = { version = "0.0.1-test", path = "./crates/events" } -e3-evm = { version = "0.0.1-test", path = "./crates/evm" } -e3-evm-helpers = { version = "0.0.1-test", path = "./crates/evm-helpers" } -e3-fhe = { version = "0.0.1-test", path = "./crates/fhe" } -e3-fs = { version = "0.0.1-test", path = "./crates/fs" } -e3-indexer = { version = "0.0.1-test", path = "./crates/indexer" } -e3-keyshare = { version = "0.0.1-test", path = "./crates/keyshare" } -e3-logger = { version = "0.0.1-test", path = "./crates/logger" } -e3-net = { version = "0.0.1-test", path = "./crates/net" } -e3-compute-provider = { version = "0.0.1-test", path = "./crates/compute-provider" } -e3-sortition = { version = "0.0.1-test", path = "./crates/sortition" } -e3-program-server = { version = "0.0.1-test", path = "./crates/program-server" } -e3-support-scripts = { version = "0.0.1-test", path = "./crates/support-scripts" } -e3-test-helpers = { version = "0.0.1-test", path = "./crates/test-helpers" } -e3-tests = { version = "0.0.1-test", path = "./crates/tests" } +e3-aggregator = { version = "0.0.14-test", path = "./crates/aggregator" } +e3-bfv-helpers = { version = "0.0.14-test", path = "./crates/bfv-helpers" } +e3-config = { version = "0.0.14-test", path = "./crates/config" } +e3-crypto = { version = "0.0.14-test", path = "./crates/crypto" } +e3-data = { version = "0.0.14-test", path = "./crates/data" } +e3-request = { version = "0.0.14-test", path = "./crates/request" } +e3-sdk = { version = "0.0.14-test", path = "./crates/sdk" } +e3-cli = { version = "0.0.14-test", path = "./crates/cli" } +e3-entrypoint = { version = "0.0.14-test", path = "./crates/entrypoint" } +e3-init = { version = "0.0.14-test", path = "./crates/init" } +e3-events = { version = "0.0.14-test", path = "./crates/events" } +e3-evm = { version = "0.0.14-test", path = "./crates/evm" } +e3-evm-helpers = { version = "0.0.14-test", path = "./crates/evm-helpers" } +e3-fhe = { version = "0.0.14-test", path = "./crates/fhe" } +e3-fs = { version = "0.0.14-test", path = "./crates/fs" } +e3-indexer = { version = "0.0.14-test", path = "./crates/indexer" } +e3-keyshare = { version = "0.0.14-test", path = "./crates/keyshare" } +e3-logger = { version = "0.0.14-test", path = "./crates/logger" } +e3-net = { version = "0.0.14-test", path = "./crates/net" } +e3-compute-provider = { version = "0.0.14-test", path = "./crates/compute-provider" } +e3-sortition = { version = "0.0.14-test", path = "./crates/sortition" } +e3-program-server = { version = "0.0.14-test", path = "./crates/program-server" } +e3-support-scripts = { version = "0.0.14-test", path = "./crates/support-scripts" } +e3-test-helpers = { version = "0.0.14-test", path = "./crates/test-helpers" } +e3-tests = { version = "0.0.14-test", path = "./crates/tests" } actix = "=0.13.5" actix-web = "=4.11.0" diff --git a/README.md b/README.md index 98aeccca66..0ffc677c8e 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,220 @@ sequenceDiagram Enclave-->>Users: success ``` +## šŸš€ Release Process + +### Overview + +Enclave uses a unified versioning strategy where all packages (Rust crates and npm packages) share the same version number. Releases are triggered by git tags and follow semantic versioning. + +### Quick Release + +```bash +# One command to release! šŸŽ‰ +pnpm bump:versions 1.0.0 + +# This automatically: +# - Bumps all versions +# - Generates changelog +# - Commits changes +# - Creates tag +# - Pushes to GitHub +# - Triggers release workflow +``` + +### Detailed Release Workflow + +#### 1. Development Phase + +Developers work on features and fixes, committing with [conventional commits](https://www.conventionalcommits.org/): + +```bash +git commit -m "feat: add new encryption module" +git commit -m "fix: resolve memory leak in SDK" +git commit -m "docs: update API documentation" +git commit -m "BREAKING CHANGE: redesign configuration API" +``` + +#### 2. Release Execution + +When ready to release, maintainers run a single command: + +```bash +# For stable release +pnpm bump:versions 1.0.0 + +# For pre-release +pnpm bump:versions 1.0.0-beta.1 +``` + +This command automatically: +- āœ… Validates working directory is clean +- āœ… Updates version in `Cargo.toml` (workspace version) +- āœ… Updates version in all npm `package.json` files +- āœ… Updates lock files (`Cargo.lock`, `pnpm-lock.yaml`) +- āœ… Generates/updates `CHANGELOG.md` from commit history +- āœ… Commits changes: `chore(release): bump version to X.Y.Z` +- āœ… Creates annotated tag: `vX.Y.Z` +- āœ… Pushes commits and tag to GitHub +- āœ… **Triggers automated release workflow** + +#### 3. Alternative: Manual Review Before Push + +If you prefer to review changes before pushing: + +```bash +# Prepare release locally (no push) +pnpm bump:versions --no-push 1.0.0 + +# Review the changes +git diff HEAD~1 +cat CHANGELOG.md + +# If everything looks good, push +git push && git push --tags +``` + +#### 4. Automated Release Pipeline + +Once the tag is pushed, GitHub Actions automatically: + +1. **Validates** version consistency across all packages +2. **Builds** binaries for all platforms: + - Linux (x86_64) + - macOS (x86_64, aarch64) +3. **Runs** all tests +4. **Publishes** packages: + * All versions (stable and pre-release): + * āœ… Publishes to crates.io + * āœ… Publishes to npm + * Tag differences: + * Stable (`v1.0.0`): npm `latest` tag, updates `stable` git tag + * Pre-release (`v1.0.0-beta.1`): npm `next` tag, no `stable` tag update +5. **Creates** GitHub Release with: + - Binary downloads for all platforms + - Release notes from CHANGELOG.md + - SHA256 checksums + - Installation instructions + +## šŸ·ļø Version Strategy + +### Version Format + +Enclave follows [Semantic Versioning](https://semver.org/): + +- **Stable**: `v1.0.0` - Production ready +- **Pre-release**: `v1.0.0-beta.1` - Testing/preview versions + - `-alpha.X` - Early development, may have breaking changes + - `-beta.X` - Feature complete, testing for bugs + - `-rc.X` - Release candidate, final testing + +### Which Version Should I Use? + +#### For Production (Mainnet) +Use stable versions only: +```bash +enclaveup install # Latest stable +enclaveup install v1.0.0 # Specific stable version +``` + +#### For Testing (Testnet) +You can use pre-release versions: +```bash +enclaveup install --pre-release # Latest pre-release +enclaveup install v1.0.0-beta.1 # Specific pre-release +``` + +#### For Development +Build from source: +```bash +git clone https://github.com/gnosisguild/enclave.git +cd enclave +cargo build --release +``` + +## 🌿 Branch and Tag Strategy + +### Current Setup + +- **`main`** - Primary development branch +- **`v*.*.*`** - Version tags for releases +- **`stable`** - Always points to the latest stable release + +### Installation Sources + +```bash +# Latest stable release (recommended for production) +curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/stable/install | bash + +# Latest development version (may be unstable) +curl -fsSL https://raw.githubusercontent.com/gnosisguild/enclave/main/install | bash +``` + +### Future Branch Strategy + +We plan to implement a three-tier branch strategy: + +1. **`develop`** - Bleeding edge, experimental features +2. **`testnet`** - Stable features for testnet deployment +3. **`mainnet`** - Production-ready for mainnet deployment + +## šŸ“‹ Release Checklist + +For maintainers doing a release: + +- [ ] Ensure all tests pass on `main` +- [ ] Review commits since last release for proper conventional format +- [ ] Decide version number (major/minor/patch) +- [ ] Run: `pnpm bump:versions X.Y.Z` +- [ ] Monitor GitHub Actions for successful deployment +- [ ] Verify packages on [npm](https://www.npmjs.com/org/enclave) and [crates.io](https://crates.io/search?q=enclave) +- [ ] Check GitHub release page for binaries and changelog +- [ ] Announce release (Discord/Twitter/etc) + +## šŸ”§ Script Options + +The `bump:versions` script supports several options: + +```bash +# Full automatic release (default) +pnpm bump:versions 1.0.0 + +# Local only - don't push +pnpm bump:versions --no-push 1.0.0 + +# Skip git operations entirely +pnpm bump:versions --skip-git 1.0.0 + +# Dry run - see what would happen +pnpm bump:versions --dry-run 1.0.0 + +# Show help +pnpm bump:versions --help +``` + +## šŸ”„ Rollback Procedure + +If a release has issues: + +1. **Mark as deprecated on npm**: + ```bash + npm deprecate @enclave/sdk@1.0.0 "Critical bug, use 1.0.1" + ``` + +2. **Yank from crates.io** (if critical): + ```bash + cargo yank --version 1.0.0 enclave + ``` + +3. **Fix and release patch**: + ```bash + pnpm bump:versions 1.0.1 + ``` + +## šŸ“Š Version History + +Check our [Releases page](https://github.com/gnosisguild/enclave/releases) for full version history and changelogs. + ## Security and Liability This repo is provided WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index 463633bec6..a4d9bb0bd6 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -1850,7 +1850,7 @@ dependencies = [ "config", "dialoguer", "dotenvy", - "e3-compute-provider 0.0.1-test", + "e3-compute-provider 0.0.14-test", "e3-sdk", "env_logger", "eyre", @@ -2151,7 +2151,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "e3-bfv-helpers" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy-dyn-abi", "alloy-primitives", @@ -2167,7 +2167,7 @@ dependencies = [ [[package]] name = "e3-compute-provider" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "ark-bn254", "ark-ff 0.4.2", @@ -2200,7 +2200,7 @@ dependencies = [ [[package]] name = "e3-evm-helpers" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy", "async-trait", @@ -2244,7 +2244,7 @@ dependencies = [ [[package]] name = "e3-indexer" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "alloy", "async-trait", @@ -2273,7 +2273,7 @@ dependencies = [ [[package]] name = "e3-sdk" -version = "0.0.1-test" +version = "0.0.14-test" dependencies = [ "e3-bfv-helpers", "e3-evm-helpers", diff --git a/package.json b/package.json index fa89f3c7bc..b5bbe1bcfe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@enclave/main", "description": "Enclave is an open-source protocol for Encrypted Execution Environments (E3).", - "version": "0.0.0", + "version": "0.0.14-test", "private": true, "license": "LGPL-3.0-only", "author": { @@ -9,7 +9,7 @@ "url": "https://github.com/gnosisguild" }, "scripts": { - "bump:versions": "pnpm --filter \"@enclave-e3/contracts\" --filter \"@enclave-e3/sdk\" --filter \"@enclave-e3/react\" --filter \"@enclave-e3/config\" --filter \"@enclave-e3/wasm\" exec npm version", + "bump:versions": "tsx scripts/bump-versions.ts", "clean": "cd packages/enclave-contracts && pnpm clean", "compile": "pnpm evm:build && pnpm sdk:build && pnpm react:build && pnpm ciphernode:build && ./scripts/compile-circuits.sh", "lint": "pnpm evm:lint && pnpm ciphernode:lint && ./scripts/lint-circuits.sh", @@ -49,17 +49,17 @@ "npm:release": "pnpm build && pnpm config:release && pnpm evm:release && pnpm wasm:release && pnpm sdk:release && pnpm react:release", "support:build": "cd crates/support && ./scripts/build.sh", "build": "pnpm compile", - "changeset": "changeset", - "version": "changeset version", "wasm:build": "cd ./crates/wasm && pnpm build", "release": "pnpm build && changeset publish", "build:ts": "pnpm evm:build && pnpm sdk:build && pnpm react:build" }, "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", "devDependencies": { - "@changesets/cli": "^2.27.1", "@types/node": "22.7.5", - "husky": "^9.1.7" + "conventional-changelog-cli": "^5.0.0", + "husky": "^9.1.7", + "tsx": "^4.20.3", + "typescript": "5.8.3" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8386ba0b4..09f2cbaf88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,15 +15,21 @@ importers: .: devDependencies: - '@changesets/cli': - specifier: ^2.27.1 - version: 2.29.6(@types/node@22.7.5) '@types/node': specifier: 22.7.5 version: 22.7.5 + conventional-changelog-cli: + specifier: ^5.0.0 + version: 5.0.0(conventional-commits-filter@5.0.0) husky: specifier: ^9.1.7 version: 9.1.7 + tsx: + specifier: ^4.20.3 + version: 4.20.5 + typescript: + specifier: 5.8.3 + version: 5.8.3 crates/wasm: devDependencies: @@ -1381,61 +1387,6 @@ packages: '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - - '@changesets/cli@2.29.6': - resolution: {integrity: sha512-6qCcVsIG1KQLhpQ5zE8N0PckIx4+9QlHK3z6/lwKnw7Tir71Bjw8BeOZaxA/4Jt00pcgCnCSWZnyuZf5Il05QQ==} - hasBin: true - - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - - '@changesets/get-release-plan@4.0.13': - resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - - '@changesets/read@0.6.5': - resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} @@ -1451,6 +1402,18 @@ packages: peerDependencies: commander: ~12.1.0 + '@conventional-changelog/git-client@1.0.1': + resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.0.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2180,6 +2143,10 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@hutson/parse-repository-url@5.0.0': + resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} + engines: {node: '>=10.13.0'} + '@iden3/bigarray@0.0.2': resolution: {integrity: sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==} @@ -2315,15 +2282,6 @@ packages: resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} engines: {node: '>=18'} - '@inquirer/external-editor@1.0.1': - resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': 22.7.5 - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/figures@1.0.13': resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} @@ -2382,12 +2340,6 @@ packages: '@lit/reactive-element@2.1.1': resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -3695,6 +3647,9 @@ packages: '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3724,6 +3679,9 @@ packages: '@types/resolve@0.0.8': resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} @@ -4057,6 +4015,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + add@2.0.6: resolution: {integrity: sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q==} @@ -4189,6 +4150,9 @@ packages: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -4321,10 +4285,6 @@ packages: peerDependencies: ajv: 4.11.8 - 8 - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - bfj@7.1.0: resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} engines: {node: '>= 8.0.0'} @@ -4587,9 +4547,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} - charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -4618,10 +4575,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - cipher-base@1.0.6: resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} engines: {node: '>= 0.10'} @@ -4774,6 +4727,9 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -4829,6 +4785,73 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + conventional-changelog-angular@8.0.0: + resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} + engines: {node: '>=18'} + + conventional-changelog-atom@5.0.0: + resolution: {integrity: sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==} + engines: {node: '>=18'} + + conventional-changelog-cli@5.0.0: + resolution: {integrity: sha512-9Y8fucJe18/6ef6ZlyIlT2YQUbczvoQZZuYmDLaGvcSBP+M6h+LAvf7ON7waRxKJemcCII8Yqu5/8HEfskTxJQ==} + engines: {node: '>=18'} + hasBin: true + + conventional-changelog-codemirror@5.0.0: + resolution: {integrity: sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==} + engines: {node: '>=18'} + + conventional-changelog-conventionalcommits@8.0.0: + resolution: {integrity: sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==} + engines: {node: '>=18'} + + conventional-changelog-core@8.0.0: + resolution: {integrity: sha512-EATUx5y9xewpEe10UEGNpbSHRC6cVZgO+hXQjofMqpy+gFIrcGvH3Fl6yk2VFKh7m+ffenup2N7SZJYpyD9evw==} + engines: {node: '>=18'} + + conventional-changelog-ember@5.0.0: + resolution: {integrity: sha512-RPflVfm5s4cSO33GH/Ey26oxhiC67akcxSKL8CLRT3kQX2W3dbE19sSOM56iFqUJYEwv9mD9r6k79weWe1urfg==} + engines: {node: '>=18'} + + conventional-changelog-eslint@6.0.0: + resolution: {integrity: sha512-eiUyULWjzq+ybPjXwU6NNRflApDWlPEQEHvI8UAItYW/h22RKkMnOAtfCZxMmrcMO1OKUWtcf2MxKYMWe9zJuw==} + engines: {node: '>=18'} + + conventional-changelog-express@5.0.0: + resolution: {integrity: sha512-D8Q6WctPkQpvr2HNCCmwU5GkX22BVHM0r4EW8vN0230TSyS/d6VQJDAxGb84lbg0dFjpO22MwmsikKL++Oo/oQ==} + engines: {node: '>=18'} + + conventional-changelog-jquery@6.0.0: + resolution: {integrity: sha512-2kxmVakyehgyrho2ZHBi90v4AHswkGzHuTaoH40bmeNqUt20yEkDOSpw8HlPBfvEQBwGtbE+5HpRwzj6ac2UfA==} + engines: {node: '>=18'} + + conventional-changelog-jshint@5.0.0: + resolution: {integrity: sha512-gGNphSb/opc76n2eWaO6ma4/Wqu3tpa2w7i9WYqI6Cs2fncDSI2/ihOfMvXveeTTeld0oFvwMVNV+IYQIk3F3g==} + engines: {node: '>=18'} + + conventional-changelog-preset-loader@5.0.0: + resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} + engines: {node: '>=18'} + + conventional-changelog-writer@8.2.0: + resolution: {integrity: sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==} + engines: {node: '>=18'} + hasBin: true + + conventional-changelog@6.0.0: + resolution: {integrity: sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==} + engines: {node: '>=18'} + + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} + + conventional-commits-parser@6.2.0: + resolution: {integrity: sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==} + engines: {node: '>=18'} + hasBin: true + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -5220,10 +5243,6 @@ packages: detect-browser@5.3.0: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -5293,6 +5312,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -5639,9 +5662,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} @@ -5762,6 +5782,10 @@ packages: find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5960,6 +5984,16 @@ packages: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} hasBin: true + git-raw-commits@5.0.0: + resolution: {integrity: sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==} + engines: {node: '>=18'} + hasBin: true + + git-semver-tags@8.0.0: + resolution: {integrity: sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==} + engines: {node: '>=18'} + hasBin: true + git-up@7.0.0: resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} @@ -6203,6 +6237,10 @@ packages: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} @@ -6234,10 +6272,6 @@ packages: https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} - hasBin: true - human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} @@ -6290,6 +6324,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -6417,6 +6455,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-obj@3.0.0: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} @@ -6458,10 +6500,6 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -6470,10 +6508,6 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -6742,9 +6776,6 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -6922,6 +6953,10 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -7369,6 +7404,10 @@ packages: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -7466,9 +7505,6 @@ packages: os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - ox@0.6.9: resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} peerDependencies: @@ -7489,10 +7525,6 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -7517,10 +7549,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - p-map@7.0.3: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} @@ -7536,9 +7564,6 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -7566,6 +7591,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -8080,9 +8109,13 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -8544,8 +8577,17 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} @@ -8643,10 +8685,6 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} @@ -8778,9 +8816,13 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + tempfile@5.0.0: + resolution: {integrity: sha512-bX655WZI/F7EoTDw9JvQURqAXiPHi8o8+yFxPF2lWYyz1aHnmMRuXWqL6YB6GmeO0o4DIYWHLgGNi/X64T+X4Q==} + engines: {node: '>=14.18'} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -9004,6 +9046,10 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -9081,6 +9127,10 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -9277,6 +9327,9 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + valtio@1.13.2: resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} @@ -10638,150 +10691,6 @@ snapshots: '@braintree/sanitize-url@6.0.4': {} - '@changesets/apply-release-plan@7.0.12': - dependencies: - '@changesets/config': 3.1.1 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.2 - - '@changesets/assemble-release-plan@6.0.9': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 - - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/cli@2.29.6(@types/node@22.7.5)': - dependencies: - '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.13 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.1(@types/node@22.7.5) - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.2 - spawndamnit: 3.0.1 - term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' - - '@changesets/config@3.1.1': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 - - '@changesets/errors@0.2.0': - dependencies: - extendable-error: 0.1.7 - - '@changesets/get-dependents-graph@2.1.3': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.2 - - '@changesets/get-release-plan@4.0.13': - dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/get-version-range-type@0.4.0': {} - - '@changesets/git@3.0.4': - dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 - - '@changesets/logger@0.1.1': - dependencies: - picocolors: 1.1.1 - - '@changesets/parse@0.4.1': - dependencies: - '@changesets/types': 6.1.0 - js-yaml: 3.14.1 - - '@changesets/pre@2.0.2': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - - '@changesets/read@0.6.5': - dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 - - '@changesets/should-skip-package@0.1.2': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/types@4.1.0': {} - - '@changesets/types@6.1.0': {} - - '@changesets/write@0.4.0': - dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.1 - prettier: 2.8.8 - '@coinbase/wallet-sdk@3.9.3': dependencies: bn.js: 5.2.2 @@ -10823,6 +10732,14 @@ snapshots: dependencies: commander: 13.1.0 + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)': + dependencies: + '@types/semver': 7.7.1 + semver: 7.7.2 + optionalDependencies: + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.2.0 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -11642,6 +11559,8 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@hutson/parse-repository-url@5.0.0': {} + '@iden3/bigarray@0.0.2': {} '@iden3/binfileutils@0.0.11': @@ -11755,13 +11674,6 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 - '@inquirer/external-editor@1.0.1(@types/node@22.7.5)': - dependencies: - chardet: 2.1.0 - iconv-lite: 0.6.3 - optionalDependencies: - '@types/node': 22.7.5 - '@inquirer/figures@1.0.13': {} '@inquirer/input@2.3.0': @@ -11829,22 +11741,6 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.4.0 - '@manypkg/find-root@1.1.0': - dependencies: - '@babel/runtime': 7.28.3 - '@types/node': 22.7.5 - find-up: 4.1.0 - fs-extra: 8.1.0 - - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.28.3 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 @@ -13758,6 +13654,8 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} + '@types/parse-json@4.0.2': {} '@types/prettier@2.7.3': {} @@ -13785,6 +13683,8 @@ snapshots: dependencies: '@types/node': 22.7.5 + '@types/semver@7.7.1': {} + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 @@ -14684,6 +14584,8 @@ snapshots: acorn@8.15.0: {} + add-stream@1.0.0: {} + add@2.0.6: {} adm-zip@0.4.16: {} @@ -14792,6 +14694,8 @@ snapshots: array-back@4.0.2: {} + array-ify@1.0.0: {} + array-union@2.1.0: {} array-uniq@1.0.3: {} @@ -14951,10 +14855,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 - bfj@7.1.0: dependencies: bluebird: 3.7.2 @@ -15258,8 +15158,6 @@ snapshots: character-reference-invalid@2.0.1: {} - chardet@2.1.0: {} - charenc@0.0.2: {} check-error@1.0.3: @@ -15290,8 +15188,6 @@ snapshots: chownr@2.0.0: {} - ci-info@3.9.0: {} - cipher-base@1.0.6: dependencies: inherits: 2.0.4 @@ -15446,6 +15342,11 @@ snapshots: commondir@1.0.1: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + compare-versions@6.1.1: {} compute-scroll-into-view@3.1.1: {} @@ -15509,6 +15410,85 @@ snapshots: content-type@1.0.5: {} + conventional-changelog-angular@8.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-atom@5.0.0: {} + + conventional-changelog-cli@5.0.0(conventional-commits-filter@5.0.0): + dependencies: + add-stream: 1.0.0 + conventional-changelog: 6.0.0(conventional-commits-filter@5.0.0) + meow: 13.2.0 + tempfile: 5.0.0 + transitivePeerDependencies: + - conventional-commits-filter + + conventional-changelog-codemirror@5.0.0: {} + + conventional-changelog-conventionalcommits@8.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-core@8.0.0(conventional-commits-filter@5.0.0): + dependencies: + '@hutson/parse-repository-url': 5.0.0 + add-stream: 1.0.0 + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.0 + git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + hosted-git-info: 7.0.2 + normalize-package-data: 6.0.2 + read-package-up: 11.0.0 + read-pkg: 9.0.1 + transitivePeerDependencies: + - conventional-commits-filter + + conventional-changelog-ember@5.0.0: {} + + conventional-changelog-eslint@6.0.0: {} + + conventional-changelog-express@5.0.0: {} + + conventional-changelog-jquery@6.0.0: {} + + conventional-changelog-jshint@5.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-preset-loader@5.0.0: {} + + conventional-changelog-writer@8.2.0: + dependencies: + conventional-commits-filter: 5.0.0 + handlebars: 4.7.8 + meow: 13.2.0 + semver: 7.7.2 + + conventional-changelog@6.0.0(conventional-commits-filter@5.0.0): + dependencies: + conventional-changelog-angular: 8.0.0 + conventional-changelog-atom: 5.0.0 + conventional-changelog-codemirror: 5.0.0 + conventional-changelog-conventionalcommits: 8.0.0 + conventional-changelog-core: 8.0.0(conventional-commits-filter@5.0.0) + conventional-changelog-ember: 5.0.0 + conventional-changelog-eslint: 6.0.0 + conventional-changelog-express: 5.0.0 + conventional-changelog-jquery: 6.0.0 + conventional-changelog-jshint: 5.0.0 + conventional-changelog-preset-loader: 5.0.0 + transitivePeerDependencies: + - conventional-commits-filter + + conventional-commits-filter@5.0.0: {} + + conventional-commits-parser@6.2.0: + dependencies: + meow: 13.2.0 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -15940,8 +15920,6 @@ snapshots: detect-browser@5.3.0: {} - detect-indent@6.1.0: {} - detect-libc@2.0.4: {} devlop@1.1.0: @@ -16007,6 +15985,10 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dotenv@16.6.1: {} dunder-proto@1.0.1: @@ -16585,8 +16567,6 @@ snapshots: extend@3.0.2: {} - extendable-error@0.1.7: {} - extension-port-stream@3.0.0: dependencies: readable-stream: 3.6.2 @@ -16702,6 +16682,8 @@ snapshots: find-root@1.1.0: {} + find-up-simple@1.0.1: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -16912,6 +16894,22 @@ snapshots: chalk: 2.4.2 node-emoji: 1.11.0 + git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): + dependencies: + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + git-semver-tags@8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): + dependencies: + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + git-up@7.0.0: dependencies: is-ssh: 1.4.1 @@ -17376,6 +17374,10 @@ snapshots: hoopy@0.1.4: {} + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-url-attributes@3.0.1: {} html-void-elements@3.0.0: {} @@ -17416,8 +17418,6 @@ snapshots: https-browserify@1.0.0: {} - human-id@4.1.1: {} - human-signals@4.3.1: {} human-signals@5.0.0: {} @@ -17451,6 +17451,8 @@ snapshots: imurmurhash@0.1.4: {} + index-to-position@1.2.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -17549,6 +17551,8 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + is-obj@3.0.0: {} is-path-inside@3.0.3: {} @@ -17580,18 +17584,12 @@ snapshots: is-stream@3.0.0: {} - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} - is-windows@1.0.2: {} - isarray@1.0.0: {} isarray@2.0.5: {} @@ -17831,8 +17829,6 @@ snapshots: lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} - lodash.truncate@4.4.2: {} lodash@4.17.21: {} @@ -18172,6 +18168,8 @@ snapshots: media-typer@1.1.0: {} + meow@13.2.0: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -18952,6 +18950,12 @@ snapshots: dependencies: abbrev: 1.0.9 + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -19063,8 +19067,6 @@ snapshots: os-browserify@0.3.0: {} - outdent@0.5.0: {} - ox@0.6.9(typescript@5.8.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -19111,10 +19113,6 @@ snapshots: p-cancelable@3.0.0: {} - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - p-finally@1.0.0: {} p-limit@2.3.0: @@ -19137,8 +19135,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@2.1.0: {} - p-map@7.0.3: {} p-try@2.2.0: {} @@ -19152,10 +19148,6 @@ snapshots: registry-url: 6.0.1 semver: 7.7.2 - package-manager-detector@0.2.11: - dependencies: - quansync: 0.2.11 - pako@1.0.11: {} pako@2.1.0: {} @@ -19201,6 +19193,12 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.2.0 + type-fest: 4.41.0 + parse-numeric-range@1.3.0: {} parse-path@7.1.0: @@ -19647,12 +19645,19 @@ snapshots: dependencies: pify: 2.3.0 - read-yaml-file@1.1.0: + read-package-up@11.0.0: dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 readable-stream@2.3.8: dependencies: @@ -20300,10 +20305,19 @@ snapshots: space-separated-tokens@2.0.2: {} - spawndamnit@3.0.1: + spdx-correct@3.2.0: dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} split-on-first@1.1.0: {} @@ -20399,8 +20413,6 @@ snapshots: strip-bom-string@1.0.0: {} - strip-bom@3.0.0: {} - strip-eof@1.0.0: {} strip-final-newline@3.0.0: {} @@ -20572,7 +20584,11 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - term-size@2.2.1: {} + temp-dir@3.0.0: {} + + tempfile@5.0.0: + dependencies: + temp-dir: 3.0.0 text-table@0.2.0: {} @@ -20800,6 +20816,8 @@ snapshots: type-fest@1.4.0: {} + type-fest@4.41.0: {} + type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -20870,6 +20888,8 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + unicorn-magic@0.1.0: {} + unified@10.1.2: dependencies: '@types/unist': 2.0.11 @@ -21066,6 +21086,11 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + valtio@1.13.2(@types/react@18.3.24)(react@18.3.1): dependencies: derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.24)(react@18.3.1)) diff --git a/scripts/README.md b/scripts/README.md index e605e9dea2..7cf11f6a3b 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -2,6 +2,88 @@ This directory contains utility scripts for the Enclave project. +## Version Bumper + +`bump-versions.ts` - Bumps the versions of all packages and crates in the project. + +### Usage + +```bash +# Full release (bump, commit, tag, and push) +pnpm bump:versions 1.0.0 + +# Pre-release version +pnpm bump:versions 1.0.0-beta.1 + +# Local only (don't push to remote) +pnpm bump:versions --no-push 1.0.0 + +# Manual git operations (just bump versions) +pnpm bump:versions --skip-git 1.0.0 + +# Test run (see what would happen) +pnpm bump:versions --dry-run 1.0.0 +``` + +### What it does + +**By default, the script performs a complete release:** + +1. **Validates** your working directory is clean (no uncommitted changes) +2. **Updates versions** across the entire monorepo: + - Rust workspace version in root `Cargo.toml` + - All npm packages in `packages/` and `crates/wasm` + - Root `package.json` +3. **Updates lock files**: + - `Cargo.lock` for Rust dependencies + - `pnpm-lock.yaml` for npm dependencies +4. **Generates changelog** from conventional commits (uses `CHANGELOG.md`) +5. **Commits** all changes with message: `chore(release): bump version to X.Y.Z` +6. **Creates** annotated git tag: `vX.Y.Z` +7. **Pushes** commits and tag to GitHub +8. **Triggers** the automated release workflow + +### Examples + +```bash +# One-command release (recommended) +pnpm bump:versions 1.2.3 +# This bumps everything, commits, tags, and pushes - triggering the full release! + +# Pre-release for testing +pnpm bump:versions 1.2.3-beta.1 +# Automatically detected as pre-release, published to npm with 'next' tag + +# Prepare release locally first +pnpm bump:versions --no-push 1.2.3 +# Does everything except push - review first, then: git push && git push --tags + +# Just bump versions (old behavior) +pnpm bump:versions --skip-git 1.2.3 +# Only updates versions, you handle git operations manually +``` + +### Options + +- `--skip-git` - Skip all git operations (add, commit, tag, push) +- `--no-push` - Perform git operations locally but don't push +- `--dry-run` - Preview what would happen without making any changes +- `--help` - Show help message + +### Prerequisites + +- Clean working directory (no uncommitted changes) +- Conventional commits for changelog generation +- Valid semver version format + +### After Running + +Once you run `pnpm bump:versions X.Y.Z` and the tag is pushed, GitHub Actions automatically: +- Builds binaries for all platforms (Linux, macOS) +- Publishes to npm (with `latest` or `next` tag) +- Publishes to crates.io +- Creates GitHub release with changelog and binaries + ## License Header Checker `check-license-headers.sh` - Checks and fixes SPDX license headers in source files. diff --git a/scripts/bump-versions.ts b/scripts/bump-versions.ts new file mode 100644 index 0000000000..6cb874aabe --- /dev/null +++ b/scripts/bump-versions.ts @@ -0,0 +1,578 @@ +#!/usr/bin/env tsx +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +import { readFileSync, writeFileSync, existsSync } from 'fs' +import { join, resolve } from 'path' +import { execSync } from 'child_process' + +interface PackageJson { + name: string + version: string +} + +interface BumpOptions { + skipGit?: boolean + skipPush?: boolean + dryRun?: boolean +} + +class VersionBumper { + private newVersion: string + private oldVersion: string | null = null + private rootDir: string + private options: BumpOptions + + constructor(newVersion: string, options: BumpOptions = {}) { + this.newVersion = newVersion + this.rootDir = resolve(__dirname, '..') + this.options = options + } + + /** + * Main entry point to bump all versions + */ + bumpAll(): void { + console.log(`šŸš€ Bumping all versions to ${this.newVersion}`) + + if (this.options.dryRun) { + console.log('šŸ“ DRY RUN MODE - No changes will be made') + } + + try { + // Validate version format + this.validateVersion(this.newVersion) + + // Get current version from root package.json or Cargo.toml + this.oldVersion = this.getCurrentVersion() + console.log(`šŸ“Œ Current version: ${this.oldVersion || 'unknown'}`) + + // Check for uncommitted changes + if (!this.options.skipGit && !this.options.dryRun) { + this.checkGitStatus() + } + + // In dry-run mode, just show what would happen + if (this.options.dryRun) { + console.log('\nšŸ“‹ Would perform the following actions:') + console.log(' 1. Update Rust workspace version in Cargo.toml') + console.log(' 2. Update NPM package versions in:') + console.log(' - Root package.json') + console.log(' - packages/enclave-sdk') + console.log(' - packages/enclave-contracts') + console.log(' - packages/enclave-config') + console.log(' - packages/enclave-react') + console.log(' - crates/wasm') + console.log(' 3. Update lock files (Cargo.lock, pnpm-lock.yaml)') + console.log(' 4. Generate/update CHANGELOG.md') + if (!this.options.skipGit) { + console.log(' 5. Commit changes') + console.log(` 6. Create tag: v${this.newVersion}`) + if (!this.options.skipPush) { + console.log(' 7. Push commits and tag to origin') + } + } + console.log('\nāœ… Dry run complete. Run without --dry-run to perform these actions.') + return + } + + // Bump Rust crates + this.bumpRustCrates() + + // Bump npm packages + this.bumpNpmPackages() + + // Update lock files + this.updateLockFiles() + + // Generate changelog + this.generateChangelog() + + // Git operations + if (!this.options.skipGit && !this.options.dryRun) { + this.performGitOperations() + } + + console.log('\nāœ… All versions bumped successfully!') + console.log('\nšŸ“‹ Summary:') + console.log(` Previous version: ${this.oldVersion || 'unknown'}`) + console.log(` New version: ${this.newVersion}`) + console.log(` Rust crates: āœ“`) + console.log(` NPM packages: āœ“`) + console.log(` Lock files: āœ“`) + console.log(` Changelog: āœ“`) + + if (!this.options.skipGit && !this.options.dryRun) { + console.log(` Git commit: āœ“`) + console.log(` Git tag: v${this.newVersion} āœ“`) + + if (!this.options.skipPush) { + console.log(` Git push: āœ“`) + console.log(` Tag push: āœ“`) + console.log('\nšŸŽ‰ Release tag pushed! The release workflow will start automatically.') + } else { + console.log('\nšŸ’” Next steps:') + console.log(' Push changes and tag to trigger release:') + console.log(' git push && git push --tags') + } + } else if (this.options.dryRun) { + console.log('\nšŸ’” Dry run complete. To perform actual bump, run without --dry-run') + } else { + console.log('\nšŸ’” Next steps:') + console.log(' 1. Review the changes and CHANGELOG.md') + console.log(' 2. Commit: git add . && git commit -m "chore(release): bump version to ' + this.newVersion + '"') + console.log(' 3. Tag: git tag v' + this.newVersion) + console.log(' 4. Push: git push && git push --tags') + } + } catch (error) { + console.error('āŒ Error bumping versions:', error) + process.exit(1) + } + } + + /** + * Check git status for uncommitted changes + */ + private checkGitStatus(): void { + try { + const status = execSync('git status --porcelain', { + cwd: this.rootDir, + encoding: 'utf-8' + }).trim() + + if (status) { + console.error('āŒ Error: You have uncommitted changes.') + console.error(' Please commit or stash your changes before bumping versions.') + console.error('\n Uncommitted files:') + console.error(status.split('\n').map(line => ' ' + line).join('\n')) + console.error('\n To proceed anyway, use --skip-git flag') + process.exit(1) + } + } catch (error) { + console.warn('āš ļø Could not check git status') + } + } + + /** + * Perform git operations (add, commit, tag, push) + */ + private performGitOperations(): void { + console.log('\nšŸ“ Performing git operations...') + + try { + // Add all changes + console.log(' Adding changes...') + execSync('git add .', { cwd: this.rootDir }) + + // Create commit message + const commitMessage = `chore(release): bump version to ${this.newVersion} + + - Updated all Rust crates to ${this.newVersion} + - Updated all npm packages to ${this.newVersion} + - Updated lock files + - Generated CHANGELOG.md` + + // Commit changes + console.log(' Committing changes...') + execSync(`git commit -m "${commitMessage}"`, { + cwd: this.rootDir, + stdio: 'pipe' + }) + console.log(` āœ“ Committed with message: "chore(release): bump version to ${this.newVersion}"`) + + // Create tag + const tagName = `v${this.newVersion}` + console.log(` Creating tag ${tagName}...`) + + // Check if it's a pre-release + const isPrerelease = this.newVersion.includes('-') + const tagMessage = isPrerelease + ? `Pre-release ${this.newVersion}` + : `Release ${this.newVersion}` + + execSync(`git tag -a ${tagName} -m "${tagMessage}"`, { + cwd: this.rootDir, + stdio: 'pipe' + }) + console.log(` āœ“ Created tag: ${tagName}`) + + // Push changes and tag (unless --no-push was specified) + if (!this.options.skipPush) { + console.log(' Pushing to remote...') + + // Push commits + execSync('git push', { + cwd: this.rootDir, + stdio: 'pipe' + }) + console.log(' āœ“ Pushed commits') + + // Push tag + execSync(`git push origin ${tagName}`, { + cwd: this.rootDir, + stdio: 'pipe' + }) + console.log(` āœ“ Pushed tag ${tagName}`) + } + + } catch (error: any) { + console.error('āŒ Error during git operations:', error.message) + console.error('\nšŸ’” If the tag already exists, delete it first:') + console.error(` git tag -d v${this.newVersion}`) + console.error(` git push --delete origin v${this.newVersion}`) + throw error + } + } + + /** + * Get current version from the monorepo + */ + private getCurrentVersion(): string | null { + // Try to get from root package.json first + const rootPackagePath = join(this.rootDir, 'package.json') + if (existsSync(rootPackagePath)) { + const content = readFileSync(rootPackagePath, 'utf-8') + const packageJson = JSON.parse(content) + if (packageJson.version) { + return packageJson.version + } + } + + // Try to get from root Cargo.toml workspace version + const rootCargoPath = join(this.rootDir, 'Cargo.toml') + if (existsSync(rootCargoPath)) { + const content = readFileSync(rootCargoPath, 'utf-8') + const versionMatch = content.match(/\[workspace\.package\][\s\S]*?version = "([^"]+)"/) + if (versionMatch) { + return versionMatch[1] + } + } + + return null + } + + /** + * Generate changelog using conventional commits + */ + private generateChangelog(): void { + console.log('\nšŸ“ Generating changelog...') + + try { + execSync('pnpm conventional-changelog --help', { + stdio: 'ignore', + cwd: this.rootDir + }) + + const changelogPath = join(this.rootDir, 'CHANGELOG.md') + + if (!existsSync(changelogPath)) { + // First time - generate entire changelog + console.log(' Generating full changelog from git history...') + execSync('npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0', { + cwd: this.rootDir, + stdio: 'inherit' + }) + } else { + // Update existing changelog with changes since last release + console.log(' Updating changelog with new changes...') + execSync('npx conventional-changelog -p angular -i CHANGELOG.md -s', { + cwd: this.rootDir, + stdio: 'inherit' + }) + } + + console.log(' āœ“ Changelog generated successfully') + + } catch (error) { + console.warn(' āš ļø Could not generate changelog:', error) + console.log(' Continuing without changelog...') + } + } + + /** + * Update lock files after version bump + */ + private updateLockFiles(): void { + console.log('\nšŸ”’ Updating lock files...') + + // Update Cargo.lock + try { + execSync('cargo update --workspace', { + cwd: this.rootDir, + stdio: 'pipe' + }) + console.log(' āœ“ Cargo.lock updated') + } catch (error) { + console.warn(' āš ļø Could not update Cargo.lock') + } + + // Detect and update the appropriate Node.js lock file + const pnpmLockPath = join(this.rootDir, 'pnpm-lock.yaml') + + if (existsSync(pnpmLockPath)) { + try { + execSync('pnpm install --lockfile-only', { + cwd: this.rootDir, + stdio: 'pipe' + }) + console.log(' āœ“ pnpm-lock.yaml updated') + } catch (error) { + console.warn(' āš ļø Could not update pnpm-lock.yaml') + } + } + } + + /** + * Validate version format (semantic versioning) + */ + private validateVersion(version: string): void { + const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/ + if (!semverRegex.test(version)) { + throw new Error(`Invalid version format: ${version}. Expected format: x.y.z[-prerelease][+build]`) + } + } + + /** + * Bump versions in all Rust crates + */ + private bumpRustCrates(): void { + console.log('\nšŸ¦€ Bumping Rust crate versions...') + + // Update root Cargo.toml workspace version (this propagates to all crates) + const rootCargoPath = join(this.rootDir, 'Cargo.toml') + this.updateCargoToml(rootCargoPath) + + // Update workspace dependencies in root Cargo.toml + this.updateWorkspaceDependencies(rootCargoPath) + + console.log(' āœ“ All workspace crates updated via workspace.version') + } + + /** + * Bump versions in all npm packages + */ + private bumpNpmPackages(): void { + console.log('\nšŸ“¦ Bumping NPM package versions...') + + // Update root package.json if it exists + const rootPackagePath = join(this.rootDir, 'package.json') + this.updatePackageJson(rootPackagePath) + console.log(' āœ“ Root package.json') + + // Main packages to bump (excluding examples and templates) + const packagesToBump = [ + 'packages/enclave-sdk', + 'packages/enclave-contracts', + 'packages/enclave-config', + 'packages/enclave-react', + 'crates/wasm' + ] + + for (const packagePath of packagesToBump) { + const fullPath = join(this.rootDir, packagePath) + const packageJsonPath = join(fullPath, 'package.json') + + this.updatePackageJson(packageJsonPath) + const packageName = this.getPackageName(packageJsonPath) + console.log(` āœ“ ${packageName}`) + } + } + + /** + * Update Cargo.toml file (workspace version and dependencies) + */ + private updateCargoToml(filePath: string): void { + const content = readFileSync(filePath, 'utf-8') + const lines = content.split('\n') + + let updated = false + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim() + + // Update workspace package version + if (line === '[workspace.package]') { + // Look for version in the next few lines + for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) { + if (lines[j].trim().startsWith('version = ')) { + lines[j] = `version = "${this.newVersion}"` + updated = true + break + } + } + } + + // Update workspace dependencies + if (line === '[workspace.dependencies]') { + // Look for dependency lines with inline versions + for (let j = i + 1; j < lines.length; j++) { + const depLine = lines[j].trim() + + // Skip empty lines and new sections + if (depLine === '' || depLine.startsWith('[')) { + break + } + + // Update lines that have version = "..." in them + if (depLine.includes('version = ')) { + // Replace the version part while preserving the rest + const updatedLine = depLine.replace(/version = "[^"]*"/, `version = "${this.newVersion}"`) + lines[j] = updatedLine + updated = true + } + } + } + } + + if (updated) { + writeFileSync(filePath, lines.join('\n')) + } else { + console.warn(`āš ļø Could not find version in ${filePath}`) + } + } + + /** + * Update workspace dependencies in root Cargo.toml + */ + private updateWorkspaceDependencies(filePath: string): void { + const content = readFileSync(filePath, 'utf-8') + const lines = content.split('\n') + + let inWorkspaceDeps = false + let updated = false + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim() + + if (line === '[workspace.dependencies]') { + inWorkspaceDeps = true + continue + } + + if (inWorkspaceDeps && line.startsWith('version = ')) { + lines[i] = `version = "${this.newVersion}"` + updated = true + } + + // Reset when we hit a new section + if (line.startsWith('[') && inWorkspaceDeps && line !== '[workspace.dependencies]') { + break + } + } + + if (updated) { + writeFileSync(filePath, lines.join('\n')) + } + } + + /** + * Update package.json file + */ + private updatePackageJson(filePath: string): void { + const content = readFileSync(filePath, 'utf-8') + const packageJson: PackageJson = JSON.parse(content) + + packageJson.version = this.newVersion + + // Write back with proper formatting + writeFileSync(filePath, JSON.stringify(packageJson, null, 2) + '\n') + } + + /** + * Get package name from package.json + */ + private getPackageName(filePath: string): string { + const content = readFileSync(filePath, 'utf-8') + const packageJson: PackageJson = JSON.parse(content) + return packageJson.name + } +} + +// CLI interface +function main() { + const args = process.argv.slice(2) + + // Parse options + const options: BumpOptions = {} + let version: string | null = null + + for (let i = 0; i < args.length; i++) { + const arg = args[i] + + if (arg === '--help' || arg === '-h') { + showHelp() + process.exit(0) + } else if (arg === '--skip-git') { + options.skipGit = true + } else if (arg === '--no-push') { + options.skipPush = true + } else if (arg === '--dry-run') { + options.dryRun = true + } else if (!arg.startsWith('-')) { + version = arg + } + } + + if (!version) { + console.error('āŒ Error: Version is required') + showHelp() + process.exit(1) + } + + const bumper = new VersionBumper(version, options) + bumper.bumpAll() +} + +function showHelp() { + console.log(` +Usage: pnpm bump:versions [options] + +Version Bump Script for Enclave Monorepo +Bumps all versions, generates changelog, commits, tags, and pushes to trigger release. + +Arguments: + version The new version (e.g., 1.0.0, 1.0.0-beta.1) + +Options: + --skip-git Skip all git operations (add, commit, tag, push) + --no-push Perform git operations but don't push (local only) + --dry-run Show what would be done without making changes + --help, -h Show this help message + +Examples: + # Full release (bump, commit, tag, push) + tsx scripts/bump-versions.ts 1.0.0 + + # Pre-release + tsx scripts/bump-versions.ts 1.0.0-beta.1 + + # Local only (don't push) + tsx scripts/bump-versions.ts --no-push 1.0.0 + + # Manual git operations + tsx scripts/bump-versions.ts --skip-git 1.0.0 + + # Test what would happen + tsx scripts/bump-versions.ts --dry-run 1.0.0 + +The script will: + 1. Check for uncommitted changes + 2. Update versions in all Rust crates and npm packages + 3. Update lock files (Cargo.lock, pnpm-lock.yaml) + 4. Generate/update CHANGELOG.md + 5. Commit changes with message: "chore(release): bump version to X.Y.Z" + 6. Create annotated tag: vX.Y.Z + 7. Push commits and tag to trigger the release workflow + +Note: Pushing the tag will automatically trigger the GitHub Actions release workflow. +`) +} + +// Run if called directly +if (require.main === module) { + main() +} + +export { VersionBumper }