language: rust
sudo: false

INSTALL_NODE_VIA_NVM: &INSTALL_NODE_VIA_NVM
  |
    rustup target add wasm32-unknown-unknown
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
    source ~/.nvm/nvm.sh
    nvm install v10.5

INSTALL_GECKODRIVER: &INSTALL_GECKODRIVER
  |
    curl --retry 5 -LO https://github.com/mozilla/geckodriver/releases/download/v0.21.0/geckodriver-v0.21.0-linux64.tar.gz
    tar xf geckodriver-v0.21.0-linux64.tar.gz

INSTALL_CHROMEDRIVER: &INSTALL_CHROMEDRIVER
  |
    curl --retry 5 -LO https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
    unzip chromedriver_linux64.zip
    export CHROMEDRIVER_ARGS=--verbose

DEPLOY_TO_GITHUB: &DEPLOY_TO_GITHUB
  before_deploy:
    |
      name="wasm-bindgen-$TRAVIS_TAG-$TARGET"
      mkdir "$name"
      cp "target/$TARGET/release/wasm-bindgen" "$name/"
      cp "target/$TARGET/release/wasm2es6js" "$name/"
      cp "target/$TARGET/release/wasm-bindgen-test-runner" "$name/"
      cp README.md LICENSE-MIT LICENSE-APACHE "$name/"
      tar czvf "$name.tar.gz" "$name"
  deploy:
    api_key:
      secure: "qCiELnEnvyKpWHDttgTNf+ElZGbWlvthu5aOIj5nYfov+h6g1+mkWnDFP6at/WPlE78zE/f/z/dL2KB2I7w/cxH/T4P1nWh0A9DvrpY6hqWkK2pgN5dPeWE/a4flI7AdH0A6wMRw7m00uMgDjlzN78v7XueccpJCxSO5allQN5jweAQvMX2QA07TbLRJc7Lq6lfVwSf8OfrcO8qCbcIzJTsC4vtbh6jkUYg1OAaU2tAYlskBy9ZYmHWCExIAu/zxzcJY9OpApPD9Ea4CyrsfjniAyRBJ87Weh/sP4XhiWeRPVmvA4HAzv4Pps9ps+Ar5QmsX53rhKQ3id7/VPR8ggaAHxrYUiJPvJRtbP6cKKOlDiK0ooP+vI4vjxWeNVj9ibEolSYOlT0ENIvPK1BppA6VgAoJOjwPr0Q16Ma4AmvLkIkowJiXCm2Jlje/5c0vPEAGJVgUtkj3jFQzgXwyEMpzxUlhHmYpmnfeaM0tK/Kiiwe1monL/ydMlyfV55kNylylCg+XoTnf420AFChKbD4DM5Z7ZsjU9g8fF3LUoN0sKpmLDp+GvwjLi9YtGogWB71Q2MFp43MSL0YLshkyYYoZKrVMiy5J9hKNUxhT2jNEq53Z69syIHHMCxHL9GoAcuHxIKOA7uTMW0aCoyy2I+dfAKKsrUGwGYaNC5LZdUQI="
    file_glob: true
    file:
      - wasm-bindgen-$TRAVIS_TAG-$TARGET.tar.gz
    on:
      tags: true
    provider: releases
    skip_cleanup: true
  if: branch = master OR branch =~ /^\d/

