version: 2.1
anchors:
  defaults: &defaults
    docker:
      - image: fwouts/chrome-screenshot:1.2.2
    working_directory: ~/repo
  restore_cache: &restore_cache
    restore_cache:
      keys:
        - v1-dependencies-{{ checksum "package.json" }}
        # fallback to using the latest cache if no exact match is found
        - v1-dependencies-
  save_cache: &save_cache
    save_cache:
      paths:
        - node_modules
      key: v1-dependencies-{{ checksum "package.json" }}
  install_dependencies: &install_dependencies
    run:
      name: Install dependencies
      command: |
        apt-get update \
        && apt-get install -y git-lfs
  setup_git_lfs: &setup_git_lfs
    run:
      name: Set up Git LFS
      command: |
        git lfs install
        git lfs pull
jobs:
  build:
    <<: *defaults
    steps:
      - checkout
      - *restore_cache
      - run: yarn install
      - *save_cache
      - run: yarn build
  lint:
    <<: *defaults
    steps:
      - checkout
      - *restore_cache
      - run: yarn install
      - *save_cache
      - run: yarn lint:check
  unit-test:
    <<: *defaults
    steps:
      - checkout
      - *restore_cache
      - run: yarn install
      - *save_cache
      - run: yarn unit-test
  screenshot-test-local:
    <<: *defaults
    steps:
      - checkout
      - *install_dependencies
      - *setup_git_lfs
      - *restore_cache
      - run: yarn install
      - *save_cache
      - run: yarn screenshot-test-local
      - store_artifacts:
          path: src/tests/__screenshots__
          destination: snapshots
  screenshot-test-percy:
    <<: *defaults
    steps:
      - checkout
      - *restore_cache
      - run: yarn install
      - *save_cache
      - run: yarn screenshot-test-percy
  docker-image:
    machine: true
    steps:
      - checkout
      - run: docker build .
  example-local:
    <<: *defaults
    steps:
      - checkout
      - *install_dependencies
      - *setup_git_lfs
      - run: cd example && yarn install
      - run: cd example && yarn screenshot-test-local
      - store_artifacts:
          path: example/__screenshots__
          destination: example-screenshots
  example-percy:
    <<: *defaults
    steps:
      - checkout
      - run: cd example && yarn install
      - run: cd example && PERCY_TOKEN=$PERCY_TOKEN_EXAMPLE yarn screenshot-test-percy
workflows:
  check:
    jobs:
      - build
      - lint
      - unit-test
      - screenshot-test-local
      - screenshot-test-percy
      - docker-image
      - example-local
      - example-percy
