version: 2
references:
    container_config: &container_config
        docker:
            - image: mobify/cci-docker-primary:latest

    repo_cache_key: &repo_cache_key repo-{{ .Branch }}-{{ .Revision }}

    npm_cache_key: &npm_cache_key npm-{{ .Branch }}-{{ .Revision }}

    restore_repo: &restore_repo
        restore_cache:
            keys:
                - *repo_cache_key

    restore_node_modules: &restore_node_modules
        restore_cache:
            keys:
                - *npm_cache_key

    configure_node: &configure_node
        run:
            name: Configure node version
            command: |
                # Adds commands to the file that's sourced
                # before every 'run', so that the node version
                # configured in .nvmrc will be used.
                set +e
                touch $BASH_ENV
                echo 'unset npm_config_prefix' >> $BASH_ENV
                echo 'export NVM_DIR=/usr/local/nvm' >> $BASH_ENV
                echo '. "$NVM_DIR/nvm.sh"'  >> $BASH_ENV
                echo 'nvm use --delete-prefix --silent' >> $BASH_ENV
                echo 'node -v' >> $BASH_ENV
                echo 'export PATH="${PATH}:$(dirname $(nvm which | tail -1))"' >> $BASH_ENV

jobs:
    build:
        <<: *container_config
        steps:
            - checkout
            - save_cache:
                  key: *repo_cache_key
                  paths:
                      - .
            - *restore_node_modules
            - *configure_node
            - run:
                  name: Install Dependencies
                  command: npm install
            - save_cache:
                  key: *npm_cache_key
                  paths:
                      - ~/project/node_modules/
    test:
        <<: *container_config
        steps:
            - *restore_repo
            - *restore_node_modules
            - *configure_node
            - run: npm run docs:compile
            - run: npm run test

    deploy_astro:
        <<: *container_config
        steps:
            - *restore_repo
            - *restore_node_modules
            - *configure_node
            - run:
                  name: Push to npm on merges to `master`
                  command: |
                      npm install npm-cli-login
                      `npm bin`/npm-cli-login -u $NPM_USERNAME -p $NPM_PASSWORD -e $NPM_EMAIL
                      npm publish
            - run:
                  name: Publish the astro-client
                  command: npm run upload:astro_client

    deploy_docs:
        <<: *container_config
        steps:
            - *restore_repo
            - *restore_node_modules
            - *configure_node
            - run: npm run docs:upload

workflows:
    version: 2
    test_and_deploy:
        jobs:
            - build
            - test:
                  requires:
                      - build
            - deploy_astro:
                  requires:
                      - test
                  filters:
                      branches:
                          only: master
            - deploy_docs:
                  requires:
                      - test
                  filters:
                      branches:
                          only: develop
