version: 2

aliases:
  - &repo_path
    ~/ui-theme
  - &defaults
    working_directory: *repo_path
  - &node_latest_browser
    docker:
      - image: circleci/node:latest-browsers
  - &node_latest_executor
    docker:
      - image: circleci/node:latest
  - &node_lts_executor
    docker:
      - image: circleci/node:lts
  - &default_executor
    <<: *node_latest_executor
  - &yarn_cache_key
    yarn-sha-{{ checksum "yarn.lock" }}
  - &coverage_key
    coverage-{{ .Branch }}-{{ .Revision }}
  - &restore_repo
    attach_workspace:
      at: *repo_path
  - &ignore_non_dev_branches
    filters:
      tags:
        only: /.*/
      branches:
        ignore:
          - /release\/.*/
  - &execute_on_release
    filters:
      tags:
        only: /v?[0-9]+(\.[0-9]+)*([-+\.][a-zA-Z0-9]+)*/
      branches:
        ignore:
          - /.*/

jobs:
  prepare:
    <<: *defaults
    <<: *default_executor
    steps:
      - *restore_repo
      - checkout
      - restore_cache:
          key: *yarn_cache_key
      - run:
          name: Install dependencies
          command: yarn install --frozen-lockfile
      - run:
          name: Lint code
          command: yarn lint
      - run:
          name: Build project
          command: yarn build
      - save_cache:
          key: *yarn_cache_key
          paths:
            - ~/.yarn
            - ~/.cache/yarn
            - node_modules
      - persist_to_workspace:
          root: *repo_path
          paths:
            - ./*

  test_bundlesize:
    <<: *defaults
    <<: *default_executor
    steps:
      - *restore_repo
      - run:
          name: Test BundleSize
          command: yarn test:size

  test_node_latest:
    <<: *defaults
    <<: *node_latest_executor
    steps:
      - *restore_repo
      - run:
          name: Test with Node (Latest)
          command: yarn test
      - save_cache:
          key: *coverage_key
          paths:
          - coverage

  test_e2e:
    <<: *defaults
    <<: *node_latest_browser
    steps:
      - *restore_repo
      - run:
          name: Test E2E Node (LTS)
          command: yarn test:e2e

  test_node_lts:
    <<: *defaults
    <<: *node_lts_executor
    steps:
      - *restore_repo
      - run:
          name: Test with Node (LTS)
          command: yarn test

  coverage:
    <<: *defaults
    <<: *default_executor
    steps:
      - *restore_repo
      - restore_cache:
          key: *coverage_key
      - run:
          name: Publish coverage
          command: yarn run coverage:publish
      - store_artifacts:
          path: coverage/clover.xml
          prefix: tests
      - store_artifacts:
          path: coverage
          prefix: coverage
      - store_test_results:
          path: coverage/clover.xml

  publish_package:
    <<: *defaults
    <<: *default_executor
    steps:
      - *restore_repo
      - run:
          name: 'Setup publish credentials'
          command: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc
      - run:
          name: Publish
          command: yarn publish

workflows:
  version: 2
  workflow:
    jobs:
      - prepare:
          <<: *ignore_non_dev_branches
      - test_bundlesize:
          requires:
            - prepare
          <<: *ignore_non_dev_branches
      - test_node_latest:
          requires:
            - prepare
          <<: *ignore_non_dev_branches
      - test_node_lts:
          requires:
            - prepare
          <<: *ignore_non_dev_branches
      - test_e2e:
          requires:
            - prepare
          <<: *ignore_non_dev_branches
      - coverage:
          requires:
            - test_node_latest
          <<: *ignore_non_dev_branches
      - publish_package:
          requires:
            - test_bundlesize
            - test_node_latest
            - test_node_lts
            - test_e2e
            - coverage
          <<: *execute_on_release
