version: 2.1

references:
    set_npm_token: &set_npm_token
        run:
            name: Add NPM auth token file
            command: echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc

jobs:
    build:
        docker:
            - image: circleci/node:latest

        working_directory: ~/repo

        steps:
            - checkout

            - restore_cache:
                  keys:
                      - dependency-cache-1-{{ checksum "package-lock.json" }}

            - run: npm install

            - save_cache:
                  paths:
                      - node_modules
                  key: dependency-cache-1-{{ checksum "package-lock.json" }}

            - persist_to_workspace:
                  root: "."
                  paths:
                      - ./*
                      - node_modules
                      - package-lock.json
                      - dist
                      - src

    publish:
        docker:
            - image: circleci/node:latest

        working_directory: ~/repo

        steps:
            - checkout

            - *set_npm_token

            - attach_workspace:
                  at: "."

            - run: npm publish || exit 0

    verify_formatting:
        docker:
            - image: circleci/node:latest

        working_directory: ~/repo

        steps:
            - checkout

            - attach_workspace:
                  at: "."

            - run: npm run prettier

    verify_linting:
        docker:
            - image: circleci/node:latest

        working_directory: ~/repo

        steps:
            - checkout

            - attach_workspace:
                  at: "."

            - run: npm run eslint

workflows:
    version: 2
    build_and_verify:
        jobs:
            - build
            - publish:
                  context: org-global
                  filters:
                      branches:
                          only: main
                  requires:
                      - build
            - verify_formatting:
                  requires:
                      - build
            - verify_linting:
                  requires:
                      - build