matrix:
  include:
    # Tests pass on nightly
    - rust: nightly
      env: JOB=test-bindgen
      install:
        - *INSTALL_NODE_VIA_NVM
        - *INSTALL_GECKODRIVER
        - export GECKODRIVER=`pwd`/geckodriver
      script:
        # Run a test or two that makes sure `#[wasm_bindgen]` works "reasonably"
        # on non-wasm platforms
        - cargo test
        # Run the main body of the test suite
        - cargo test --target wasm32-unknown-unknown
        # Rerun the test suite but disable `--debug` in generated JS
        - WASM_BINDGEN_NO_DEBUG=1 cargo test --target wasm32-unknown-unknown
        # Make sure our serde tests work
        - cargo test --target wasm32-unknown-unknown --features serde-serialize
        # Make sure the `std` feature works if disabled
        - cargo test --target wasm32-unknown-unknown -p no-std
        # Make sure the `wasm-bindgen-futures` tests pass.
        - cargo test -p wasm-bindgen-futures
        - cargo test -p wasm-bindgen-futures --target wasm32-unknown-unknown
      addons:
        firefox: latest
      if: branch = master

    # All examples work
    - rust: nightly
      env: JOB=examples-build
      install:
        - *INSTALL_NODE_VIA_NVM
        - npm ci --verbose
      script:
        - |
          for dir in `ls examples | grep -v README | grep -v asm.js | grep -v no_modules`; do
            (cd examples/$dir &&
             sed -i 's/: "webpack-dev-server"/: "webpack"/' package.json &&
             sed -i 's/npm install//' build.sh &&
             ln -s ../../node_modules . &&
             ./build.sh) || exit 1;
          done
      if: branch = master

    # The `web-sys` crate's tests pass on nightly.
    - rust: nightly
      env: JOB=test-web-sys
      install:
        - *INSTALL_NODE_VIA_NVM
        - *INSTALL_GECKODRIVER
        - *INSTALL_CHROMEDRIVER
      script:
        - export RUST_LOG=wasm_bindgen_test_runner
        - CHROMEDRIVER=`pwd`/chromedriver cargo test -p web-sys --target wasm32-unknown-unknown
        - GECKODRIVER=`pwd`/geckodriver cargo test -p web-sys --target wasm32-unknown-unknown
      addons:
        firefox: latest
        chrome: stable
      if: branch = master

    # The `js-sys` crate's tests pass on nightly.
    - rust: nightly
      env: JOB=test-js-sys
      install:
        - *INSTALL_NODE_VIA_NVM
        - *INSTALL_GECKODRIVER
        - *INSTALL_CHROMEDRIVER
      script:
        - export RUST_LOG=wasm_bindgen_test_runner
        - CHROMEDRIVER=`pwd`/chromedriver cargo test -p js-sys --target wasm32-unknown-unknown
        - GECKODRIVER=`pwd`/geckodriver cargo test -p js-sys --target wasm32-unknown-unknown
      addons:
        firefox: latest
        chrome: stable
      if: branch = master

    # Tests pass on nightly using yarn
    - rust: nightly
      env: JOB=test-yarn-smoke
      install:
        - *INSTALL_NODE_VIA_NVM
        - travis_retry curl -OLSf https://yarnpkg.com/install.sh
        - travis_retry bash install.sh -- --version 1.7.0
        - export PATH=$HOME/.yarn/bin:$PATH
        - yarn install --freeze-lockfile
      script: cargo test api::works
      if: branch = master

    # WebIDL tests pass on nightly
    - rust: nightly
      env: JOB=test-webidl
      install: *INSTALL_NODE_VIA_NVM
      script:
        - cargo test -p wasm-bindgen-webidl
        - cargo test -p webidl-tests --target wasm32-unknown-unknown
      if: branch = master

    # UI tests for the macro work just fine
    - rust: nightly
      env: JOB=macro-ui
      script: cargo test -p ui-tests
      if: branch = master

    # Dist linux binary
    - rust: nightly
      env: JOB=dist-linux TARGET=x86_64-unknown-linux-musl
      before_script: rustup target add $TARGET
      script: cargo build --manifest-path crates/cli/Cargo.toml --release --target $TARGET --features vendored-openssl
      addons:
        apt:
          packages:
          - musl-tools
      <<: *DEPLOY_TO_GITHUB

    # Dist OSX binary
    - rust: nightly
      os: osx
      env: JOB=dist-osx MACOSX_DEPLOYMENT_TARGET=10.7 TARGET=x86_64-apple-darwin
      script: cargo build --manifest-path crates/cli/Cargo.toml --release --target $TARGET
      <<: *DEPLOY_TO_GITHUB

    # CLI builds on stable
    - rust: stable
      env: JOB=check-stable-cli
      script: cargo check --manifest-path crates/cli/Cargo.toml
      if: branch = master
    # CLI builds on nightly
    - rust: nightly
      env: JOB=check-nightly-cli
      script: cargo check --manifest-path crates/cli/Cargo.toml
      if: branch = master

    # Build documentation for the gh-pages branch
    - rust: nightly
      env: JOB=guide-build-and-deploy
      cache:
        directories:
          - $HOME/.cargo
      before_script:
        - (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
        - (test -x $HOME/.cargo/bin/mdbook || cargo install --vers "^0.1" mdbook)
        - cargo install-update -a
      script:
        - (cd guide && mdbook build)
        - cargo doc --no-deps -p wasm-bindgen -p web-sys -p js-sys -p wasm-bindgen-futures
        - mv target/doc guide/book/api
      deploy:
        provider: pages
        skip-cleanup: true
        github-token: $GITHUB_TOKEN  # Set in travis-ci.org dashboard, marked secure
        local-dir: guide/book
        keep-history: false
      if: branch = master

notifications:
  email:
    on_success: never
