version: 2.1

orbs:
  codecov: codecov/codecov@3

jobs:
  e2e_test_as_node_module:
    docker:
      - image: cimg/node:22.19.0
    working_directory: ~/repo
    steps:
      - checkout
      - run: npm i
      - run: AUTH0_HTTP_RECORDINGS="lockdown" npm run test:e2e:node-module

  e2e_test_as_cli:
    docker:
      - image: cimg/node:22.19.0
    working_directory: ~/repo
    steps:
      - checkout
      - run: npm i
      - run: npm run test:e2e:cli

  unit_test:
    parameters:
      v:
        type: string
        default: "lts"
    docker:
      - image: cimg/node:<< parameters.v >>
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
            - v<< parameters.v >>-npm-deps-{{ checksum "package.json" }}
            - v<< parameters.v >>-npm-deps-
      - run: npm i
      - save_cache:
          key: v<< parameters.v >>-npm-deps-{{ checksum "package.json" }}
          paths:
            - node_modules
      - run: npm run lint
      - run: npm run test:coverage
      - persist_to_workspace:
          root: ~/repo
          paths:
            - .
      - codecov/upload

  does_typescript_compile:
    docker:
      - image: cimg/node:22.19.0
    working_directory: ~/repo
    steps:
      - checkout
      - run: npm i
      - run: npx tsc --noEmit

  does_format_pass:
    docker:
      - image: cimg/node:22.19.0
    working_directory: ~/repo
    steps:
      - checkout
      - run: npm i
      - run: npm run format:check

  does_lint_pass:
    docker:
      - image: cimg/node:22.19.0
    working_directory: ~/repo
    steps:
      - checkout
      - run: npm i
      - run: npm run lint

workflows:
  version: 2

  e2e_test:
    jobs:
      - e2e_test_as_node_module:
          name: E2E tests as Node module
      - e2e_test_as_cli:
          name: E2E tests as CLI
          filters:
            branches:
              only: master

  unit_test:
    jobs:
      - does_typescript_compile:
          name: Does Typescript compile?
      - does_format_pass:
          name: Does format pass?
      - does_lint_pass:
          name: Does lint pass?
      - unit_test:
          name: Unit tests with Node LTS
          v: "lts"
      - unit_test:
          name: Unit tests with Node current
          v: "22.12.0"

