lightningcss 1.0.0-alpha.71

A CSS parser, transformer, and minifier
Documentation
name: release
on:
  workflow_dispatch:

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        include:
          # Windows
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            binary: lightningcss.exe
          - os: windows-latest
            target: aarch64-pc-windows-msvc
            binary: lightningcss.exe
          # Mac OS
          - os: macos-latest
            target: x86_64-apple-darwin
            strip: strip -x # Must use -x on macOS. This produces larger results on linux.
            binary: lightningcss

    name: build-${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3
      - name: Install Node.JS
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup rust target
        run: rustup target add ${{ matrix.target }}

      - uses: bahmutov/npm-install@v1.8.32
      - name: Build release
        run: yarn build-release
        env:
          RUST_TARGET: ${{ matrix.target }}
      - name: Build CLI
        run: |
          cargo build --release --features cli --target ${{ matrix.target }}
          node -e "require('fs').renameSync('target/${{ matrix.target }}/release/${{ matrix.binary }}', '${{ matrix.binary }}')"
      - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
        if: ${{ matrix.strip }}
        run: ${{ matrix.strip }} *.node ${{ matrix.binary }}
      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: bindings-${{ matrix.target }}
          path: |
            *.node
            ${{ matrix.binary }}

  build-apple-silicon:
    name: build-apple-silicon
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Node.JS
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup rust target
        run: rustup target add aarch64-apple-darwin

      - uses: bahmutov/npm-install@v1.8.32
      - name: Build release
        run: yarn build-release
        env:
          RUST_TARGET: aarch64-apple-darwin
          JEMALLOC_SYS_WITH_LG_PAGE: 14
      - name: Build CLI
        run: |
          export CC=$(xcrun -f clang);
          export CXX=$(xcrun -f clang++);
          SYSROOT=$(xcrun --sdk macosx --show-sdk-path);
          export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT";
          export MACOSX_DEPLOYMENT_TARGET="10.9";
          cargo build --release --features cli --target aarch64-apple-darwin
          mv target/aarch64-apple-darwin/release/lightningcss lightningcss
        env:
          JEMALLOC_SYS_WITH_LG_PAGE: 14
      - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
        run: strip -x *.node lightningcss
      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: bindings-aarch64-apple-darwin
          path: |
            *.node
            lightningcss

  build-linux:
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: x86_64-unknown-linux-gnu
            strip: strip
            image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
            setup: npm install --global yarn@1
          - target: aarch64-unknown-linux-gnu
            strip: llvm-strip
            image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
          - target: aarch64-linux-android
            strip: llvm-strip
            image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
          - target: armv7-unknown-linux-gnueabihf
            strip: llvm-strip
            image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:c22284b2d79092d3e885f64ede00f6afdeb2ccef7e2b6e78be52e7909091cd57
          - target: aarch64-unknown-linux-musl
            image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:78c9ab1f117f8c535b93c4b91a2f19063dda6e4dba48a6187df49810625992c1
            strip: aarch64-linux-musl-strip
          - target: x86_64-unknown-linux-musl
            image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:78c9ab1f117f8c535b93c4b91a2f19063dda6e4dba48a6187df49810625992c1
            strip: strip

    name: build-${{ matrix.target }}
    runs-on: ubuntu-latest
    container:
      image: ${{ matrix.image }}

    steps:
      - uses: actions/checkout@v3
      - name: Install Node.JS
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup Android NDK
        if: ${{ matrix.target == 'aarch64-linux-android' }}
        run: |
          sudo apt update && sudo apt install unzip -y
          cd /tmp
          wget -q https://dl.google.com/android/repository/android-ndk-r28-linux.zip -O /tmp/ndk.zip
          unzip ndk.zip

      - name: Setup cross compile toolchain
        if: ${{ matrix.setup }}
        run: ${{ matrix.setup }}

      - name: Setup rust target
        run: rustup target add ${{ matrix.target }}

      - uses: bahmutov/npm-install@v1.8.32
      - name: Build release
        run: yarn build-release
        env:
          ANDROID_NDK_LATEST_HOME: /tmp/android-ndk-r28
          RUST_TARGET: ${{ matrix.target }}
      - name: Build CLI
        env:
          ANDROID_NDK_LATEST_HOME: /tmp/android-ndk-r28
        run: |
          yarn napi build --bin lightningcss --release --features cli --target ${{ matrix.target }}
          mv target/${{ matrix.target }}/release/lightningcss lightningcss
      - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
        if: ${{ matrix.strip }}
        run: ${{ matrix.strip }} *.node lightningcss
      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: bindings-${{ matrix.target }}
          path: |
            *.node
            lightningcss

  build-freebsd:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build FreeBSD
        uses: cross-platform-actions/action@v0.25.0
        env:
          DEBUG: napi:*
          RUSTUP_HOME: /usr/local/rustup
          CARGO_HOME: /usr/local/cargo
          RUSTUP_IO_THREADS: 1
        with:
          operating_system: freebsd
          version: '14.0'
          memory: 13G
          cpu_count: 3
          environment_variables: 'DEBUG RUSTUP_IO_THREADS'
          shell: bash
          run: |
            sudo pkg install -y -f curl node libnghttp2 npm yarn
            curl https://sh.rustup.rs -sSf --output rustup.sh
            sh rustup.sh -y --profile minimal --default-toolchain beta
            source "$HOME/.cargo/env"
            echo "~~~~ rustc --version ~~~~"
            rustc --version
            echo "~~~~ node -v ~~~~"
            node -v
            echo "~~~~ yarn --version ~~~~"
            yarn --version
            yarn install || true
            yarn build-release
            strip -x *.node
            cargo build --release --features cli
            mv target/release/lightningcss lightningcss
            node -e "require('.')"
            ./lightningcss --help
            rm -rf node_modules
            rm -rf target
            rm -rf .yarn/cache

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: bindings-x86_64-unknown-freebsd
          path: |
            *.node
            lightningcss

  build-wasm:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Node.JS
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - uses: bahmutov/npm-install@v1.8.32
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown
      - name: Setup rust target
        run: rustup target add wasm32-unknown-unknown
      - name: Install wasm-opt
        run: |
          curl -L -O https://github.com/WebAssembly/binaryen/releases/download/version_111/binaryen-version_111-x86_64-linux.tar.gz
          tar -xf binaryen-version_111-x86_64-linux.tar.gz
      - name: Build wasm
        run: |
          export PATH="$PATH:./binaryen-version_111/bin"
          yarn wasm:build-release
      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: wasm
          path: wasm/lightningcss_node.wasm

  release:
    runs-on: ubuntu-latest
    name: Build and release
    needs:
      - build
      - build-linux
      - build-apple-silicon
      - build-freebsd
      - build-wasm
    steps:
      - uses: actions/checkout@v3
      - uses: bahmutov/npm-install@v1.8.32
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts
      - name: Show artifacts
        run: ls -R artifacts
      - name: Build npm packages
        run: |
          node scripts/build-npm.js
          cp artifacts/wasm/* wasm/.
          node scripts/build-wasm.js
      - run: echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > ~/.npmrc
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
      - name: Publish to npm
        run: |
          for pkg in npm/*; do
            echo "Publishing $pkg..."
            cd $pkg;
            npm publish;
            cd ../..;
          done
          cd wasm
          echo "Publishing lightningcss-wasm...";
          npm publish
          cd ..
          cd cli
          echo "Publishing lightningcss-cli...";
          npm publish
          cd ..
          echo "Publishing lightningcss...";
          npm publish

  release-crates:
    runs-on: ubuntu-latest
    name: Release Rust crate
    steps:
      - uses: actions/checkout@v3
      - uses: bahmutov/npm-install@v1.8.32
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - run: cargo login ${CRATES_IO_TOKEN}
        env:
          CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
      - run: |
          cargo install cargo-workspaces
          cargo workspaces publish --no-remove-dev-deps --from-git -y