defaults: &defaults
  working_directory: /tmp/storybook
  docker:
    - image: circleci/node:8

version: 2
dependencies:
  pre:
    - yarn global add npm
jobs:
  build:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - run:
          name: "Install dependencies"
          command: |
            yarn install
      - run:
          name: "Dirty check"
          command: |
            yarn repo-dirty-check
      - run:
          name: "Bootstrap"
          command: |
            yarn bootstrap --core
      - save_cache:
          name: "Cache core dependencies"
          key: core-dependencies-{{ checksum "yarn.lock" }}
          paths:
            - node_modules
            - example/cra-kitchen-sink/node_modules
      - save_cache:
          name: "Cache core dist"
          key: core-dist-{{ .Revision }}
          paths:
            - addons
            - app
            - lib
  example-kitchen-sinks:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore core dist cache"
          keys:
            - core-dist-{{ .Revision }}
      - run:
          name: "Link packages"
          command: |
            yarn install
      - run:
          name: "Build react kitchen-sink"
          command: |
            cd examples/cra-kitchen-sink
            yarn build-storybook
      - run:
          name: "Run react kitchen-sink"
          command: |
            cd examples/cra-kitchen-sink
            yarn storybook
          background: true
      - run:
          name: Workaround for https://github.com/GoogleChrome/puppeteer/issues/290
          command: sh ./scripts/workaround-puppeteer-issue-290.sh
      - run:
          name: Integration Test - Kichen sinks
          command: yarn test --integration
      - store_artifacts:
          path: integration/__image_snapshots__
          destination: integration_image_snapshots
  react-native:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore core dist cache"
          keys:
            - core-dist-{{ .Revision }}
      - run:
          name: "Bootstrap"
          command: |
            yarn bootstrap --reactnative --reactnativeapp
      - run:
          name: "Run React-Native example"
          command: |
            cd examples/react-native-vanilla
            yarn storybook --smoke-test
      - run:
          name: "Run React-Native-App example"
          command: |
            cd examples/crna-kitchen-sink
            yarn storybook --smoke-test
      - run:
          name: "Run React-Native unit tests"
          command: |
            yarn test --coverage --runInBand --reactnative
            yarn coverage
  docs:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore docs dependencies cache"
          keys:
            - docs-dependencies-{{ checksum "docs/yarn.lock" }}
      - run:
          name: "Install core dependencies"
          command: |
            yarn install
      - run:
          name: "Install dependencies"
          command: |
            yarn bootstrap --docs
      - run:
          name: "Dirty check"
          command: |
            yarn repo-dirty-check
      - run:
          name: "Run docs"
          command: |
            yarn docs:build
      - save_cache:
          name: "Cache dependencies"
          key: docs-dependencies-{{ checksum "docs/yarn.lock" }}
          paths:
            - docs/node_modules
  lint:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore docs dependencies cache"
          keys:
            - docs-dependencies-{{ checksum "docs/yarn.lock" }}
      - restore_cache:
          name: "Restore core dist cache"
          keys:
            - core-dist-{{ .Revision }}
      - run:
          name: "Link packages"
          command: |
            yarn install
      - run:
          name: "Lint"
          command: |
            yarn lint
  unit-test:
    <<: *defaults
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore core dist cache"
          keys:
            - core-dist-{{ .Revision }}
      - run:
          name: "Link packages"
          command: |
            yarn install
      - run:
          name: "Run unit tests"
          command: |
            yarn test --coverage --runInBand --core
            yarn coverage
  cli:
    working_directory: /tmp/storybook
    docker:
      - image: andthensome/docker-node-rsync
    environment:
        BASH_ENV: ~/.bashrc
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore core dist cache"
          keys:
            - core-dist-{{ .Revision }}
      - run:
          name: "Test CLI"
          command: |
            yarn test --cli
  cli-latest-cra:
    working_directory: /tmp/storybook
    docker:
      - image: andthensome/docker-node-rsync
    environment:
        BASH_ENV: ~/.bashrc
    steps:
      - checkout
      - restore_cache:
          name: "Restore core dependencies cache"
          keys:
            - core-dependencies-{{ checksum "yarn.lock" }}
      - restore_cache:
          name: "Restore core dist cache"
          keys:
            - core-dist-{{ .Revision }}
      - run:
          name: "Test CLI with latest CR(N)A"
          command: |
            yarn test-latest-cra
  deploy:
    <<: *defaults
    steps:
      - run:
          name: "Deploy"
          command: |
            echo "TODO"
workflows:
  version: 2
  build_accept_deploy:
    jobs:
      - build
      - example-kitchen-sinks:
          requires:
            - build
      - react-native:
          requires:
            - build
      - docs
      - lint:
          requires:
            - build
      - unit-test:
          requires:
            - build
      - cli:
          requires:
            - build
      - cli-latest-cra:
          requires:
            - build
