version: 2

defaults: &defaults
  docker:
    - image: circleci/node:17.2.0
  working_directory: ~/gatsby-starter-lumen

jobs:
  install:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          keys:
            - dependencies-{{ checksum "package-lock.json" }}
      - run: npm ci
      - save_cache:
          paths:
            - node_modules
          key: dependencies-{{ checksum "package-lock.json" }}

  lint:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          keys:
            - dependencies-{{ checksum "package-lock.json" }}
      - run: npm run lint

  test:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          keys:
            - dependencies-{{ checksum "package-lock.json" }}
      - run: npm run test --runInBand --no-cache

  coverage:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          keys:
            - dependencies-{{ checksum "package-lock.json" }}
      - run: npm run test:coverage --runInBand --no-cache
      - save_cache:
          key: coverage-{{ .Environment.CIRCLE_SHA1 }}
          paths:
            - coverage

  codecov:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          keys:
            - dependencies-{{ checksum "package-lock.json" }}
      - restore_cache:
          keys:
            - coverage-{{ .Environment.CIRCLE_SHA1 }}
      - run: npx codecov

workflows:
  version: 2
  test:
    jobs:
      - install
      - lint:
          requires:
            - install
      - test:
          requires:
            - install
      - coverage:
          requires:
            - install
      - codecov:
          requires:
            - coverage