version: 2.1

executors:
  sb_node:
    parameters:
      class:
        description: The Resource class
        type: enum
        enum: ['small', 'medium', 'large', 'xlarge']
        default: 'medium'
    working_directory: /tmp/storybook
    docker:
      - image: circleci/node:10-browsers
        environment:
          NODE_OPTIONS: --max_old_space_size=4096
    resource_class: <<parameters.class>>
  sb_node_12:
    parameters:
      class:
        description: The Resource class
        type: enum
        enum: ['small', 'medium', 'large', 'xlarge']
        default: 'medium'
    working_directory: /tmp/storybook
    docker:
      - image: circleci/node:12-browsers
        environment:
          NODE_OPTIONS: --max_old_space_size=4096
    resource_class: <<parameters.class>>

jobs:
  build:
    executor:
      class: large
      name: sb_node
    steps:
      - checkout
      - run:
          name: Remove examples
          command: rm -rf examples/
      - restore_cache:
          name: Restore Yarn cache
          keys:
            - build-yarn-cache-v1--{{ checksum "yarn.lock" }}
            - build-yarn-cache-v1--
      - run:
          name: Install dependencies
          command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
      - run:
          name: Bootstrap
          command: yarn bootstrap --core
      - save_cache:
          name: Save Yarn cache
          key: build-yarn-cache-v1--{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn
      - persist_to_workspace:
          root: .
          paths:
            - addons
            - dev-kits
            - app
            - lib
  install-examples-deps:
    executor:
      class: large
      name: sb_node
    steps:
      - checkout
      - restore_cache:
          name: Restore Yarn cache
          keys:
            - install-examples-deps-yarn-cache-v1--{{ checksum "yarn.lock" }}
            - install-examples-deps-yarn-cache-v1--
      - run:
          name: Install dependencies
          command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
      - save_cache:
          name: Save Yarn cache
          key: install-examples-deps-yarn-cache-v1--{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn
      - persist_to_workspace:
          root: .
          paths:
            - examples
            - node_modules
  install-e2e-deps:
    executor:
      class: large
      name: sb_node
    steps:
      - checkout
      - run:
          name: Keep only root package
          command: rm -rf examples/ && rm -rf addons/ && rm -rf app/ && rm -rf lib/
      - restore_cache:
          name: Restore Yarn cache
          keys:
            - install-e2e-deps-yarn-cache-v1--{{ checksum "yarn.lock" }}
            - install-e2e-deps-yarn-cache-v1--
      - run:
          name: Install dependencies
          command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
      - save_cache:
          name: Save Yarn cache
          key: install-e2e-deps-yarn-cache-v1--{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn
      - persist_to_workspace:
          root: .
          paths:
            - examples
            - node_modules
  chromatic:
    executor: sb_node
    parallelism: 11
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: examples
          command: |
            yarn run-chromatics
  packtracker:
    executor:
      class: medium
      name: sb_node
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Report webpack stats for manager of official storybook
          command: |
            cd examples/official-storybook
            yarn packtracker
  examples:
    executor:
      class: large
      name: sb_node
    parallelism: 11
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: examples
          command: |
            yarn build-storybooks
      - persist_to_workspace:
          root: .
          paths:
            - built-storybooks
  publish:
    executor:
      class: large
      name: sb_node
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: running local registry
          command: yarn local-registry --publish
      - persist_to_workspace:
          root: .
          paths:
            - .verdaccio-cache
  examples-v2:
    executor:
      class: large
      name: sb_node
    working_directory: /tmp/storybook
    parallelism: 10
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: running local registry
          command: yarn local-registry --port 6000 --open
          background: true
      - run:
          name: wait for registry
          command: yarn wait-on http://localhost:6000
      - run:
          name: set registry
          command: yarn config set registry http://localhost:6000/
      - run:
          name: test local registry
          command: yarn info @storybook/core
      - run:
          name: Install Cypress binary
          command: yarn cypress install
      - run:
          name: run e2e tests
          command: yarn test:e2e-framework
      - store_artifacts:
          path: /tmp/storybook/cypress
          destination: cypress
  examples-v2-cra-bench:
    executor:
      class: medium
      name: sb_node_12
    working_directory: /tmp/storybook
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Running local registry
          command: yarn local-registry --port 6000 --open
          background: true
      - run:
          name: Wait for registry
          command: yarn wait-on http://localhost:6000
      - run:
          name: Set registry
          command: yarn config set registry http://localhost:6000/
      - run:
          name: Test local registry
          command: yarn info @storybook/core
      - run:
          name: Install Cypress binary
          command: yarn cypress install
      - run:
          name: Run @storybook/bench on a CRA project
          command: yarn test:e2e-framework cra_bench
      - store_artifacts:
          path: /tmp/storybook/cypress
          destination: cypress
  examples-v2-angular:
    executor:
      class: medium
      name: sb_node_12
    working_directory: /tmp/storybook
    parallelism: 2
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Running local registry
          command: yarn local-registry --port 6000 --open
          background: true
      - run:
          name: Wait for registry
          command: yarn wait-on http://localhost:6000
      - run:
          name: Set registry
          command: yarn config set registry http://localhost:6000/
      - run:
          name: Test local registry
          command: yarn info @storybook/core
      - run:
          name: Install Cypress binary
          command: yarn cypress install
      - run:
          name: Run e2e tests
          command: yarn test:e2e-framework angular@latest angular@v9-lts
      - store_artifacts:
          path: /tmp/storybook/cypress
          destination: cypress
  examples-v2-yarn-2:
    executor:
      class: medium
      name: sb_node
    working_directory: /tmp/storybook
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: running local registry
          command: yarn local-registry --port 6000 --open
          background: true
      - run:
          name: wait for registry
          command: yarn wait-on http://localhost:6000
      - run:
          name: set registry
          command: yarn config set registry http://localhost:6000/
      - run:
          name: test local registry
          command: yarn info @storybook/core
      - run:
          name: Install Cypress binary
          command: yarn cypress install
      - run:
          name: run e2e tests
          command: yarn test:e2e-framework --use-yarn-2 sfcVue cra
      - store_artifacts:
          path: /tmp/storybook/cypress
          destination: cypress
  e2e:
    working_directory: /tmp/storybook
    docker:
      - image: cypress/included:4.7.0
        environment:
          TERM: xterm
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: running example
          command: yarn serve-storybooks
          background: true
      - run:
          name: await running examples
          command: yarn await-serve-storybooks
      - run:
          name: cypress run
          command: yarn test:e2e
      - store_artifacts:
          path: /tmp/storybook/cypress
          destination: cypress

  smoke-tests:
    executor:
      class: medium
      name: sb_node
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Run react kitchen-sink (smoke test)
          command: |
            cd examples/cra-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run react typescript kitchen-sink (smoke test)
          command: |
            cd examples/cra-ts-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run vue kitchen-sink (smoke test)
          command: |
            cd examples/vue-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run svelte kitchen-sink (smoke test)
          command: |
            cd examples/svelte-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run angular-cli (smoke test)
          command: |
            cd examples/angular-cli
            yarn storybook --smoke-test --quiet
      - run:
          name: Run ember-cli (smoke test)
          command: |
            cd examples/ember-cli
            yarn storybook --smoke-test --quiet
      - run:
          name: Run marko-cli (smoke test)
          command: |
            cd examples/marko-cli
            yarn storybook --smoke-test --quiet
      - run:
          name: Run official-storybook (smoke test)
          command: |
            cd examples/official-storybook
            yarn storybook --smoke-test --quiet
      - run:
          name: Run mithril kitchen-sink (smoke test)
          command: |
            cd examples/mithril-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run riot kitchen-sink (smoke test)
          command: |
            cd examples/riot-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run preact kitchen-sink (smoke test)
          command: |
            cd examples/preact-kitchen-sink
            yarn storybook --smoke-test --quiet
      - run:
          name: Run cra reac15 (smoke test)
          command: |
            cd examples/cra-react15
            yarn storybook --smoke-test --quiet
  frontpage:
    executor: sb_node
    steps:
      - checkout
      - restore_cache:
          name: Restore core dependencies cache
          keys:
            - core-dependencies-v5-{{ checksum "yarn.lock" }}
      - run:
          name: Install dependencies
          command: yarn bootstrap --install
      - run:
          name: Trigger build
          command: ./scripts/build-frontpage.js
  lint:
    executor:
      class: small
      name: sb_node
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Lint
          command: yarn lint
  test:
    executor: sb_node
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Test
          command: yarn test --coverage --w2 --core
      - persist_to_workspace:
          root: .
          paths:
            - coverage
  coverage:
    executor:
      class: small
      name: sb_node
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run:
          name: Upload coverage
          command: yarn coverage

workflows:
  test:
    jobs:
      - build
      - install-e2e-deps
      - install-examples-deps
      - lint:
          requires:
            - install-examples-deps
            - build
      - examples:
          requires:
            - install-examples-deps
            - build
      - e2e:
          requires:
            - examples
      - smoke-tests:
          requires:
            - install-examples-deps
            - build
      - packtracker:
          requires:
            - install-examples-deps
            - build
      - test:
          requires:
            - install-examples-deps
            - build
      - coverage:
          requires:
            - test
      - chromatic:
          requires:
            - examples
      - publish:
          requires:
            - install-e2e-deps
            - build
      - examples-v2:
          requires:
            - publish
      - examples-v2-angular:
          requires:
            - publish
      - examples-v2-yarn-2:
          requires:
            - publish
      - examples-v2-cra-bench:
          requires:
            - publish
  deploy:
    jobs:
      - frontpage
