name: build_and_test
on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main
      - v*
    tags:
      - v*
env:
  FLOW_BIN_PRIVATE_KEY_BASE64: ${{ secrets.FLOW_BIN_PRIVATE_KEY_BASE64 }}
  FLOW_BOT_EMAIL: ${{ secrets.FLOW_BOT_EMAIL }}
  FLOW_BOT_TOKEN: ${{ secrets.FLOW_BOT_TOKEN }}
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
jobs:
  build_js:
    runs-on: ubuntu-22.04
    env:
      TERM: dumb
      OPAMYES: true
    steps:
    - uses: actions/checkout@v3.6.0
    - name: Install OPAM
      uses: ./.github/actions/install-opam-linux
      with:
        arch: x86_64
    - name: Create cache breaker
      run: .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: .circleci/opam_init.sh
    - name: Install deps from opam
      run: make deps
      shell: bash
    - name: Install extra deps from opam
      run: make deps-js
    - name: Build flow.js
      run: opam exec -- make js
    - name: Test flow.js
      run: opam exec -- make do-test-js
    - name: Build flow_parser.js
      run: opam exec -- make -C src/parser js
    - name: Create artifacts
      run: |-
        mkdir -p dist
        cp src/parser/flow_parser.js dist/flow_parser.js
        cp src/parser/flow_parser.js packages/flow-parser/flow_parser.js
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_js_bin
        path: bin/flow.js
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_js_dist
        path: dist/flow_parser.js
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_js_packages
        path: packages/flow-parser/flow_parser.js
  build_linux:
    runs-on: ubuntu-22.04
    env:
      TERM: dumb
      OPAMYES: true
    steps:
    - uses: actions/checkout@v3.6.0
    - name: Install OPAM
      uses: ./.github/actions/install-opam-linux
      with:
        arch: x86_64
    - name: Create cache breaker
      run: .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: .circleci/opam_init.sh
    - name: Install deps from opam
      run: make deps
      shell: bash
    - name: Install extra deps from opam
      run: make deps-js
    - name: Build flow
      run: |-
        opam exec -- make bin/flow dist/flow.zip
        mkdir -p bin/linux && cp bin/flow bin/linux/flow
    - name: Build libflowparser
      run: opam exec -- make -C src/parser dist/libflowparser.zip
    - name: Create artifacts
      run: |-
        cp dist/flow.zip dist/flow-linux64.zip
        cp src/parser/dist/libflowparser.zip dist/libflowparser-linux64.zip
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_linux_bin
        path: bin/linux/flow
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_linux_dist
        path: |
          dist/flow-linux64.zip
          dist/libflowparser-linux64.zip
  build_linux_arm64:
    runs-on: 4-core-ubuntu-arm
    env:
      TERM: dumb
      OPAMYES: true
    steps:
    - uses: actions/checkout@v3.6.0
    - name: Install Missing Tools
      run: |
        sudo apt-get update
        sudo apt-get install bzip2 gcc g++ rsync patch diffutils curl make zip unzip git m4 perl -y
    - name: Install OPAM
      uses: ./.github/actions/install-opam-linux
      with:
        arch: arm64
    - name: Create cache breaker
      run: .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: .circleci/opam_init.sh
    - name: Install deps from opam
      run: make deps
      shell: bash
    - name: Build flow
      run: |-
        opam exec -- make bin/flow dist/flow.zip
        mkdir -p bin/linux && cp bin/flow bin/linux/flow
    - name: Build libflowparser
      run: opam exec -- make -C src/parser dist/libflowparser.zip
    - name: Create artifacts
      run: |-
        cp dist/flow.zip dist/flow-linux64-arm64.zip
        cp src/parser/dist/libflowparser.zip dist/libflowparser-linux64-arm64.zip
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_linux_arm64_dist
        path: |
          dist/flow-linux64-arm64.zip
  build_macos_x86:
    runs-on: macos-13-xlarge
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: maxim-lobanov/setup-xcode@v1.6.0
      with:
        xcode-version: '14.3.1'
    - name: Update curl cacerts
      run: echo "cacert $GITHUB_WORKSPACE/.circleci/cacert.pem" >> ~/.curlrc
    - uses: ./.github/actions/install-opam-mac
      with:
        arch: x86_64
    - name: Create cache breaker
      run: arch --x86_64 .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-cache-${{ runner.os }}-x86_64_on_arm-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: arch --x86_64 .circleci/opam_init.sh
    - name: Install deps from opam
      run: arch --x86_64 make deps
      shell: bash
    - name: Build flow
      run: |-
        arch --x86_64 opam exec -- make bin/flow dist/flow.zip
        mkdir -p bin/macos && cp bin/flow bin/macos/flow
    - name: Build libflowparser
      run: arch --x86_64 opam exec -- make -C src/parser dist/libflowparser.zip
    - name: Create artifacts
      run: |-
        cp dist/flow.zip dist/flow-osx.zip
        cp src/parser/dist/libflowparser.zip dist/libflowparser-osx.zip
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_macos_bin
        path: bin/macos/flow
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_macos_dist
        path: |
          dist/flow-osx.zip
          dist/libflowparser-osx.zip
  build_macos_arm64:
    runs-on: macos-13-xlarge
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: maxim-lobanov/setup-xcode@v1.6.0
      with:
        xcode-version: '14.3.1'
    - name: Update curl cacerts
      run: echo "cacert $GITHUB_WORKSPACE/.circleci/cacert.pem" >> ~/.curlrc
    - uses: ./.github/actions/install-opam-mac
      with:
        arch: arm64
    - name: Create cache breaker
      run: .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: .circleci/opam_init.sh
    - name: Install deps from opam
      run: make deps
      shell: bash
    - name: Build flow
      run: |-
        opam exec -- make bin/flow dist/flow.zip
        mkdir -p bin/macos-arm64 && cp bin/flow bin/macos-arm64/flow
    - name: Build libflowparser
      run: opam exec -- make -C src/parser dist/libflowparser.zip
    - name: Create artifacts
      run: |-
        cp dist/flow.zip dist/flow-osx-arm64.zip
        cp src/parser/dist/libflowparser.zip dist/libflowparser-osx-arm64.zip
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_macos_arm64_bin
        path: bin/macos-arm64/flow
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_macos_arm64_dist
        path: |
          dist/flow-osx-arm64.zip
          dist/libflowparser-osx-arm64.zip
  build_win:
    runs-on: windows-2022
    env:
      OPAMDOWNLOADJOBS: 1
    steps:
    - uses: actions/checkout@v3.6.0
    - name: Install dependencies
      run: |
        choco install --no-progress -y --source https://chocolatey.org/api/v2/ 7zip
        setx /M PATH $($Env:PATH + ';C:\Program Files\7-Zip')
      shell: pwsh
    - name: Install cygwin
      uses: cygwin/cygwin-install-action@master
      with:
        packages: >-
          rsync
          patch
          diffutils
          curl
          make
          zip
          unzip
          git
          m4
          perl
          mingw64-x86_64-gcc-core
          mingw64-x86_64-gcc-g++
          mingw64-x86_64-gcc-libs
          coreutils
          moreutils
    - name: Git Safe Directory
      run: |
        git config --global --add safe.directory /cygdrive/c/a/flow/flow
        git config --global --add safe.directory /cygdrive/d/a/flow/flow
      shell: C:\cygwin\bin\bash.exe '{0}'
      env:
        PATH: /usr/local/bin:/usr/bin:/cygdrive/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0
    - name: Install opam
      run: .\scripts\windows\install_opam.ps1
      shell: pwsh
    - name: Init opam
      run: opam init --bare --disable-sandboxing --no-setup --yes
      shell: C:\cygwin\bin\bash.exe '{0}'
      env:
        PATH: /usr/local/bin:/usr/bin:/cygdrive/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0
    - name: Create opam switch
      run: make deps
      shell: D:\cygwin\bin\bash.exe '{0}'
      env:
        PATH: /usr/local/bin:/usr/bin:/cygdrive/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0
    - name: Build flow.exe
      run: >-
        cd $(realpath ${GITHUB_WORKSPACE});
        echo $(opam env);
        eval $(opam env);
        make bin/flow.exe dist/flow.zip;
        mkdir -p bin/win64 && cp bin/flow.exe bin/win64/flow.exe;
        cp dist/flow.zip dist/flow-win64.zip
      shell: D:\cygwin\bin\bash.exe -leo pipefail '{0}'
      env:
        PATH: /usr/local/bin:/usr/bin:/cygdrive/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0
    - name: Build parser test runner
      run: >-
        cd $(realpath ${GITHUB_WORKSPACE}) ;
        eval $(opam env) ;
        dune build src/parser/test/run_tests.exe ;
        cp _build/default/src/parser/test/run_tests.exe bin/win64/run_parser_tests.exe
      shell: D:\cygwin\bin\bash.exe -leo pipefail '{0}'
      env:
        PATH: /usr/local/bin:/usr/bin:/cygdrive/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_win_bin
        path: |
          bin/win64/flow.exe
          bin/win64/run_parser_tests.exe
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: build_win_dist
        path: |
          dist/flow-win64.zip
  runtests_linux:
    runs-on: ubuntu-22.04
    needs:
    - build_linux
    env:
      FLOW_RUNTESTS_PARALLELISM: 8
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_bin
        path: bin/linux
    - run: chmod +x bin/linux/flow
    - name: Run tests
      run: ./runtests.sh bin/linux/flow
  runtests_macos_x86:
    runs-on: macos-13
    needs:
    - build_macos_x86
    steps:
    - uses: maxim-lobanov/setup-xcode@v1.6.0
      with:
        xcode-version: '14.3.1'
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_bin
        path: bin/macos
    - run: chmod +x bin/macos/flow
    - name: Run tests
      run: ./runtests.sh bin/macos/flow
  runtests_macos_arm:
    runs-on: macos-15
    needs:
    - build_macos_arm64
    steps:
    - uses: maxim-lobanov/setup-xcode@v1.6.0
      with:
        xcode-version: '16.1.0'
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_arm64_bin
        path: bin/macos
    - run: chmod +x bin/macos/flow
    - name: Run tests
      run: ./runtests.sh bin/macos/flow
  tool_test_linux:
    runs-on: ubuntu-22.04
    needs:
    - build_linux
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_bin
        path: bin/linux
    - run: chmod +x bin/linux/flow
    - name: Install tool deps from yarn
      run: (cd packages/flow-dev-tools && yarn install | cat)
    - name: Run tool tests
      run: ./tool test -p 4 --bin bin/linux/flow
  tool_test_macos:
    runs-on: macos-15
    needs:
    - build_macos_arm64
    steps:
    - uses: maxim-lobanov/setup-xcode@v1.6.0
      with:
        xcode-version: '16.1.0'
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_arm64_bin
        path: bin/macos
    - run: chmod +x bin/macos/flow
    - name: Install tool deps from yarn
      run: (cd packages/flow-dev-tools && yarn install | cat)
    - name: Run tool tests
      run: ./tool test --bin bin/macos/flow
  tool_test_win:
    runs-on: windows-2022
    needs:
    - build_win
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_win_bin
        path: bin/win64
    - name: Install tool deps from yarn
      run: |-
        cd packages/flow-dev-tools
        yarn install --ignore-scripts --pure-lockfile
    - name: Set TMP env var for consistency
      run: |-
        echo "TMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV
        echo "TEMP=$env:USERPROFILE\AppData\Local\Temp" >> $env:GITHUB_ENV
    - name: Run tool tests
      run: node packages/flow-dev-tools/bin/tool test --bin bin/win64/flow.exe --parallelism 1
  ounit_test_linux:
    runs-on: ubuntu-22.04
    env:
      TERM: dumb
      OPAMYES: true
    steps:
    - uses: actions/checkout@v3.6.0
    - name: Install OPAM
      uses: ./.github/actions/install-opam-linux
      with:
        arch: x86_64
    - name: Create cache breaker
      run: .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-ounit-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: .circleci/opam_init.sh
    - name: Install deps from opam
      run: make deps
      shell: bash
    - name: Install extra deps from opam
      run: make deps-test | cat
    - name: Run ounit tests
      run: opam exec -- make ounit-tests-ci
  ounit_test_macos:
    runs-on: macos-13-xlarge
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: maxim-lobanov/setup-xcode@v1.6.0
      with:
        xcode-version: '14.3.1'
    - name: Update curl cacerts
      run: echo "cacert $GITHUB_WORKSPACE/.circleci/cacert.pem" >> ~/.curlrc
    - uses: ./.github/actions/install-opam-mac
      with:
        arch: arm64
    - name: Create cache breaker
      run: .circleci/make_opam_cachebreaker.sh > .circleci/opamcachebreaker
      shell: bash
    - name: opam cache
      uses: actions/cache@v4
      with:
        path: |-
          ~/.opam
          _opam
        key: v1-opam-ounit-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.circleci/opamcachebreaker') }}
    - name: Init opam
      run: .circleci/opam_init.sh
    - name: Install deps from opam
      run: make deps
      shell: bash
    - name: Install extra deps from opam
      run: make deps-test | cat
    - name: Run ounit tests
      run: opam exec -- make ounit-tests-ci
  parser_test_win:
    runs-on: windows-latest
    needs:
    - build_win
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_win_bin
        path: bin/win64
    - name: Test parser
      run: |-
        .\bin\win64\run_parser_tests.exe .\src\parser\test\flow\
        if ($LASTEXITCODE -gt 0) {
          Throw "flow parser hardcoded ocaml tests exited with error code: $LASTEXITCODE"
        }
        .\bin\win64\run_parser_tests.exe .\src\parser\test\esprima\
        if ($LASTEXITCODE -gt 0) {
          Throw "flow parser esprima ocaml tests exited with error code: $LASTEXITCODE"
        }
  npm_pack:
    runs-on: ubuntu-22.04
    needs:
    - build_js
    - build_linux
    - build_macos_x86
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_js_bin
        path: bin
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_js_dist
        path: dist
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_js_packages
        path: packages/flow-parser
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_bin
        path: bin/linux
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_dist
        path: dist
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_bin
        path: bin/macos
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_dist
        path: dist
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_arm64_bin
        path: bin/macos-arm64
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_arm64_dist
        path: dist
    - name: Pack flow-parser
      run: |
        mkdir -p packages/flow-parser/dist/
        pwd
        ls -lR .
        cp dist/flow_parser.js packages/flow-parser/dist/flow_parser.js
        make dist/npm-flow-parser.tgz
    - name: Pack flow-parser-bin
      run: |
        mkdir -p packages/flow-parser-bin/dist/release/
        cp dist/libflowparser-linux64.zip packages/flow-parser-bin/dist/release/libflowparser-linux64.zip
        cp dist/libflowparser-osx.zip packages/flow-parser-bin/dist/release/libflowparser-osx.zip
        make dist/npm-flow-parser-bin.tgz
    - name: Pack flow-remove-types and flow-node
      run: |
        rm -rf packages/flow-node
        cp -r packages/flow-remove-types/ packages/flow-node/
        sed -i '0,/flow-remove-types/s//flow-node/' packages/flow-node/package.json
        make dist/npm-flow-remove-types.tgz
        make dist/npm-flow-node.tgz
    - uses: actions/upload-artifact@v4.4.0
      with:
        name: npm_pack
        path: |
          dist/npm-flow-parser.tgz
          dist/npm-flow-parser-bin.tgz
          dist/npm-flow-node.tgz
          dist/npm-flow-remove-types.tgz
    - name: Deploy to npm
      if: contains(github.event_name, 'push') && startsWith( github.ref, 'refs/tags/v' )
      run: .circleci/deploy_npm.sh
  website_deploy:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-22.04
    needs:
    - build_linux
    - build_js
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_bin
        path: bin/linux
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_js_bin
        path: dist
    - run: chmod +x bin/linux/flow
    - uses: actions/setup-node@v4
      with:
        node-version: '22.x'
    - name: Node cache
      uses: actions/cache@v4
      with:
        key: v2-website-${{ github.ref_name }}-${{ hashFiles('website/yarn.lock') }}
        path: website/node_modules
    - name: Install yarn deps
      run: cd website && yarn install
    - name: Build website
      run: PATH=${{ github.workspace }}/bin/linux:$PATH .circleci/build_website.sh
    - name: Publish website to GitHub Pages
      run: |-
        cd website
        yarn add gh-pages
        yarn gh-pages -d build -u "flow-bot <flow-bot@users.noreply.github.com>" --repo https://${FLOW_BOT_TOKEN}@github.com/facebook/flow.git --no-history
  # Deploy jobs
  github_upload:
    if: contains(github.event_name, 'push') && startsWith( github.ref, 'refs/tags/v' )
    runs-on: ubuntu-22.04
    needs:
    - build_linux
    - build_linux_arm64
    - build_macos_x86
    - build_macos_arm64
    - build_win
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_dist
        path: dist
    - name: Upload Linux binary (x86_64)
      run: .circleci/github_upload.sh dist/flow-linux64.zip "flow-linux64-${{ github.ref_name }}.zip"
    - name: Upload Linux libflowparser (x86_64)
      run: .circleci/github_upload.sh dist/libflowparser-linux64.zip "libflowparser-linux64-${{ github.ref_name }}.zip"
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_linux_arm64_dist
        path: dist
    - name: Upload Linux binary (arm64)
      run: .circleci/github_upload.sh dist/flow-linux64-arm64.zip "flow-linux-arm64-${{ github.ref_name }}.zip"
    - name: Upload Linux libflowparser (arm64)
      run: .circleci/github_upload.sh dist/libflowparser-linux64-arm64.zip "libflowparser-linux-arm64-${{ github.ref_name }}.zip"
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_dist
        path: dist
    - name: Upload Mac binary (x86_64)
      run: .circleci/github_upload.sh dist/flow-osx.zip "flow-osx-${{ github.ref_name }}.zip"
    - name: Upload Mac libflowparser (x86_64)
      run: .circleci/github_upload.sh dist/libflowparser-osx.zip "libflowparser-osx-${{ github.ref_name }}.zip"
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_macos_arm64_dist
        path: dist
    - name: Upload Mac binary (arm64)
      run: .circleci/github_upload.sh dist/flow-osx-arm64.zip "flow-osx-arm64-${{ github.ref_name }}.zip"
    - name: Upload Mac libflowparser (arm64)
      run: .circleci/github_upload.sh dist/libflowparser-osx-arm64.zip "libflowparser-osx-arm64-${{ github.ref_name }}.zip"
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_win_dist
        path: dist
    - name: Upload Windows binary
      run: .circleci/github_upload.sh dist/flow-win64.zip "flow-win64-${{ github.ref_name }}.zip"
  flow_bin_deploy:
    if: contains(github.event_name, 'push') && startsWith( github.ref, 'refs/tags/v' )
    runs-on: ubuntu-22.04
    needs:
    - github_upload
    steps:
    - uses: actions/checkout@v3.6.0
    - name: Deploy flow-bin
      run: .circleci/deploy_flow_bin.sh
    - uses: facebook/dotslash-publish-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        config: .github/dotslash-config.json
        tag: ${{ github.ref_name }}
  try_flow_deploy:
    if: contains(github.event_name, 'push') && startsWith( github.ref, 'refs/tags/v' )
    runs-on: ubuntu-22.04
    needs:
    - build_js
    steps:
    - uses: actions/checkout@v3.6.0
    - uses: actions/download-artifact@v4.1.7
      with:
        name: build_js_bin
        path: dist
    - name: Assemble files
      run: |
        cp dist/flow.js packages/try-flow-website-js/flow.js
        cp -r lib packages/try-flow-website-js/flowlib
        make dist/npm-try-flow-website-js.tgz
    - name: Deploy to NPM
      run: |
        echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc
        npm publish ./dist/npm-try-flow-website-js.tgz
