unit_tests: &unit_tests
  steps:
    - checkout
    - restore_cache:
        key: dependency-cache-{{ checksum "package-lock.json" }}
    - run:
        name: Install Latest NPM.
        # npm@3 is buggy
        command: if [[ $(npm -v | cut -c -1) > 3 ]] ; then npm i -g npm@latest; else echo "Skip npm updating"; fi
    - run:
        name: NPM Install.
        command: npm ci || npm i
    - run:
        name: Run Test.
        command: npm run ci:test
canary_tests: &canary_tests
  steps:
    - checkout
    - restore_cache:
        key: dependency-cache-{{ checksum "package-lock.json" }}
    - run:
        name: Install Latest NPM.
        command: npm i -g npm@latest
    - run:
        name: NPM Install.
        command: npm ci
    - run:
        name: Install Webpack Canary.
        command: npm i --no-save webpack@next
    - run:
        name: Run Test.
        command: if [[ $(compver --name webpack --gte next --lt latest) < 1 ]] ; then printf "Next is older than Latest - Skipping Canary Suite"; else npm run ci:test; fi

version: 2
jobs:
  dependency_cache:
    docker:
      - image: webpackcontrib/circleci-node-base:latest
    steps:
      - checkout
      - restore_cache:
          key: dependency-cache-{{ checksum "package-lock.json" }}
      - run:
          name: Install Latest NPM.
          command: npm i -g npm@latest
      - run:
          name: NPM Install.
          command: npm ci
      - save_cache:
          key: dependency-cache-{{ checksum "package-lock.json" }}
          paths:
            - ./node_modules
  analysis:
    docker:
      - image: webpackcontrib/circleci-node-base:latest
    steps:
      - checkout
      - restore_cache:
          key: dependency-cache-{{ checksum "package-lock.json" }}
      - run:
          name: Install Latest NPM.
          command: npm i -g npm@latest
      - run:
          name: NPM Install.
          command: npm ci
      - run:
          name: Run linting.
          command: npm run lint
      - run:
          name: Run NPM Audit.
          command: npm run security
      - run:
          name: Validate Commit Messages.
          command: npm run ci:lint:commits
  node6-latest:
    docker:
      - image: webpackcontrib/circleci-node6:latest
    <<: *unit_tests
  node8-latest:
    docker:
      - image: webpackcontrib/circleci-node8:latest
    <<: *unit_tests
  node10-latest:
    docker:
      - image: webpackcontrib/circleci-node10:latest
    steps:
      - checkout
      - restore_cache:
          key: dependency-cache-{{ checksum "package-lock.json" }}
      - run:
          name: Install Latest NPM.
          command: npm i -g npm@latest
      - run:
          name: NPM Install.
          command: npm ci
      - run:
          name: Run Test.
          command: npm run ci:coverage
      - run:
          name: Submit coverage data to codecov.
          command: bash <(curl -s https://codecov.io/bash)
          when: on_success
  node6-canary:
    docker:
      - image: webpackcontrib/circleci-node10:latest
    <<: *canary_tests

workflows:
  version: 2
  test:
    jobs:
      - dependency_cache
      - analysis:
          requires:
            - dependency_cache
          filters:
            tags:
              only: /.*/
      - node6-latest:
          requires:
            - dependency_cache
          filters:
            tags:
              only: /.*/
      - node8-latest:
          requires:
            - analysis
            - node6-latest
          filters:
            tags:
              only: /.*/
      - node10-latest:
          requires:
            - analysis
            - node6-latest
          filters:
            tags:
              only: /.*/
      - node6-canary:
          requires:
            - analysis
            - node6-latest
          filters:
            tags:
              only: /.*/
