Bump the npm_and_yarn group across 11 directories with 8 updates #2269
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI - BAML Language | |
| permissions: | |
| contents: read | |
| id-token: write | |
| pull-requests: write | |
| on: | |
| push: | |
| branches: [main, canary] | |
| pull_request: | |
| merge_group: | |
| types: [checks_requested] | |
| workflow_dispatch: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }} | |
| cancel-in-progress: true | |
| defaults: | |
| run: | |
| shell: bash | |
| env: | |
| CARGO_INCREMENTAL: 0 | |
| CARGO_NET_RETRY: 10 | |
| CARGO_TERM_COLOR: always | |
| RUSTUP_MAX_RETRIES: 10 | |
| jobs: | |
| determine_changes: | |
| name: "Determine changes" | |
| runs-on: ubuntu-latest | |
| outputs: | |
| # Flag that is raised when any code in baml_language is changed | |
| code: ${{ steps.check_code.outputs.changed }} | |
| # Flag for lexer changes | |
| lexer: ${{ steps.check_lexer.outputs.changed }} | |
| # Flag for parser changes | |
| parser: ${{ steps.check_parser.outputs.changed }} | |
| # Flag for HIR changes | |
| hir: ${{ steps.check_hir.outputs.changed }} | |
| # Flag for THIR changes | |
| thir: ${{ steps.check_thir.outputs.changed }} | |
| # Flag for codegen changes | |
| codegen: ${{ steps.check_codegen.outputs.changed }} | |
| # Flag for BEP changes | |
| beps: ${{ steps.check_beps.outputs.changed }} | |
| # Flag for docs/frontend changes | |
| docs: ${{ steps.check_docs.outputs.changed }} | |
| # Flag for typescript2/webview changes | |
| webview: ${{ steps.check_webview.outputs.changed }} | |
| # Flag for unsafe code changes (bex_heap) - triggers Miri tests | |
| unsafe: ${{ steps.check_unsafe.outputs.changed }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| persist-credentials: false | |
| - name: Determine merge base | |
| id: merge_base | |
| env: | |
| BASE_REF: ${{ github.event.pull_request.base.ref || 'canary' }} | |
| run: | | |
| sha=$(git merge-base HEAD "origin/${BASE_REF}") | |
| echo "sha=${sha}" >> "$GITHUB_OUTPUT" | |
| - name: Check if code changed | |
| id: check_code | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/**' \ | |
| ':.github/workflows/ci.yaml' \ | |
| ':.github/workflows/cargo-tests.reusable.yaml' \ | |
| ':.github/workflows/wasm-pack-tests.reusable.yaml' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if lexer code changed | |
| id: check_lexer | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/crates/baml_compiler_lexer/**' \ | |
| ':baml_language/crates/baml_base/**' \ | |
| ':baml_language/Cargo.toml' \ | |
| ':baml_language/Cargo.lock' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if parser code changed | |
| id: check_parser | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/crates/baml_compiler_parser/**' \ | |
| ':baml_language/crates/baml_compiler_syntax/**' \ | |
| ':baml_language/crates/baml_compiler_lexer/**' \ | |
| ':baml_language/crates/baml_base/**' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if HIR code changed | |
| id: check_hir | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/crates/baml_compiler_hir/**' \ | |
| ':baml_language/crates/baml_workspace/**' \ | |
| ':baml_language/crates/baml_compiler_parser/**' \ | |
| ':baml_language/crates/baml_base/**' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if THIR code changed | |
| id: check_thir | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/crates/baml_thir/**' \ | |
| ':baml_language/crates/baml_compiler_hir/**' \ | |
| ':baml_language/crates/baml_base/**' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if codegen code changed | |
| id: check_codegen | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/crates/baml_compiler_emit/**' \ | |
| ':baml_language/crates/baml_thir/**' \ | |
| ':baml_language/crates/baml_base/**' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if BEPs changed | |
| id: check_beps | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':beps/**' \ | |
| ':.github/workflows/beps.reusable.yaml' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if docs changed | |
| id: check_docs | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':fern/**' \ | |
| ':typescript/apps/ask-baml-client/**' \ | |
| ':typescript/apps/sage-backend/**' \ | |
| ':.github/workflows/docs.reusable.yaml' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if webview changed | |
| id: check_webview | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':typescript2/app-vscode-webview/**' \ | |
| ':typescript2/pkg-playground/**' \ | |
| ':baml_language/crates/baml_playground_wasm/**' \ | |
| ':.github/workflows/webview-tests.reusable.yaml' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Check if unsafe code changed | |
| id: check_unsafe | |
| env: | |
| MERGE_BASE: ${{ steps.merge_base.outputs.sha }} | |
| run: | | |
| if git diff --quiet "${MERGE_BASE}...HEAD" -- \ | |
| ':baml_language/crates/bex_heap/**' \ | |
| ; then | |
| echo "changed=false" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "changed=true" >> "$GITHUB_OUTPUT" | |
| fi | |
| # Lint checks | |
| prek: | |
| name: "Pre-commit Checks" | |
| runs-on: ubuntu-latest | |
| needs: determine_changes | |
| if: needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/canary' | |
| timeout-minutes: 15 | |
| steps: | |
| - name: "Checkout Branch" | |
| uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| # Install Rust toolchain BEFORE rust-cache so cache key uses correct Rust version | |
| - name: "Install Rust toolchain" | |
| run: rustup toolchain install | |
| working-directory: baml_language | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| workspaces: "baml_language -> target" | |
| # Share cache across similar Linux jobs for better hit rates | |
| shared-key: "linux-cargo" | |
| - name: "Install cargo-binstall" | |
| run: | | |
| curl -L --proto '=https' --tlsv1.2 -sSf \ | |
| https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh \ | |
| | bash | |
| working-directory: baml_language | |
| - name: "Install uv" | |
| uses: astral-sh/setup-uv@v5 | |
| - name: "Install mise" | |
| uses: jdx/mise-action@v2 | |
| # Pinning to old version because newer versions time out on the npm backend, | |
| # see https://github.com/jdx/mise/discussions/7630 | |
| with: | |
| version: 2025.12.12 | |
| - name: "Cache prek" | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pre-commit | |
| key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} | |
| - name: "Run prek" | |
| run: | | |
| echo '```console' > "$GITHUB_STEP_SUMMARY" | |
| # Enable color output for prek and remove it for the summary | |
| # Use --hook-stage=manual to enable slower hooks that are skipped by default | |
| SKIP=no-commit-to-branch prek run --all-files --show-diff-on-failure --color always --hook-stage manual | \ | |
| tee >(sed -E 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[mGK]//g' >> "$GITHUB_STEP_SUMMARY") >&1 | |
| exit_code="${PIPESTATUS[0]}" | |
| echo '```' >> "$GITHUB_STEP_SUMMARY" | |
| exit "$exit_code" | |
| # Call reusable workflows | |
| cargo-tests: | |
| name: "Cargo Tests" | |
| needs: determine_changes | |
| uses: ./.github/workflows/cargo-tests.reusable.yaml | |
| with: | |
| code_changed: ${{ needs.determine_changes.outputs.code }} | |
| run_all: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/canary' }} | |
| secrets: inherit | |
| wasm-pack-tests: | |
| name: "WASM Pack Tests" | |
| needs: determine_changes | |
| if: needs.determine_changes.outputs.code == 'true' || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/canary' | |
| uses: ./.github/workflows/wasm-pack-tests.reusable.yaml | |
| secrets: inherit | |
| beps: | |
| name: "BEPs" | |
| needs: determine_changes | |
| uses: ./.github/workflows/beps.reusable.yaml | |
| with: | |
| beps_changed: ${{ needs.determine_changes.outputs.beps }} | |
| is_canary: ${{ github.ref == 'refs/heads/canary' }} | |
| is_pr: ${{ github.event_name == 'pull_request' }} | |
| secrets: inherit | |
| permissions: | |
| id-token: write | |
| contents: read | |
| pull-requests: write | |
| deployments: write | |
| docs: | |
| name: "Docs" | |
| needs: determine_changes | |
| uses: ./.github/workflows/docs.reusable.yaml | |
| with: | |
| docs_changed: ${{ needs.determine_changes.outputs.docs }} | |
| is_canary: ${{ github.ref == 'refs/heads/canary' }} | |
| secrets: inherit | |
| permissions: write-all | |
| webview-tests: | |
| name: "Webview Tests" | |
| needs: determine_changes | |
| if: needs.determine_changes.outputs.webview == 'true' || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/canary' | |
| uses: ./.github/workflows/webview-tests.reusable.yaml | |
| secrets: inherit | |
| miri-tests: | |
| name: "Miri (unsafe code verification)" | |
| runs-on: ubuntu-latest | |
| needs: determine_changes | |
| if: needs.determine_changes.outputs.unsafe == 'true' | |
| timeout-minutes: 20 | |
| steps: | |
| - name: "Checkout" | |
| uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: "Install Rust nightly and Miri" | |
| run: | | |
| rustup toolchain install nightly --component miri | |
| rustup override set nightly | |
| working-directory: baml_language | |
| - name: "Run Miri tests on bex_heap" | |
| run: cargo miri test -p bex_heap --lib | |
| working-directory: baml_language | |
| benchmarks-instrumented: | |
| name: "benchmarks instrumented (baml)" | |
| runs-on: ubuntu-latest | |
| needs: determine_changes | |
| # Skip benchmarks in merge_group - they already ran in the PR | |
| if: | | |
| github.event_name != 'merge_group' && | |
| ( | |
| github.ref == 'refs/heads/main' || | |
| github.ref == 'refs/heads/canary' || | |
| contains(github.event.pull_request.body, 'RUN_CODSPEED=1') || | |
| needs.determine_changes.outputs.lexer == 'true' || | |
| needs.determine_changes.outputs.parser == 'true' || | |
| needs.determine_changes.outputs.hir == 'true' || | |
| needs.determine_changes.outputs.thir == 'true' || | |
| needs.determine_changes.outputs.codegen == 'true' | |
| ) | |
| timeout-minutes: 20 | |
| steps: | |
| - name: "Checkout Branch" | |
| uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| # Install Rust toolchain BEFORE rust-cache so cache key uses correct Rust version | |
| - name: "Install Rust toolchain" | |
| run: rustup show | |
| working-directory: baml_language | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| workspaces: "baml_language -> target" | |
| # Share cache across similar Linux jobs for better hit rates | |
| shared-key: "linux-cargo" | |
| - name: "Install codspeed" | |
| uses: taiki-e/install-action@v2 | |
| with: | |
| tool: cargo-codspeed | |
| - name: "Build benchmarks" | |
| run: cargo codspeed build -p baml_tests -m walltime | |
| working-directory: baml_language | |
| - name: "Run benchmarks" | |
| uses: CodSpeedHQ/action@v3 | |
| with: | |
| mode: walltime | |
| run: cd baml_language && cargo codspeed run | |
| token: ${{ secrets.CODSPEED_TOKEN }} | |
| # CI Failure Alert - Required status check using "skipped = success" pattern | |
| # See: https://devopsdirective.com/posts/2025/08/github-actions-required-checks-for-conditional-jobs/ | |
| # | |
| # This job exploits GitHub's behavior where skipped jobs report as "Success". | |
| # - When all tests pass (or are intentionally skipped): this job SKIPS → reports SUCCESS | |
| # - When any test fails or is cancelled: this job RUNS and FAILS → blocks merge | |
| # | |
| # Configure "CI - BAML Language / CI Failure Alert" as a required status check. | |
| ci-failure-alert: | |
| name: "CI-v2 Failure Alert" | |
| runs-on: ubuntu-latest | |
| needs: | |
| - prek | |
| - cargo-tests | |
| - wasm-pack-tests | |
| - beps | |
| - docs | |
| - webview-tests | |
| - miri-tests | |
| - benchmarks-instrumented | |
| # Only run if something failed or was cancelled (otherwise skip → success) | |
| if: ${{ failure() || cancelled() }} | |
| steps: | |
| - name: Report failure | |
| run: | | |
| echo "## ❌ CI Failed" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "One or more required jobs failed or were cancelled." >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "| Job | Result |" >> $GITHUB_STEP_SUMMARY | |
| echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| prek | ${{ needs.prek.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| cargo-tests | ${{ needs.cargo-tests.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| wasm-pack-tests | ${{ needs.wasm-pack-tests.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| beps | ${{ needs.beps.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| docs | ${{ needs.docs.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| webview-tests | ${{ needs.webview-tests.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| miri-tests | ${{ needs.miri-tests.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| benchmarks-instrumented | ${{ needs.benchmarks-instrumented.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "::error::One or more CI jobs failed!" | |
| exit 1 |