version: 2.1
aliases:
  - &defaults
      docker:
        - image: cimg/node:12.22.11-browsers
          auth:
            username: $DOCKERHUB_USERNAME
            password: $DOCKERHUB_PASSWORD
      working_directory: ~/repo
      environment:
        NODE_ENV: production
  - &setup
    name: "setup"
    command: |
      npm --production=false ci
      mkdir ./test/results
  - &lint
    name: "run lint tests"
    command: npm run lint -- --format junit -o ./test/results/lint-results.xml
  - &unit
    name: "run unit tests"
    command: JEST_JUNIT_OUTPUT_NAME=unit-jest-results.xml npm run unit -- --reporters=jest-junit
  - &build
    name: "run npm build"
    command: |
      NODE_ENV=production npm run build
  - &tag-setup
    name: "setup tags"
    command: |
      RELEASE_TIMESTAMP="$(date +'%Y%m%d%H%M%S')"
      VPKG=$($(npm bin)/json -f package.json version)
      echo export RELEASE_VERSION=${VPKG}-prerelease.${RELEASE_TIMESTAMP} >> $BASH_ENV
      echo export NPM_TAG=latest >> $BASH_ENV
      if [[ "$CIRCLE_BRANCH" == hotfix/* ]]; then # double brackets are important for matching the wildcard
        echo export NPM_TAG=hotfix >> $BASH_ENV
      fi
  - &deploy-gh-pages
    name: "deploy to gh pages"
    command: |
      git config --global user.email $(git log --pretty=format:"%ae" -n1)
      git config --global user.name $(git log --pretty=format:"%an" -n1)
      npm run deploy -- -e $CIRCLE_BRANCH
  - &deploy-npm
    name: "deploy to npm"
    command: |
      echo "npm tag: $NPM_TAG"
      echo "release version: $RELEASE_VERSION"
      npm version --no-git-tag-version $RELEASE_VERSION
      npm set //registry.npmjs.org/:_authToken=$NPM_TOKEN
      npm publish --tag $NPM_TAG
  - &tag-commit
    name: "tag commit in github"
    command: |
      echo $RELEASE_VERSION
      git tag $RELEASE_VERSION
      git push $CIRCLE_REPOSITORY_URL $RELEASE_VERSION

jobs:
  build-test:
    <<: *defaults
    steps:
      - checkout
      - run:
          <<: *setup
      - run:
          <<: *lint
      - run:
          <<: *unit
      - run:
          <<: *build
      - store_test_results:
          path: test/results
  build-test-deploy:
    <<: *defaults
    steps:
      - checkout
      - run:
          <<: *setup
      - run:
          <<: *lint
      - run:
          <<: *unit
      - run:
          <<: *build
      - store_test_results:
          path: test/results
      - run:
          <<: *tag-setup
      - run:
          <<: *deploy-gh-pages
      - run:
          <<: *deploy-npm
      - run:
          <<: *tag-commit
  push-translations:
    <<: *defaults
    steps:
      - checkout
      - run:
          <<: *setup
      - run:
          name: "run i18n script"
          command: |
            npm run i18n:src
            npm run i18n:push

workflows:
  build-test-no-deploy:
    jobs:
      - build-test:
          context:
            - dockerhub-credentials
          filters:
            branches:
                ignore:
                  - master
                  - develop
                  - /^hotfix\/.*/
                  - gh-pages
  build-test-deploy:
    jobs:
      - build-test-deploy:
          context:
            - dockerhub-credentials
          filters:
            branches:
                only:
                  - master
                  - develop
                  - /^hotfix\/.*/
  push-translations:
    triggers:
      - schedule:
          cron: 0 0 * * * # daily at 12 UTC, 8 ET
          filters:
            branches:
              only:
                - develop
    jobs:
      - push-translations:
          context:
            - dockerhub-credentials
