# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2.1
jobs:
  test:
    parameters:
      node_version:
        type: string
        default: "14.21"
    docker:
      - image: cimg/node:<< parameters.node_version >>
    working_directory: ~/repo
    steps:
      - checkout
      # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-<< parameters.node_version >>-{{ checksum "yarn.lock" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-<< parameters.node_version >>
      - run: yarn install --frozen-lockfile
      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-<< parameters.node_version >>-{{ checksum "yarn.lock" }}
      - run:
          name: Run mocha unit tests with JUnit as reporter
          command: |
            npx nyc@latest \
              --reporter=clover --reporter=cobertura --reporter=lcov --reporter=text \
              --report-dir=reports/coverage \
              mocha tests/*.js --exit \
              --reporter mocha-junit-reporter \
              --reporter-options mochaFile=reports/junit/mocha-junit-results.xml
          when: always
      - store_test_results:
          path: reports/
      - store_artifacts:
          path: ./reports/
  publish:
    working_directory: ~/repo
    docker:
      - image: circleci/node:14
    steps:
      - checkout
      - run:
          name: Authenticate with registry
          command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc
      - run:
          name: Publish package
          command: npm publish
workflows:
  version: 2
  cicd:
    jobs:
      - test:
          matrix:
            parameters:
              node_version: ["12.22", "14.21", "16.20", "18.20"]
          filters:
            tags:
              only: /^v.*/
      - publish:
          context: org-global
          requires:
            - test
          filters:
            tags:
              only: /^v.*/
            branches:
              ignore: /.*/
