version: 2

workflows:
  version: 2
  test_and_release:
    jobs:
      - create_release_pull_request:
          filters:
            branches:
              only:
                - /^Version-v(\d+)[.](\d+)[.](\d+)/
      - prep-deps
      - test-deps
      - prep-build:
          requires:
            - prep-deps
      - prep-build-test:
          requires:
            - prep-deps
      # - prep-docs:
      #    requires:
      #      - prep-deps
      - prep-scss:
          requires:
            - prep-deps
      - test-lint:
          requires:
            - prep-deps
      - test-e2e-chrome:
          requires:
            - prep-build-test
      - test-e2e-firefox:
          requires:
            - prep-build-test
      - test-unit:
          requires:
            - prep-deps
      - test-unit-global:
          requires:
            - prep-deps
      - test-mozilla-lint:
          requires:
            - prep-deps
            - prep-build
      - test-integration-flat-chrome:
          requires:
            - prep-deps
            - prep-scss
      - test-integration-flat-firefox:
          requires:
            - prep-deps
            - prep-scss
      - all-tests-pass:
          requires:
            - test-lint
            - test-unit
            - test-unit-global
            - test-mozilla-lint
            - test-e2e-chrome
            - test-e2e-firefox
            - test-integration-flat-chrome
            - test-integration-flat-firefox
      - job-publish-prerelease:
          requires:
            - prep-deps
            - prep-build
            - all-tests-pass
      - job-publish-release:
          filters:
            branches:
              only: master
          requires:
            - prep-deps
            - prep-build
      #       - prep-docs
            - all-tests-pass
      - coveralls-upload:
          requires:
            - test-unit

jobs:
  create_release_pull_request:
    docker:
      - image: circleci/node:8.15.1-browsers
    steps:
      - checkout
      - run:
          name: Create GitHub Pull Request for version
          command: |
            .circleci/scripts/release-bump-changelog-version
            .circleci/scripts/release-bump-manifest-version
            .circleci/scripts/release-create-release-pr

  prep-deps:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - run:
          name: Install deps
          command: |
            .circleci/scripts/deps-install.sh
      - run:
          name: Collect yarn install HAR logs
          command: |
            .circleci/scripts/collect-har-artifact.sh
      - persist_to_workspace:
          root: .
          paths:
          - node_modules
          - build-artifacts

  prep-build:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: build:dist
          command: yarn dist
      - run:
          name: build:debug
          command: find dist/ -type f -exec md5sum {} \; | sort -k 2
      - persist_to_workspace:
          root: .
          paths:
            - dist
            - builds

  prep-build-test:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Build extension for testing
          command: yarn build:test
      - run:
          name: Move test build to 'dist-test' to avoid conflict with production build
          command: mv ./dist ./dist-test
      - persist_to_workspace:
          root: .
          paths:
            - dist-test

  prep-docs:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: build:dist
          command: yarn doc
      - persist_to_workspace:
          root: .
          paths:
            - docs/jsdocs

  prep-scss:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Get Scss Cache key
          # this allows us to checksum against a whole directory
          command: find ui/app/css -type f -exec md5sum {} \; | sort -k 2 > scss_checksum
      - run:
          name: Build for integration tests
          command: yarn test:integration:build
      - persist_to_workspace:
          root: .
          paths:
            - ui/app/css/output

  test-lint:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Lint
          command: yarn lint
      - run:
          name: Verify locales
          command: yarn verify-locales --quiet

  test-deps:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: yarn audit
          command: .circleci/scripts/yarn-audit

  test-e2e-chrome:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Move test build to dist
          command: mv ./dist-test ./dist
      - run:
          name: test:e2e:chrome
          command: yarn test:e2e:chrome
          no_output_timeout: 20m
      - store_artifacts:
          path: test-artifacts
          destination: test-artifacts

  test-e2e-firefox:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - run:
          name: Install Firefox
          command: ./.circleci/scripts/firefox-install
      - attach_workspace:
          at: .
      - run:
          name: Move test build to dist
          command: mv ./dist-test ./dist
      - run:
          name: test:e2e:firefox
          command: yarn test:e2e:firefox
          no_output_timeout: 20m
      - store_artifacts:
          path: test-artifacts
          destination: test-artifacts

  job-publish-prerelease:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: build:source-map-explorer
          command: ./development/source-map-explorer.sh
      - store_artifacts:
          path: dist/sourcemaps
          destination: builds/sourcemaps
      - store_artifacts:
          path: builds
          destination: builds
      - store_artifacts:
          path: test-artifacts
          destination: test-artifacts
      # important: generate sesify viz AFTER uploading builds as artifacts
      - run:
          name: build:sesify-viz
          command: ./.circleci/scripts/create-sesify-viz
      - store_artifacts:
          path: build-artifacts
          destination: build-artifacts
      - run:
          name: build:announce
          command: ./development/metamaskbot-build-announce.js

  job-publish-release:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: sentry sourcemaps upload
          command: yarn sentry:publish
      - run:
          name: Create GitHub release
          command: |
            .circleci/scripts/release-create-gh-release
      - run:
          name: Create GitHub Pull Request to sync master with develop
          command: .circleci/scripts/release-create-master-pr
      # - run:
      #    name: github gh-pages docs publish
      #    command: >
      #      git config --global user.name "metamaskbot" &&
      #      git config --global user.email "admin@metamask.io" &&
      #      yarn publish-docs

  test-unit:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: test:coverage
          command: yarn test:coverage
      - persist_to_workspace:
          root: .
          paths:
            - .nyc_output
            - coverage
  test-unit-global:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: test:unit:global
          command: yarn test:unit:global
  test-mozilla-lint:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: test:mozilla-lint
          command: NODE_OPTIONS=--max_old_space_size=3072 yarn mozilla-lint

  test-integration-flat-firefox:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Install Firefox
          command: ./.circleci/scripts/firefox-install
      - run:
          name: test:integration:flat
          command: yarn test:flat

  test-integration-flat-chrome:
    environment:
      browsers: '["Chrome"]'
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: test:integration:flat
          command: yarn test:flat

  all-tests-pass:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - run:
          name: All Tests Passed
          command: echo 'weew - everything passed!'

  coveralls-upload:
    docker:
      - image: circleci/node:10.16-browsers
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Coveralls upload
          command: yarn test:coveralls-upload