version: 2

references:
  cache-options: &cache-options
    key: package-cache-{{ .Branch }}-{{ .Revision }}
  ignored-branches: &ignored-branches
    branches:
      ignore:
        - gh-pages

  shared-test-steps: &shared-test-steps
    steps:
      - checkout
      - restore_cache:
          <<: *cache-options
      - run:
          name: rebuild packages for this node version
          command: npm rebuild
      - run:
          name: display-node-version
          command: node --version
      - run:
          name: display-npm-version
          command: npm --version
      - run:
          name: test
          command: ./node_modules/.bin/jest --ci

# Test the common workflow on multiple versions of node
jobs:
  build:
    docker:
      - image: circleci/node:12
    steps:
      - checkout
      - restore_cache:
          <<: *cache-options
      - run:
          name: npm-install
          command: npm install
      - save_cache:
          <<: *cache-options
          paths:
            - ./node_modules

  linter:
    docker:
      - image: circleci/node:12
    steps:
      - checkout
      - restore_cache:
          <<: *cache-options
      - run:
          name: linter
          command: npm run lint

  test-node-v10:
    docker:
      - image: circleci/node:10
      - image: redis:5
    <<: *shared-test-steps

  test-node-v12:
    docker:
      - image: circleci/node:12
      - image: redis:5
    <<: *shared-test-steps

  test-node-v14:
    docker:
      - image: circleci/node:14
      - image: redis:5
    <<: *shared-test-steps

  test-node-v15:
    docker:
      - image: circleci/node:15
      - image: redis:5
    <<: *shared-test-steps

  tests-complete:
    docker:
      - image: circleci/node:12
    steps:
      - run:
          name: hooray
          command: echo "hooray the tests are complete"

  deploy-docs-website:
    docker:
      - image: circleci/node:12
    steps:
      - add_ssh_keys:
          fingerprints:
            - "18:46:c9:49:88:e3:01:19:56:a5:42:af:85:e9:6e:68"
      - checkout
      - restore_cache:
          <<: *cache-options
      - run:
          name: deploy-docs
          command: ./bin/deploy-docs

# Run all the tests is parallel
workflows:
  version: 2
  test:
    jobs:
      - build:
          filters:
            <<: *ignored-branches

      - linter:
          requires:
            - build
          filters:
            <<: *ignored-branches

      - test-node-v10:
          requires:
            - linter
          filters:
            <<: *ignored-branches

      - test-node-v12:
          requires:
            - linter
          filters:
            <<: *ignored-branches

      - test-node-v14:
          requires:
            - linter
          filters:
            <<: *ignored-branches

      - test-node-v15:
          requires:
            - linter
          filters:
            <<: *ignored-branches

      - tests-complete:
          filters:
            <<: *ignored-branches
          requires:
            - test-node-v10
            - test-node-v12
            - test-node-v14
            - test-node-v15

      - deploy-docs-website:
          filters:
            branches:
              only:
                - master
          requires:
            - tests-complete
