trunk 0.22.0

Build, bundle & ship your Rust WASM application to the web.
name: CI
on:
  push:
    branches:
      - main
      - release/*
  pull_request:
    branches:
      - main
      - release/*
  merge_group:
    types:
      - checks_requested

jobs:
  lint:
    runs-on: ubuntu-24.04
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v7

      - uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-lint-${{ hashFiles('**/Cargo.lock') }}

      - name: Setup | Disable rustup self-update
        # workaround for: https://github.com/rust-lang/rustup/issues/3709
        run: |
          rustup set auto-self-update disable

      - name: Setup | Toolchain (clippy)
        run: |
          rustup toolchain install stable --component clippy
          rustup default stable

      - name: Build | Clippy
        run: |
          cargo clippy --all-targets -- -D warnings
          cargo clippy --all-targets --no-default-features --features update_check,native-tls -- -D warnings
          cargo clippy --all-targets --no-default-features --features update_check,rustls-aws-lc -- -D warnings

      - name: Build | Rustfmt
        run: cargo fmt -- --check

  docs:
    uses: ./.github/workflows/docs.yaml

  check:
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        rust:
          - stable
          - 1.96.1 # MSRV
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v7

      - name: Setup | Cache Cargo
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-check-${{ matrix.rust }}-${{ hashFiles('**/Cargo.lock') }}

      - name: Setup | Disable rustup self-update
        # workaround for: https://github.com/rust-lang/rustup/issues/3709
        run: |
          rustup set auto-self-update disable

      - name: Setup | Rust
        run: |
          rustup toolchain install ${{ matrix.rust }}
          rustup default ${{ matrix.rust }}

      - name: Build | Check
        run: cargo check --all

      - name: Setup | binstall
        run: |
          curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash

      - name: Setup | check-all-features
        run: |
          cargo binstall -y cargo-all-features

      - name: Build | Check all features
        run: |
          cargo all-features check --features native-tls
          cargo all-features check --features rustls
          cargo all-features check --features rustls-aws-lc

      - name: Build | Reject invalid TLS feature sets
        if: matrix.rust == 'stable'
        shell: bash
        run: |
          ! cargo check --no-default-features
          ! cargo check --no-default-features --features native-tls,rustls
          ! cargo check --no-default-features --features native-tls,rustls-aws-lc
          ! cargo check --no-default-features --features rustls,rustls-aws-lc

  test:
    needs: check # Ensure check is run first.
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-24.04, macos-15, windows-2025 ]
        include:
          - os: ubuntu-24.04
            binPath: target/debug/trunk
            install: |
              sudo apt install -y libssl-dev
          - os: macos-15
            binPath: target/debug/trunk
          - os: windows-2025
            binPath: target/debug/trunk.exe

    runs-on: ${{ matrix.os }}

    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v7

      - name: Setup | Cache Cargo
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-test-${{ hashFiles('**/Cargo.lock') }}

      - name: Setup | Install dependencies
        run: ${{ matrix.install }}

      - name: Build | Test
        run: |
          cargo test
          cargo test --locked --no-default-features --features update_check,native-tls tls::tests # Default features use rustls and skip native TLS tests.

      # Run the CLI to ensure we don't have any subtle runtime issues.
      - name: Build | Run
        run: cargo run -- -h

      # Upload the debug binary for testing examples later
      - name: Upload | For testing
        uses: actions/upload-artifact@v7
        with:
          name: test-cli-${{ matrix.os }}
          path: ${{ matrix.binPath }}
          if-no-files-found: error

  test-examples:
    needs: test # Ensure test is run first.
    strategy:
      fail-fast: false
      max-parallel: 32
      matrix:
        os: [ ubuntu-24.04, macos-15, windows-2025 ]
        example:
          - cargo-manifest
          - cdylib
          - hooks
          - initializer
          - leptos
          - no-rust
          - node-module
          - proxy
          - seed
          - target-path
          - vanilla
          - webworker
          - webworker-gloo
          - webworker-module
          - wasm_threads
          - yew
          - yew-tailwindcss
          - yew-tls

    runs-on: ${{ matrix.os }}

    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v7

      - name: Setup | Disable rustup self-update
        # workaround for: https://github.com/rust-lang/rustup/issues/3709
        run: |
          rustup set auto-self-update disable

      - name: Setup | Rust
        run: |
          rustup toolchain install stable --target wasm32-unknown-unknown
          rustup default stable

      - name: Setup | Download CLI
        uses: actions/download-artifact@v8
        with:
          name: test-cli-${{ matrix.os }}

      - name: Setup | Make executable
        if: ${{ !contains(matrix.os, 'windows') }}
        run: chmod a+x $GITHUB_WORKSPACE/trunk

      - name: Setup | Cache | Example ${{ matrix.example }} on ${{ matrix.os }}
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            examples/${{ matrix.example }}/target
          key: wasm32-example-${{ matrix.example }}-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }}

      - name: Build | Examples | ${{ matrix.example }} on ${{ matrix.os }}
        shell: bash
        env:
          # for the CI we need to disable those checks, as we may run with a pre-release version, which would force us to
          # replace all version requirements with pre-release requirements for this version.
          TRUNK_REQUIRED_VERSION: '*'
        run: |
          $GITHUB_WORKSPACE/trunk --config=examples/${{ matrix.example }} build

  tests:
    runs-on: ubuntu-slim
    needs:
      - test
      - test-examples
    if: always()
    steps:
      - name: Success
        if: ${{ !(contains(needs.*.result, 'failure')) }}
        run: exit 0
      - name: Failure
        if: ${{ contains(needs.*.result, 'failure') }}
        run: exit 1

  uncommitted:
    runs-on: ubuntu-24.04
    needs:
      - test
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v7

      - name: Setup | Download CLI
        uses: actions/download-artifact@v8
        with:
          name: test-cli-ubuntu-24.04

      - name: Setup | Make executable
        run: chmod a+x $GITHUB_WORKSPACE/trunk

      - name: Generate | Config Schema
        run: |
          $GITHUB_WORKSPACE/trunk config generate-schema schemas/config.json

      - name: Diff | Config Schema
        run: |
          if ! git diff --quiet schemas/config.json; then
              echo "::error::Uncommitted changes for schemas/config.json (run 'cargo run -- config generate-schema schemas/config.json' after making changes to the configuration model)"
              exit 1
          fi