diff --git a/README.md b/README.md index dc6df93e604..206d3dd20ce 100644 --- a/README.md +++ b/README.md @@ -1,159 +1,30 @@ -# Camunda Cloud Documentation +
+ -This documentation is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. +

Camunda Cloud Documentation

+

+This repository contains the Camunda Cloud documentation, which can be found at https://docs.camunda.io/. +

+
-## Rights +--- -`OWNERS` files in various folders define who needs to approve changes within this folder. Approvers can approve a PR by adding the comment `/lgtm`. +[![development guidelines](./howtos/documentation-guidelines.svg)](./howtos/documentation-guidelines.md) -## Setup +[![technical writing cheatsheet](./howtos/technical-writing-cheatsheet.svg)](./howtos/technical-writing-cheatsheet.md) -### Installation +--- -```bash -npm i -``` +[![release procedure](./howtos/release-procedure.svg)](./howtos/release-procedure.md) -### Local Development +[![publish documentation](./howtos/publish-documentation.svg)](./howtos/publish-documentation.md) -```bash -npm run start -``` +--- -This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. +[![setup](./howtos/setup.svg)](./howtos/setup.md) -### Build +[![configuration](./howtos/configuration.svg)](./howtos/configuration.md) -```bash -npm run build -``` +[![configuration](./howtos/versioning.svg)](./howtos/versioning.md) -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -```bash -$ GIT_USER= USE_SSH=true npm run deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. - -## Publish documentation - -Publishing the documentation works by adding a new semver tag (`x.y.z`). [This Github Workflow](./.github/workflows/publish.yaml) will be triggered to build and deploy the docs. - -Github Page available under [https://camunda-cloud.github.io/camunda-cloud-documentation/](https://camunda-cloud.github.io/camunda-cloud-documentation/). - -## Search by Algolia - -- API-Key and Index name is configured in `./docusaurus.config.js`. - -## Documentation Guidelines - -### PRs for every change - -All changes have to be done in a separate Branch. As soon as the changes are done please open a PR. A Github Action runs with every commit to a Branch and checks if the documentation can be build (including a broken links check). - -### Structure - -- Name Markdown files according to the title. This makes it easier to find a file. Example: **Introduction to Camunda Cloud** --> `introduction-to-camunda-cloud.md`. Use the file name as internal document id to reference in `sidebars.js`. -- Sub catagories have to be placed in their own sub directories. Example: Guides/Getting Started can be found in `docs/guides/getting-started`. - -### Adding a new documentation page - -1. Select the corresponding directory -2. Add the document id to [`sidebars.js`](./sidebars.js) - -### Images - -- Static images can be placed into [`static/img/`](./static/img/). -- Images that will change with a new version have to be placed into `docs`. Best practice: add an `img` directory to each directory where it is needed. - -### Videos - -- The regular `video` does not work in MDX. -- Use the [react-video](https://www.npmjs.com/package/react-player) component in the following way: - -Import the component into corresponding Markdown file: - -```js -import ReactPlayer from 'react-player' -``` - -Embed a video with the `react-video` component: - -```html - -``` - -### Code Blocks / Selector - -Docusaurus supports [MDX](https://mdxjs.com/) that makes it easily possible to use code selectors for our docs. Two things need to be done: - -Import the needed libraries to the markdown file: - -```js -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -``` - -Define code blocks: - -```html - - - -code - - - -``` - -Hint: `groupId="language"` sets the decision documentation-wide. Can also be used for other use cases like different Tabs for different operating systems. - -Template: - -```html - - - - - - - - - - - - - - - - - - - - - -``` - -### Source Files for Images and Videos -Source files for images and videos can be put in: - -`./media-src/[subfolder according to do structure]/` \ No newline at end of file +[![markdown and mdx features](./howtos/markdown-and-mdx-features.svg)](./howtos/markdown-and-mdx-features.md) diff --git a/docs/guides/getting-started/connect-to-your-cluster.md b/docs/guides/getting-started/connect-to-your-cluster.md index fe574777888..9b2862c923a 100644 --- a/docs/guides/getting-started/connect-to-your-cluster.md +++ b/docs/guides/getting-started/connect-to-your-cluster.md @@ -1,45 +1,20 @@ --- id: connect-to-your-cluster -title: Connect to your Cluster +title: Connect to your cluster --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - ## Installation Install the appropriate package. - - - - ```bash npm i -g zbctl ``` - - - - ## First connection After creating a client and downloading the connection file, you will now need to source it to make it available in your environment. If these are known to the system, a client can communicate directly with its own cluster in the cloud without further configuration. - - - - ```bash source ~/Downloads/CamundaCloudMgmtAPI-Client-test-client.txt ``` @@ -48,11 +23,7 @@ source ~/Downloads/CamundaCloudMgmtAPI-Client-test-client.txt zbctl status ``` - - - - -As a result you will get a similar result: +As a result you will get a similar response: ```bash Cluster size: 1 diff --git a/docs/guides/getting-started/create-camunda-cloud-account.md b/docs/guides/getting-started/create-camunda-cloud-account.md index edc0f7ec592..ee5a3ab5c58 100644 --- a/docs/guides/getting-started/create-camunda-cloud-account.md +++ b/docs/guides/getting-started/create-camunda-cloud-account.md @@ -1,6 +1,6 @@ --- id: create-camunda-cloud-account -title: Create Camunda Cloud Account +title: Create Camunda Cloud account --- ## Sign up for Camunda Cloud diff --git a/docs/guides/getting-started/create-cluster.md b/docs/guides/getting-started/create-cluster.md index 4ea213ad968..6e15645f58e 100644 --- a/docs/guides/getting-started/create-cluster.md +++ b/docs/guides/getting-started/create-cluster.md @@ -1,19 +1,19 @@ --- id: create-cluster -title: Create a Cluster +title: Create a cluster --- After login you'll see the console overview page. Since you haven't created a cluster, the overview will be empty. ![cluster-creating](./img/cluster-overview-empty.png) -In the upper right area you'll find the button _Create New Cluster_. Click on it to create a new cluster. After you've assigned a name and created the cluster, a new entry appears in the overview: +In the upper right area click **Create New Cluster**. After you've assigned a name and created the cluster, a new entry appears in the overview: ![cluster-creating](./img/cluster-overview-new-cluster-creating.png) For this Getting Started Tutorial, close the dialog box that pops up immediately after creating a new cluster. -The cluster is now being set up. During this phase, its state is _Creating_. After one or two minutes the cluster is ready for use and changes its state to _healthy_: +The cluster is now being set up. During this phase, its state is _Creating_. After one or two minutes the cluster is ready for use and changes its state to _Healthy_: ![cluster-healthy](./img/cluster-overview-new-cluster-healthy.png) diff --git a/docs/guides/getting-started/deploy-your-process-and-start-process-instance.md b/docs/guides/getting-started/deploy-your-process-and-start-process-instance.md index 61ad3394792..19506e93dc8 100644 --- a/docs/guides/getting-started/deploy-your-process-and-start-process-instance.md +++ b/docs/guides/getting-started/deploy-your-process-and-start-process-instance.md @@ -1,6 +1,6 @@ --- id: deploy-your-process-and-start-process-instance -title: Deploy your process and start a process instance +title: Deploy and start your process instance --- @@ -17,11 +17,11 @@ import TabItem from "@theme/TabItem"; -You can now use the "Save & Deploy" button to deploy the newly created process to your cluster +You can now use the **Save & Deploy** button to deploy the newly created process to your cluster. ![console-modeler-deploy](./img/cloud-modeler-deploy.png) -Deployment can take a few seconds, but you should get a confirmation for successfull deployment. +Deployment can take a few seconds, but you should get a confirmation for successful deployment. ![console-modeler-deploy-successfull](./img/cloud-modeler-deploy-successfull.png) @@ -29,7 +29,7 @@ You can now start a new process instance. For this example you can just start an ![console-modeler-start-instance](./img/cloud-modeler-start-instance.png) -Once the instance is started, you'll get a confirmation with a link to jump into Operate directly. +Once the instance is started, you'll get a confirmation with a button to open Operate. ![console-modeler-start-instance-done](./img/cloud-modeler-start-instance-done.png) @@ -43,14 +43,14 @@ On the right side of the navigation menu there are buttons for deploying and sta ![zeebe-modeler-deploy](./img/zeebe-modeler-deploy.png) -In the deployment dialog, the connection information must now be specified: Cluster Id, Client Id and Client Secret. +In the deployment dialog, the connection information must now be specified: `Cluster Id`, `Client Id` and `Client Secret`. - Client Id and Cluster Id can be retrieved by clicking on the _View_ link on the client in the _API_-Tab. +`Client Id` and `Cluster Id` can be retrieved by clicking on **View** on the client in the **API** tab. ![cluster-details-created-client-view](./img/cluster-details-created-client-view.png) -The Client Secret can be retrieved from the downloaded connection file: +The `Client Secret` can be retrieved from the downloaded connection file: ```bash @@ -58,7 +58,7 @@ grep SECRET ~/Downloads/CamundaCloudMgmtAPI-Client-test-client.txt export ZEEBE_CLIENT_SECRET='zbzsZI_6UnCsH_CIo0lNUN8qGyvLJr9VrH77ewNm8Oq3elvhPvV7g.QmJGydzOLo' ``` -Click Deploy to **deploy** the workflow. Use the Play button from the navigation to **start a new instance**. +Click **Deploy** to deploy the workflow. Use **Play** from the navigation to start a new instance. diff --git a/docs/guides/getting-started/img/cloud-modeler-deploy-successfull.png b/docs/guides/getting-started/img/cloud-modeler-deploy-successfull.png index f91708a8f8c..359684cf6a6 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler-deploy-successfull.png and b/docs/guides/getting-started/img/cloud-modeler-deploy-successfull.png differ diff --git a/docs/guides/getting-started/img/cloud-modeler-deploy.png b/docs/guides/getting-started/img/cloud-modeler-deploy.png index 9c96309f9b1..d501d85803b 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler-deploy.png and b/docs/guides/getting-started/img/cloud-modeler-deploy.png differ diff --git a/docs/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png b/docs/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png index 3ee125c4058..d873061b079 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png and b/docs/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png differ diff --git a/docs/guides/getting-started/img/cloud-modeler-new-diagram.png b/docs/guides/getting-started/img/cloud-modeler-new-diagram.png index b9363dc3e1e..55bd4cf6c7a 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler-new-diagram.png and b/docs/guides/getting-started/img/cloud-modeler-new-diagram.png differ diff --git a/docs/guides/getting-started/img/cloud-modeler-start-instance-done.png b/docs/guides/getting-started/img/cloud-modeler-start-instance-done.png index d5823e67143..9ef712541d8 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler-start-instance-done.png and b/docs/guides/getting-started/img/cloud-modeler-start-instance-done.png differ diff --git a/docs/guides/getting-started/img/cloud-modeler-start-instance.png b/docs/guides/getting-started/img/cloud-modeler-start-instance.png index 9aa3810417a..c7daa9968d7 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler-start-instance.png and b/docs/guides/getting-started/img/cloud-modeler-start-instance.png differ diff --git a/docs/guides/getting-started/img/cloud-modeler.png b/docs/guides/getting-started/img/cloud-modeler.png index 791256a008b..ed0e52335f2 100644 Binary files a/docs/guides/getting-started/img/cloud-modeler.png and b/docs/guides/getting-started/img/cloud-modeler.png differ diff --git a/docs/guides/getting-started/img/cluster-detail-clients.png b/docs/guides/getting-started/img/cluster-detail-clients.png index b2791b9cd59..b49b942731e 100644 Binary files a/docs/guides/getting-started/img/cluster-detail-clients.png and b/docs/guides/getting-started/img/cluster-detail-clients.png differ diff --git a/docs/guides/getting-started/img/cluster-details-create-client.png b/docs/guides/getting-started/img/cluster-details-create-client.png index 93ca78fd71c..e0bd16ea84d 100644 Binary files a/docs/guides/getting-started/img/cluster-details-create-client.png and b/docs/guides/getting-started/img/cluster-details-create-client.png differ diff --git a/docs/guides/getting-started/img/cluster-details-created-client-view.png b/docs/guides/getting-started/img/cluster-details-created-client-view.png index 5c1cec4b982..e116cbd3312 100644 Binary files a/docs/guides/getting-started/img/cluster-details-created-client-view.png and b/docs/guides/getting-started/img/cluster-details-created-client-view.png differ diff --git a/docs/guides/getting-started/img/cluster-details-created-client.png b/docs/guides/getting-started/img/cluster-details-created-client.png index 2ec719d631b..3b909897bd4 100644 Binary files a/docs/guides/getting-started/img/cluster-details-created-client.png and b/docs/guides/getting-started/img/cluster-details-created-client.png differ diff --git a/docs/guides/getting-started/img/cluster-overview-empty.png b/docs/guides/getting-started/img/cluster-overview-empty.png index 250e0ec0d40..57650ead5de 100644 Binary files a/docs/guides/getting-started/img/cluster-overview-empty.png and b/docs/guides/getting-started/img/cluster-overview-empty.png differ diff --git a/docs/guides/getting-started/img/cluster-overview-new-cluster-creating.png b/docs/guides/getting-started/img/cluster-overview-new-cluster-creating.png index ef41054d1b8..e0f20c6f60a 100644 Binary files a/docs/guides/getting-started/img/cluster-overview-new-cluster-creating.png and b/docs/guides/getting-started/img/cluster-overview-new-cluster-creating.png differ diff --git a/docs/guides/getting-started/img/cluster-overview-new-cluster-healthy.png b/docs/guides/getting-started/img/cluster-overview-new-cluster-healthy.png index 0cc10fdcc8f..72eef36281b 100644 Binary files a/docs/guides/getting-started/img/cluster-overview-new-cluster-healthy.png and b/docs/guides/getting-started/img/cluster-overview-new-cluster-healthy.png differ diff --git a/docs/guides/getting-started/implement-decision-gateway.md b/docs/guides/getting-started/implement-decision-gateway.md index 07cd1e1b87a..25238a078da 100644 --- a/docs/guides/getting-started/implement-decision-gateway.md +++ b/docs/guides/getting-started/implement-decision-gateway.md @@ -6,15 +6,15 @@ title: Implement a decision gateway import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -In [the last section](./implement-service-task.md) we connected a worker that will return a JSON object as a result, which is used to decide which path to take in the workflow. Now, we can use the JSON object to route your process by filling in the condition expression on the two sequence flows after the XOR gateway. +In [the last section](./implement-service-task.md) we connected a worker that will return a JSON object, which is used to decide which path to take in the workflow. Now, we can use the JSON object to route your process by filling in the condition expression on the two sequence flows after the XOR gateway. -Use the following expression for the "Pong" sequence flow: +Use the following conditional expression for the "Pong" sequence flow: ```bash =return="Pong" ``` -And for the Else Sequence flow: +And for the else sequence flow: ```bash =return!="Pong" diff --git a/docs/guides/getting-started/implement-service-task.md b/docs/guides/getting-started/implement-service-task.md index 2de8f93fb35..d27a248696f 100644 --- a/docs/guides/getting-started/implement-service-task.md +++ b/docs/guides/getting-started/implement-service-task.md @@ -1,12 +1,12 @@ --- id: implement-service-task -title: Implement a Service Task +title: Implement a service task --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Use [This workflow model](./bpmn/gettingstarted_quickstart_advanced.bpmn) for the tutorial. +Use [this workflow model](./bpmn/gettingstarted_quickstart_advanced.bpmn) for the tutorial. -Use the "Import Diagram" button to inject the BPMN-model you just downloaded into the diagram +Click **Import Diagram** to inject the BPMN-model you just downloaded into the diagram. ![processId-cloud](./img/cloud-modeler-advanced-process-id.png) -This workflow includes a Service Task and an XOR Gateway. Select the Service Task and fill in the properties. Set the task-type to 'test-worker'. +This workflow includes a service task and an XOR gateway. Select the service task and fill in the properties. Set the **Type** to `test-worker`. ![workflow-cloud](./img/cloud-modeler-advanced.png) -Deploy the new workflow using the "Save & Deploy" button. +Deploy the new workflow using the **Save & Deploy** button. Make sure you have [created a client](./setup-client-connection-credentials.md) and [connected a cluster](connect-to-your-cluster.md). @@ -35,30 +35,17 @@ Make sure you have [created a client](./setup-client-connection-credentials.md) ![processId](./img/zeebe-modeler-advanced-process-id.png) -This workflow includes a Service Task and an XOR Gateway. Select the Service Task and fill in the properties. Set the task-type to 'test-worker'. +This workflow includes a service task and an XOR gateway. Select the service task and fill in the properties. Set the **Type** to `test-worker`. ![workflow](./img/zeebe-modeler-advanced.png) -Deploy the new workflow. +Deploy the new workflow. Now you can connect a worker for the configured service task: - - - - ```bash zbctl create worker test-worker --handler "echo {\"return\":\"Pong\"}" ``` - - - - diff --git a/docs/guides/getting-started/model-your-first-process.md b/docs/guides/getting-started/model-your-first-process.md index 590f8e2cf32..346e3b4ed21 100644 --- a/docs/guides/getting-started/model-your-first-process.md +++ b/docs/guides/getting-started/model-your-first-process.md @@ -1,12 +1,12 @@ --- id: model-your-first-process -title: Model your first Process +title: Model your first process --- import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -In Camunda Cloud you have two options to design and deploy a workflow: the [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) and the Console Modeler. +In Camunda Cloud you have two options to design and deploy a workflow: the Console Modeler and the [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases). -Using the Console Modeler, workflows can be designed and deployed, and new instances can be created directly from the console. You can find all your saved models under the "BPMN Diagrams" tab + +Using the Console Modeler, workflows can be designed and deployed, and new instances can be created directly from the console. + +You can find all your saved models under the **BPMN Diagrams** tab + +Click **Create New Diagram**. ![console-modeler](./img/cloud-modeler.png) -Just create a new diagram +Give your diagram a name like `Getting Started`. ![console-modeler-new-diagram](./img/cloud-modeler-new-diagram.png) -and give it a name - +The **Save** button should now appear for you to save your diagram. ![console-modeler-new-diagram](./img/cloud-modeler-new-diagram-with-name.png) -The Save button should now appear. diff --git a/docs/guides/getting-started/monitor-your-process-in-operate.md b/docs/guides/getting-started/monitor-your-process-in-operate.md index 0d30a380314..582298616e6 100644 --- a/docs/guides/getting-started/monitor-your-process-in-operate.md +++ b/docs/guides/getting-started/monitor-your-process-in-operate.md @@ -1,12 +1,12 @@ --- id: monitor-your-process-in-operate -title: Monitor your Process in Operate +title: Monitor your process in Operate --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Camunda Cloud offers Operate to monitor your process instances. An entry point can be found in the Cluster details. +Camunda Cloud offers Operate to monitor your process instances. An entry point can be found in the cluster details. ![operate-dashboard](./img/operate-dashboard.png) @@ -22,50 +22,24 @@ Because [the started worker](./implement-service-task.md) returns } ``` -the workflow ends in the upper end event. +the workflow ends in the upper end event following the Ping sequence flow. Changing the worker to - - - - ```bash zbctl create worker test-worker --handler "echo {\"return\":\"...\"}" ``` - - - - -and creating a new instance leads to a second instance in Operate, which you'll see ending in the second end event: +and creating a new instance leads to a second instance in Operate, which you'll see ending in the second end event following the else sequence flow: ![operate-instance](./img/operate-advanced-instances-other.png) As a next step you can now connect both workers in parallel and create more workflow instances: - - - - ```bash while true; do zbctl create instance camunda-cloud-quick-start-advanced; sleep 1; done ``` - - - - In Operate you will see instances ending in both end events depending on which worker picked up the job. ![operate-instances](./img/operate-advanced-instances.png) diff --git a/docs/guides/getting-started/setup-client-connection-credentials.md b/docs/guides/getting-started/setup-client-connection-credentials.md index bb6f2fe280b..4747627fa76 100644 --- a/docs/guides/getting-started/setup-client-connection-credentials.md +++ b/docs/guides/getting-started/setup-client-connection-credentials.md @@ -1,17 +1,17 @@ --- id: setup-client-connection-credentials -title: Setup Client connection credentials +title: Setup client connection credentials --- To create a new client you have to navigate into the API tab: ![cluster-details](./img/cluster-detail-clients.png) -Click on _Create New Client_-Button to create a new client and name your client accordingly. Make sure you select the Scope _Zeebe_ so the newly created client can access your zeebe-instance. +Click **Create New Client** to create a new client and name your client accordingly. Select **Zeebe** so the newly created client can access your Zeebe instance. ![create-client](./img/cluster-details-create-client.png) -Make sure you keep the generated client credentials in a safe place - the Client Secret will not be shown again. For your convenience, you can also download the client information to your computer. +Make sure you keep the generated client credentials in a safe place - the **Client Secret** will not be shown again. For your convenience, you can also download the client information to your computer. ![created-client](./img/cluster-details-created-client.png) diff --git a/docs/guides/introduction-to-camunda-cloud.md b/docs/guides/introduction-to-camunda-cloud.md new file mode 100644 index 00000000000..128f3306193 --- /dev/null +++ b/docs/guides/introduction-to-camunda-cloud.md @@ -0,0 +1,10 @@ +--- +id: introduction-to-camunda-cloud +title: Introduction to Camunda Cloud +sidebar_label: Introduction to Camunda Cloud +slug: /guides/ +--- + +Camunda Cloud delivers scalable, on-demand process automation as-a-service with powerful execution engines for BPMN workflows and DMN decisions paired with tools for collaborative modeling, operations and analytics. + +Camunda Cloud is comprised of 4 products - Zeebe Engine, Operate, Tasklist, and Modeler. \ No newline at end of file diff --git a/docs/guides/getting-started-with-camunda-cloud.md b/docs/guides/setting-up-development-project.md similarity index 99% rename from docs/guides/getting-started-with-camunda-cloud.md rename to docs/guides/setting-up-development-project.md index 6c979702596..00c444c83f9 100644 --- a/docs/guides/getting-started-with-camunda-cloud.md +++ b/docs/guides/setting-up-development-project.md @@ -1,6 +1,6 @@ --- -id: getting-started-with-camunda-cloud -title: Getting started with Camunda Cloud +id: setting-up-development-project +title: Setting up your first development project --- import Tabs from "@theme/Tabs"; diff --git a/docs/product-manuals/clients/build-your-own-client.md b/docs/product-manuals/clients/build-your-own-client.md index ce8b7aedcc9..443adb60d76 100644 --- a/docs/product-manuals/clients/build-your-own-client.md +++ b/docs/product-manuals/clients/build-your-own-client.md @@ -1,6 +1,6 @@ --- id: build-your-own-client -title: Build your own Client +title: Build your own client --- If you're using a technology for which there is no library yet, you can easily implement your own client. @@ -13,7 +13,7 @@ See these two blog posts about creating a client: There are two essential steps: 1. Authentication via OAuth -2. GRPC handling +2. gRPC handling ## Authentication via OAuth @@ -37,7 +37,7 @@ curl -s --request POST \ --data "{\"client_id\":\"${ZEEBE_CLIENT_ID}\",\"client_secret\":\"${ZEEBE_CLIENT_SECRET}\",\"audience\":\"zeebe.camunda.io\",\"grant_type\":\"client_credentials\"}" ``` -You'll receive an Access Token in the following format: +You'll receive an access token in the following format: ```json { @@ -50,11 +50,11 @@ You'll receive an Access Token in the following format: This token is valid for 86400 seconds (24 hours). Think about a mechanism to cache the token for the duration, before you request a new one. -## GRPC handling +## gRPC handling -For GRPC handling you need a GRPC library, which you have to find for your technology stack. +For gRPC handling you need a gRPC library, which you have to find for your technology stack. -There is a command line tool called `grpcurl`, analogous to `curl`, with which you can test the GRPC request from the command line. +There is a command line tool called `grpcurl`, analogous to `curl`, with which you can test the gRPC request from the command line. Install [grpcurl](https://github.com/fullstorydev/grpcurl) (for example, by using npm): @@ -71,19 +71,19 @@ export ACCESS_TOKEN=$(curl -s --request POST \ --data "{\"client_id\":\"${ZEEBE_CLIENT_ID}\",\"client_secret\":\"${ZEEBE_CLIENT_SECRET}\",\"audience\":\"zeebe.camunda.io\",\"grant_type\":\"client_credentials\"}" | sed 's/.*access_token":"\([^"]*\)".*/\1/' ) ``` -For the GRPC call you now need a proto buffer file (you can find it in the [zeebe.io repository](https://raw.githubusercontent.com/zeebe-io/zeebe/master/gateway-protocol/src/main/proto/gateway.proto)): +For the gRPC call you now need a proto buffer file (you can find it in the [zeebe.io repository](https://raw.githubusercontent.com/zeebe-io/zeebe/master/gateway-protocol/src/main/proto/gateway.proto)): ```bash curl -sSL https://raw.githubusercontent.com/zeebe-io/zeebe/master/gateway-protocol/src/main/proto/gateway.proto > /tmp/gateway.proto ``` -Copy the Cluster Id of your Zeebe cluster (you can find it on the cluster detail view). Now you have all data together to execute the GRPC call and get the status (change the cluster id variable with your own cluster id): +Copy the `cluster id` of your Zeebe cluster (you can find it on the cluster detail view). Now you have all data together to execute the gRPC call and get the status (change the `cluster id` variable with your own `cluster id`): ```bash grpcurl -H "Authorization: Bearer ${ACCESS_TOKEN}" -v -import-path /tmp -proto /tmp/gateway.proto $CLUSTER_ID.zeebe.camunda.io:443 gateway_protocol.Gateway/Topology ``` -You should now get a similar result: +You should now get a similar response: ```bash Resolved method descriptor: diff --git a/docs/product-manuals/clients/cli-client/assets/gettingstarted_quickstart_advanced.bpmn b/docs/product-manuals/clients/cli-client/assets/gettingstarted_quickstart_advanced.bpmn new file mode 100644 index 00000000000..5f69a34f0e5 --- /dev/null +++ b/docs/product-manuals/clients/cli-client/assets/gettingstarted_quickstart_advanced.bpmn @@ -0,0 +1,80 @@ + + + + + Flow_15yg3k5 + + + + + + + Flow_15yg3k5 + Flow_13k1knz + + + Flow_13k1knz + Flow_0qhnfdq + Flow_1vlnqoi + + + + Flow_0qhnfdq + + + =return="Pong" + + + Flow_1vlnqoi + + + =return!="Pong" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances-other.png b/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances-other.png new file mode 100644 index 00000000000..c86c2f93c22 Binary files /dev/null and b/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances-other.png differ diff --git a/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances-pong.png b/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances-pong.png new file mode 100644 index 00000000000..4b39714892f Binary files /dev/null and b/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances-pong.png differ diff --git a/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances.png b/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances.png new file mode 100644 index 00000000000..e537b28f514 Binary files /dev/null and b/docs/product-manuals/clients/cli-client/assets/operate-advanced-instances.png differ diff --git a/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced-process-id.png b/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced-process-id.png new file mode 100644 index 00000000000..b8ca56eb469 Binary files /dev/null and b/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced-process-id.png differ diff --git a/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced-sequence-flows.png b/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced-sequence-flows.png new file mode 100644 index 00000000000..e6b139704a4 Binary files /dev/null and b/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced-sequence-flows.png differ diff --git a/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced.png b/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced.png new file mode 100644 index 00000000000..18153f5eb78 Binary files /dev/null and b/docs/product-manuals/clients/cli-client/assets/zeebe-modeler-advanced.png differ diff --git a/docs/product-manuals/clients/cli-client/get-started.md b/docs/product-manuals/clients/cli-client/get-started.md new file mode 100644 index 00000000000..f7a608b2f12 --- /dev/null +++ b/docs/product-manuals/clients/cli-client/get-started.md @@ -0,0 +1,177 @@ +--- +id: get-started +title: "CLI client - Getting started guide" +sidebar_label: "Getting started guide" +--- + +In this tutorial, you will learn to use the CLI client `zbctl` to interact with Camunda Cloud. + +## Prerequisites + +- [Camunda Cloud account](/guides/getting-started/create-camunda-cloud-account.md) +- [Cluster](/guides/getting-started/create-cluster.md) and [client credentials](/guides/getting-started/setup-client-connection-credentials.md) +- [Modeler](/guides/getting-started/model-your-first-process.md) +- [NPM environment](https://www.npmjs.com/) + +## Set up + +### Installation + +An installation can be done quickly via the package manager `npm`. The corresponding package is [here](https://www.npmjs.com/package/zbctl). + +```bash +npm i -g zbctl +``` + +You can also download a binary for your Operating System from the [Zeebe GitHub releases page](https://github.com/zeebe-io/zeebe/releases). + +### Connection settings + +To use `zbctl` it is recommended to define environment variables for the connection settings: + +```bash +export ZEEBE_ADDRESS='[Zeebe API]' +export ZEEBE_CLIENT_ID='[Client ID]' +export ZEEBE_CLIENT_SECRET='[Client Secret]' +export ZEEBE_AUTHORIZATION_SERVER_URL='[OAuth API]' +``` + +When you create client credentials in Camunda Cloud you have the option to download a file with above lines filled out for you. + +Alternatively, use the [described flags](https://www.npmjs.com/package/zbctl#usage) (`--address`, `--clientId` and `--clientSecret`). with the zbctl commands. + +### Test command + +Use this command to verify that everything is set up correctly: + +```bash +zbctl status +``` + +As a result you will get a similar response: + +```bash +Cluster size: 1 +Partitions count: 2 +Replication factor: 1 +Gateway version: unavailable +Brokers: + Broker 0 - zeebe-0.zeebe-broker-service.456637ef-8832-428b-a2a4-82b531b25635-zeebe.svc.cluster.local:26501 + Version: unavailable + Partition 1 : Leader + Partition 2 : Leader +``` + +## Advanced workflow + +Use [this workflow model](./assets/gettingstarted_quickstart_advanced.bpmn) for the tutorial. + +![processId](./assets/zeebe-modeler-advanced-process-id.png) + +This workflow includes a service task and an XOR gateway. Select the service task and fill in the properties. Set the **Type** to `test-worker`. + +![workflow](./assets/zeebe-modeler-advanced.png) + +The worker will return a JSON object as a result, which is used to decide which path to take. +Now, we can use the JSON object to route your process by filling in the condition expression on the two sequence flows after the XOR gateway. + +Use the following conditional expression for the "Pong" sequence flow: + +```bash +=return="Pong" +``` + +And for the else sequence flow: + +```bash +=return!="Pong" +``` + +![sequenceflows](./assets/zeebe-modeler-advanced-sequence-flows.png) + +## Deploy a Workflow + +Now you can deploy the [workflow](./assets/gettingstarted_quickstart_advanced.bpmn). Navigate to the folder, where you saved your workflow. + +```bash +zbctl deploy gettingstarted_quickstart_advanced.bpmn +``` + +If the deployment is successful you'll get the following output: + +```bash +{ + "key": 2251799813685493, + "workflows": [ + { + "bpmnProcessId": "camunda-cloud-quick-start-advanced", + "version": 1, + "workflowKey": 2251799813685492, + "resourceName": "gettingstarted_quickstart_advanced.bpmn" + } + ] +} +``` + +Important here is the `bpmnProcessId`, which you'll need for creating a new instance. + +## Register a worker + +The workflow uses the worker with the type `test-worker`. Register a new one by using the following command: + +```bash +zbctl create worker test-worker --handler "echo {\"return\":\"Pong\"}" +``` + +## Start a new instance + +You can start a new instance with a single command: + +```bash +zbctl create instance camunda-cloud-quick-start-advanced +``` + +As a result, you'll get the following output, which contains, among others, the `workflowInstanceKey`: + +```bash +{ + "workflowKey": 2251799813685492, + "bpmnProcessId": "camunda-cloud-quick-start-advanced", + "version": 1, + "workflowInstanceKey": 2251799813685560 +} +``` + +Navigate to Operate to monitor the workflow instance. + +![operate-instances](assets/operate-advanced-instances-pong.png) + +Because the worker returns + +```json +{ + "return": "Pong" +} +``` + +the workflow ends in the upper end event following the Ping sequence flow. + +Changing the worker to + +```bash +zbctl create worker test-worker --handler "echo {\"return\":\"...\"}" +``` + +and creating a new instance leads to a second instance in Operate, which you'll see ending in the second end event following the else sequence flow: + +![operate-instance](assets/operate-advanced-instances-other.png) + +As a next step you can now connect both workers in parallel and create more workflow instances: + +```bash +while true; do zbctl create instance camunda-cloud-quick-start-advanced; sleep 1; done +``` + +In Operate you will see instances ending in both end events depending on which worker picked up the job. + +![operate-instances](assets/operate-advanced-instances.png) diff --git a/docs/product-manuals/clients/cli-client/index.md b/docs/product-manuals/clients/cli-client/index.md new file mode 100644 index 00000000000..542f0a7926a --- /dev/null +++ b/docs/product-manuals/clients/cli-client/index.md @@ -0,0 +1,80 @@ +--- +id: index +title: CLI client +sidebar_label: "Quick reference" +--- + +`zbctl` is the command line interface to interact with Camunda Cloud. After installation, a connection can be tested immediately. + +## Installation + +An installation can be done quickly via the package manager `npm`. The corresponding package is [here](https://www.npmjs.com/package/zbctl). + +```bash +npm i -g zbctl +``` + +You can also download a binary for your Operating System from the [Zeebe GitHub releases page](https://github.com/zeebe-io/zeebe/releases). + +## Connection settings + +To use `zbctl` it is recommended to define environment variables for the connection settings: + +```bash +export ZEEBE_ADDRESS='[Zeebe API]' +export ZEEBE_CLIENT_ID='[Client ID]' +export ZEEBE_CLIENT_SECRET='[Client Secret]' +export ZEEBE_AUTHORIZATION_SERVER_URL='[OAuth API]' +``` + +When you create client credentials in Camunda Cloud you have the option to download a file with above lines filled out for you. + +Alternatively, use the [described flags](https://www.npmjs.com/package/zbctl#usage) (`--address`, `--clientId` and `--clientSecret`). with the zbctl commands. + +## Usage + +``` +zbctl [options] [command] +``` + +``` +zbctl is command line interface designed to create and read resources inside zeebe broker. +It is designed for regular maintenance jobs such as: + * deploying workflows, + * creating jobs and workflow instances + * activating, completing or failing jobs + * update variables and retries + * view cluster status + +Usage: + zbctl [command] + +Available Commands: + activate Activate a resource + cancel Cancel resource + complete Complete a resource + create Create resources + deploy Creates new workflow defined by provided BPMN or YAML file as workflowPath + fail Fail a resource + generate Generate documentation + help Help about any command + publish Publish a message + resolve Resolve a resource + set Set a resource + status Checks the current status of the cluster + update Update a resource + version Print the version of zbctl + +Flags: + --address string Specify a contact point address. If omitted, will read from the environment variable 'ZEEBE_ADDRESS' (default '127.0.0.1:26500') + --audience string Specify the resource that the access token should be valid for. If omitted, will read from the environment variable 'ZEEBE_TOKEN_AUDIENCE' + --authzUrl string Specify an authorization server URL from which to request an access token. If omitted, will read from the environment variable 'ZEEBE_AUTHORIZATION_SERVER_URL' (default "https://login.cloud.camunda.io/oauth/token/") + --certPath string Specify a path to a certificate with which to validate gateway requests. If omitted, will read from the environment variable 'ZEEBE_CA_CERTIFICATE_PATH' + --clientCache string Specify the path to use for the OAuth credentials cache. If omitted, will read from the environment variable 'ZEEBE_CLIENT_CONFIG_PATH' (default "/Users/sitapati/.camunda/credentials") + --clientId string Specify a client identifier to request an access token. If omitted, will read from the environment variable 'ZEEBE_CLIENT_ID' + --clientSecret string Specify a client secret to request an access token. If omitted, will read from the environment variable 'ZEEBE_CLIENT_SECRET' + -h, --help help for zbctl + --insecure Specify if zbctl should use an unsecured connection. If omitted, will read from the environment variable 'ZEEBE_INSECURE_CONNECTION' + +Use "zbctl [command] --help" for more information about a command. +``` diff --git a/docs/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-1.gif b/docs/product-manuals/clients/go-client/assets/java-get-started-monitor-1.gif similarity index 100% rename from docs/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-1.gif rename to docs/product-manuals/clients/go-client/assets/java-get-started-monitor-1.gif diff --git a/docs/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-2.gif b/docs/product-manuals/clients/go-client/assets/java-get-started-monitor-2.gif similarity index 100% rename from docs/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-2.gif rename to docs/product-manuals/clients/go-client/assets/java-get-started-monitor-2.gif diff --git a/docs/product-manuals/zeebe/clients/go-client/assets/order-process-simple.png b/docs/product-manuals/clients/go-client/assets/order-process-simple.png similarity index 100% rename from docs/product-manuals/zeebe/clients/go-client/assets/order-process-simple.png rename to docs/product-manuals/clients/go-client/assets/order-process-simple.png diff --git a/docs/product-manuals/zeebe/clients/go-client/assets/order-process.png b/docs/product-manuals/clients/go-client/assets/order-process.png similarity index 100% rename from docs/product-manuals/zeebe/clients/go-client/assets/order-process.png rename to docs/product-manuals/clients/go-client/assets/order-process.png diff --git a/docs/product-manuals/clients/go-client/get-started.md b/docs/product-manuals/clients/go-client/get-started.md new file mode 100644 index 00000000000..8a31028e761 --- /dev/null +++ b/docs/product-manuals/clients/go-client/get-started.md @@ -0,0 +1,361 @@ +--- +id: get-started +title: "Go client - Getting started guide" +sidebar_label: "Getting started guide" +--- + +In this tutorial, you will learn how to use the Go client in a Go application to interact with Camunda Cloud. + +You can find the complete source code on [GitHub](https://github.com/zeebe-io/zeebe-get-started-go-client). + +## Prerequisites + +- [Camunda Cloud account](/guides/getting-started/create-camunda-cloud-account.md) +- [Cluster](/guides/getting-started/create-cluster.md) and [client credentials](/guides/getting-started/setup-client-connection-credentials.md) +- [Modeler](/guides/getting-started/model-your-first-process.md) +- Go v1.13+ environment installed + +## Set up a project + +First, we need a new Go project. +Create a new project using your IDE, or create new Go module with: + +``` +mkdir -p $GOPATH/src/github.com/zb-user/zb-example +cd $GOPATH/src/github.com/zb-user/zb-example +go mod init +``` + +To use the Zeebe Go client library, add the following dependency to your `go.mod`: + +``` +module github.com/zb-user/zb-example + +go 1.13 + +require github.com/zeebe-io/zeebe/clients/go v0.26.0 +``` + +Set the connection settings and client credentials as environment variables: + +```bash +export ZEEBE_ADDRESS='[Zeebe API]' +export ZEEBE_CLIENT_ID='[Client ID]' +export ZEEBE_CLIENT_SECRET='[Client Secret]' +export ZEEBE_AUTHORIZATION_SERVER_URL='[OAuth API]' +``` + +**Hint:** When you create client credentials in Camunda Cloud you have the option to download a file with the lines above filled out for you. + +Create a `main.go` file inside the module and add the following lines to bootstrap the Zeebe client: + +```go +package main + +import ( + "context" + "fmt" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" + "github.com/zeebe-io/zeebe/clients/go/pkg/pb" + "os" +) + +func main() { + client, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: os.Getenv("ZEEBE_ADDRESS"), + }) + + if err != nil { + panic(err) + } + + ctx := context.Background() + topology, err := client.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + for _, broker := range topology.Brokers { + fmt.Println("Broker", broker.Host, ":", broker.Port) + for _, partition := range broker.Partitions { + fmt.Println(" Partition", partition.PartitionId, ":", roleToString(partition.Role)) + } + } +} + +func roleToString(role pb.Partition_PartitionBrokerRole) string { + switch role { + case pb.Partition_LEADER: + return "Leader" + case pb.Partition_FOLLOWER: + return "Follower" + default: + return "Unknown" + } +} +``` + +Run the program. + +```bash +go run main.go +``` + +You should see similar output: + +``` +Broker 0.0.0.0 : 26501 + Partition 1 : Leader +``` + +## Model a workflow + +Now, we need a simple workflow we can deploy. Later, we will extend the workflow with more functionality. + +Open the [modeler](/guides/getting-started/model-your-first-process.md) of your choice and create a new BPMN diagram. + +Add a start event named `Order Placed` and an end event named `Order Delivered` to the diagram and connect the events. + +![model-workflow-step-1](assets/order-process-simple.png) + +Set the **id** (the BPMN process id), and mark the diagram as **executable**. + +Save the diagram as `src/main/resources/order-process.bpmn` under the project's folder. + +## Deploy a workflow + +Next, we want to deploy the modeled workflow to the broker. + +The broker stores the workflow under its BPMN process id and assigns a version. + +```go + // After the client is created + ctx := context.Background() + response, err := client.NewDeployWorkflowCommand().AddResourceFile("order-process.bpmn").Send(ctx) + if err != nil { + panic(err) + } + fmt.Println(response.String()) +``` + +Run the program and verify that the workflow is deployed successfully. +You should see similar the output: + +``` +key:2251799813686743 workflows: +``` + +## Create a workflow instance + +We are ready to create a first instance of the deployed workflow. + +A workflow instance is created of a specific version of the workflow, which can +be set on creation. + +```go + // After the workflow is deployed. + variables := make(map[string]interface{}) + variables["orderId"] = "31243" + + request, err := client.NewCreateInstanceCommand().BPMNProcessId("order-process").LatestVersion().VariablesFromMap(variables) + if err != nil { + panic(err) + } + + ctx := context.Background() + + msg, err := request.Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(msg.String()) +``` + +Run the program and verify that the workflow instance is created. You should see the output: + +``` +workflowKey:2251799813686742 bpmnProcessId:"order-process" version:3 workflowInstanceKey:2251799813686744 +``` + +You did it! + +## See the workflow in action + +You want to see how the workflow instance is executed? + +1. Go to the cluster in Camunda Cloud and select it +1. Click on the link to [Operate](/product-manuals/operate/userguide/basic-operate-navigation.md) +1. Select the workflow _order process_ + +As you can see, a workflow instance has been started and finished. + +## Work on a task + +Now we want to do some work within our workflow. + +First, add a few service +tasks to the BPMN diagram and set the required attributes. Then extend your +`main.go` file and activate a job which are created when the workflow instance +reaches a service task. + +Open the BPMN diagram in the modeler. Insert three service tasks between the start and the end event. + +- Name the first task `Collect Money`. +- Name the second task `Fetch Items`. +- Name the third task `Ship Parcel`. + +![model-workflow-step-2](assets/order-process.png) + +You need to set the type of each task, which identifies the nature of the work to be performed. + +- Set the **type** of the first task to `payment-service`. +- Set the **type** of the second task to `fetcher-service`. +- Set the **type** of the third task to `shipping-service`. + +The consolidated example looks as follows: + +```go +package main + +import ( + "context" + "fmt" + "github.com/zeebe-io/zeebe/clients/go/pkg/entities" + "github.com/zeebe-io/zeebe/clients/go/pkg/worker" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" + "log" + "os" +) + +const ZeebeAddr = "0.0.0.0:26500" + +var readyClose = make(chan struct{}) + +func main() { + gatewayAddr := os.Getenv("ZEEBE_ADDRESS") + plainText:= false + + if (gatewayAddr == "") { + gatewayAddr = ZeebeAddr + plainText = true + } + + zbClient, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: gatewayAddr, + UsePlaintextConnection: plainText, + }) + + if err != nil { + panic(err) + } + + // deploy workflow + ctx := context.Background() + response, err := zbClient.NewDeployWorkflowCommand().AddResourceFile("order-process-4.bpmn").Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(response.String()) + + // create a new workflow instance + variables := make(map[string]interface{}) + variables["orderId"] = "31243" + + request, err := zbClient.NewCreateInstanceCommand().BPMNProcessId("order-process-4").LatestVersion().VariablesFromMap(variables) + if err != nil { + panic(err) + } + + result, err := request.Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(result.String()) + + jobWorker := zbClient.NewJobWorker().JobType("payment-service").Handler(handleJob).Open() + + <-readyClose + jobWorker.Close() + jobWorker.AwaitClose() +} + +func handleJob(client worker.JobClient, job entities.Job) { + jobKey := job.GetKey() + + headers, err := job.GetCustomHeadersAsMap() + if err != nil { + // failed to handle job as we require the custom job headers + failJob(client, job) + return + } + + variables, err := job.GetVariablesAsMap() + if err != nil { + // failed to handle job as we require the variables + failJob(client, job) + return + } + + variables["totalPrice"] = 46.50 + request, err := client.NewCompleteJobCommand().JobKey(jobKey).VariablesFromMap(variables) + if err != nil { + // failed to set the updated variables + failJob(client, job) + return + } + + log.Println("Complete job", jobKey, "of type", job.Type) + log.Println("Processing order:", variables["orderId"]) + log.Println("Collect money using payment method:", headers["method"]) + + ctx := context.Background() + _, err = request.Send(ctx) + if err != nil { + panic(err) + } + + log.Println("Successfully completed job") + close(readyClose) +} + +func failJob(client worker.JobClient, job entities.Job) { + log.Println("Failed to complete job", job.GetKey()) + + ctx := context.Background() + _, err := client.NewFailJobCommand().JobKey(job.GetKey()).Retries(job.Retries - 1).Send(ctx) + if err != nil { + panic(err) + } +} +``` + +In this example we open a [job worker](/product-manuals/concepts/job-workers.md) for jobs of type `payment-service`. +The job worker will repeatedly poll for new jobs of the type `payment-service` and activate them +subsequently. Each activated job will then be passed to the job handler which implements the business +logic of the job worker. The handler will then complete the job with its result or fail the job if +it encounters a problem while processing the job. + +When you have a look at the Zeebe Monitor, then you can see that the workflow instance moved from the first service task to the next one: + +When you run the above example you should see similar output: + +``` +key:2251799813686751 workflows: +workflowKey:2251799813686750 bpmnProcessId:"order-process" version:4 workflowInstanceKey:22517998136 +86752 +2019/06/06 20:59:50 Complete job 2251799813686760 of type payment-service +2019/06/06 20:59:50 Processing order: 31243 +2019/06/06 20:59:50 Collect money using payment method: VISA +``` + +## What's next? + +Yay! You finished this tutorial and learned the basic usage of the Go client. + +Next steps: + +- Learn more about the [concepts behind Zeebe](/product-manuals/concepts/what-is-camunda-cloud.md) +- Learn more about [BPMN workflows](/reference/bpmn-workflows/bpmn-primer.md) diff --git a/docs/product-manuals/clients/go-client/index.md b/docs/product-manuals/clients/go-client/index.md new file mode 100644 index 00000000000..f711912210c --- /dev/null +++ b/docs/product-manuals/clients/go-client/index.md @@ -0,0 +1,108 @@ +--- +id: index +title: "Go client" +sidebar_label: "Quick reference" +--- + +## Dependencies + +To use the Zeebe Go client library, add the following dependency to your `go.mod`: + +``` +module github.com/zb-user/zb-example + +go 1.13 + +require github.com/zeebe-io/zeebe/clients/go v0.26.0 +``` + +## Bootstrapping + +In Go code, instantiate the client as follows: + +```go +package main + +import ( + "context" + "fmt" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" +) + +func main() { + credsProvider, err := zbc.NewOAuthCredentialsProvider(&zbc.OAuthProviderConfig{ + ClientID: "clientId", + ClientSecret: "clientSecret", + Audience: "zeebeAddress", + }) + if err != nil { + panic(err) + } + + client, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: "zeebeAddress", + CredentialsProvider: credsProvider, + }) + if err != nil { + panic(err) + } + + + ctx := context.Background() + response, err := client.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(response.String()) +} +``` + +Let's go over this code snippet line by line: + +- First we create the credentials provider for the OAuth protocol. This is needed to authenticate your client. +- Next we create the client passing in the address of the cluster we want to connect to, as well as, the credentials provider from the step above. +- Finally, we send a test request to verify that the connection was established. + +The values for these settings can be taken from the connection info on the **Client Credentials** page. Note that `clientSecret` is only visible when you create the client credentials. + +Another, more compact, option is to pass in the connection settings via environment variables: + +```bash +export ZEEBE_ADDRESS='[Zeebe API]' +export ZEEBE_CLIENT_ID='[Client ID]' +export ZEEBE_CLIENT_SECRET='[Client Secret]' +export ZEEBE_AUTHORIZATION_SERVER_URL='[OAuth API]' +``` + +When you create client credentials in Camunda Cloud you have the option to download a file with the lines above filled out for you. + +Given these environment variables, you can instantiate the client as follows: + +```go +package main + +import ( + "context" + "fmt" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" + "os" +) + +func main() { + client, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: os.Getenv("ZEEBE_ADDRESS"), + }) + if err != nil { + panic(err) + } + + ctx := context.Background() + response, err := client.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(response.String()) +} +``` diff --git a/docs/product-manuals/clients/java-client-examples/cluster-topology-request.md b/docs/product-manuals/clients/java-client-examples/cluster-topology-request.md new file mode 100644 index 00000000000..cb71ee64aff --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/cluster-topology-request.md @@ -0,0 +1,35 @@ +--- +id: cluster-topology-request +title: "Request cluster topology" +--- + +This example shows which broker is leader and follower for which partition. Particularly useful when you run a cluster with multiple Zeebe brokers. + +## Related resources + +- [Clustering casics](/product-manuals/zeebe/technical-concepts/clustering.md) + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) + +## TopologyViewer.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/cluster/TopologyViewer.java) + +```java +final Topology topology = client.newTopologyRequest().send().join(); + +System.out.println("Topology:"); +topology + .getBrokers() + .forEach( + b -> { + System.out.println(" " + b.getAddress()); + b.getPartitions() + .forEach( + p -> + System.out.println( + " " + p.getPartitionId() + " - " + p.getRole())); + }); +``` diff --git a/docs/product-manuals/clients/java-client-examples/data-pojo.md b/docs/product-manuals/clients/java-client-examples/data-pojo.md new file mode 100644 index 00000000000..32bea2ba1c0 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/data-pojo.md @@ -0,0 +1,74 @@ +--- +id: data-pojo +title: "Handle variables as POJO" +--- + +## Related Resources + +- [Data flow](../../../reference/bpmn-workflows/data-flow.md) + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) +1. Run the [deploy a workflow example](workflow-deploy.md) + +## HandleVariablesAsPojo.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/data/HandleVariablesAsPojo.java) + +```java + ... + try (final ZeebeClient client = clientBuilder.build()) { + final Order order = new Order(); + order.setOrderId(31243); + + client + .newCreateInstanceCommand() + .bpmnProcessId("demoProcess") + .latestVersion() + .variables(order) + .send() + .join(); + + client.newWorker().jobType("foo").handler(new DemoJobHandler()).open(); + + // run until System.in receives exit command + waitUntilSystemInput("exit"); + } + } + + public static class Order { + private long orderId; + private double totalPrice; + + public long getOrderId() { + return orderId; + } + + public void setOrderId(final long orderId) { + this.orderId = orderId; + } + + public double getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(final double totalPrice) { + this.totalPrice = totalPrice; + } + } + + private static class DemoJobHandler implements JobHandler { + @Override + public void handle(final JobClient client, final ActivatedJob job) { + // read the variables of the job + final Order order = job.getVariablesAsType(Order.class); + System.out.println("new job with orderId: " + order.getOrderId()); + + // update the variables and complete the job + order.setTotalPrice(46.50); + + client.newCompleteCommand(job.getKey()).variables(order).send(); + } + } +``` diff --git a/docs/product-manuals/clients/java-client-examples/index.md b/docs/product-manuals/clients/java-client-examples/index.md new file mode 100644 index 00000000000..c8574d6e8d8 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/index.md @@ -0,0 +1,36 @@ +--- +id: index +title: "Java examples" +sidebar_label: "Overview" +--- + +These examples are accessible in the [zeebe github repository](https://github.com/zeebe-io/zeebe/) on the [develop branch](https://github.com/zeebe-io/zeebe/tree/develop/samples). + +Instructions to access code locally: + +``` +git clone https://github.com/zeebe-io/zeebe.git +git checkout develop +cd zeebe/samples +``` + +Import the Maven project in the `samples` directory into your IDE to start hacking. + +## Workflow + +- [Deploy a workflow](workflow-deploy.md) +- [Create a workflow instance](workflow-instance-create.md) +- [Create non-blocking workflow instances](workflow-instance-create-nonblocking.md) +- [Create a Workflow Instance with Results](workflow-instance-create-with-result.md) + +## Job + +- [Open a job worker](job-worker-open.md) + +## Data + +- [Handle variables as POJO](data-pojo.md) + +## Cluster + +- [Request cluster topology](cluster-topology-request.md) diff --git a/docs/product-manuals/clients/java-client-examples/job-worker-open.md b/docs/product-manuals/clients/java-client-examples/job-worker-open.md new file mode 100644 index 00000000000..582b3d65301 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/job-worker-open.md @@ -0,0 +1,51 @@ +--- +id: job-worker-open +title: "Open a job worker" +--- + +## Related Resources + +- [Job worker basics](/product-manuals/concepts/job-workers.md) + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) +1. Run the [deploy a workflow example](workflow-deploy.md) +1. Run the [create a workflow instance example](workflow-instance-create.md) a couple of times + +## JobWorkerCreator.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/job/JobWorkerCreator.java) + +```java + ... + final String jobType = "foo"; + + try (final ZeebeClient client = clientBuilder.build()) { + + System.out.println("Opening job worker."); + + try (final JobWorker workerRegistration = + client + .newWorker() + .jobType(jobType) + .handler(new ExampleJobHandler()) + .timeout(Duration.ofSeconds(10)) + .open()) { + System.out.println("Job worker opened and receiving jobs."); + + // run until System.in receives exit command + waitUntilSystemInput("exit"); + } + } + } + + private static class ExampleJobHandler implements JobHandler { + @Override + public void handle(final JobClient client, final ActivatedJob job) { + // here: business logic that is executed with every job + System.out.println(job); + client.newCompleteCommand(job.getKey()).send().join(); + } + } +``` diff --git a/docs/product-manuals/clients/java-client-examples/workflow-deploy.md b/docs/product-manuals/clients/java-client-examples/workflow-deploy.md new file mode 100644 index 00000000000..6970129bb09 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/workflow-deploy.md @@ -0,0 +1,37 @@ +--- +id: workflow-deploy +title: "Deploy a workflow" +--- + +## Related resources + +- [Workflow basics](/product-manuals/concepts/workflows.md) +- [BPMN introduction](/reference/bpmn-workflows/bpmn-primer.md) + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) + +## WorkflowDeployer.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/workflow/WorkflowDeployer.java) + +```java +final DeploymentEvent deploymentEvent = + client.newDeployCommand() + .addResourceFromClasspath("demoProcess.bpmn") + .send() + .join(); +``` + +## demoProcess.bpmn + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/resources/demoProcess.bpmn) + +Download the XML and save it in the Java classpath before running the example. Open the file with Zeebe Modeler for a graphical representation. + + diff --git a/docs/product-manuals/clients/java-client-examples/workflow-instance-create-nonblocking.md b/docs/product-manuals/clients/java-client-examples/workflow-instance-create-nonblocking.md new file mode 100644 index 00000000000..36333e9e4a1 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/workflow-instance-create-nonblocking.md @@ -0,0 +1,27 @@ +--- +id: workflow-instance-create-nonblocking +title: "Create non-blocking workflow instances" +--- + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) +1. Run the [deploy a workflow example](workflow-deploy.md) + +## NonBlockingWorkflowInstanceCreator.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/workflow/NonBlockingWorkflowInstanceCreator.java) + +```java +long instancesCreating = 0; + +while (instancesCreating < numberOfInstances) { + // this is non-blocking/async => returns a future + final ZeebeFuture future = + client.newCreateInstanceCommand().bpmnProcessId(bpmnProcessId).latestVersion().send(); + + // could put the future somewhere and eventually wait for its completion + + instancesCreating++; +} +``` diff --git a/docs/product-manuals/clients/java-client-examples/workflow-instance-create-with-result.md b/docs/product-manuals/clients/java-client-examples/workflow-instance-create-with-result.md new file mode 100644 index 00000000000..60bcf580d96 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/workflow-instance-create-with-result.md @@ -0,0 +1,30 @@ +--- +id: workflow-instance-create-with-result +title: "Create a workflow instance with results" +--- + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) +1. Run the [deploy a workflow example](workflow-deploy.md). Deploy [`demoProcessSingleTask.bpmn`](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/resources/demoProcessSingleTask.bpmn) instead of `demoProcess.bpmn` + +## WorkflowInstanceWithResultCreator.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/workflow/WorkflowInstanceWithResultCreator.java) + +```java +final WorkflowInstanceResult workflowInstanceResult = + client + .newCreateInstanceCommand() + .bpmnProcessId(bpmnProcessId) + .latestVersion() + .withResult() // to await the completion of workflow execution and return result + .send() + .join(); + +System.out.println( + "Workflow instance created with key: " + + workflowInstanceResult.getWorkflowInstanceKey() + + " and completed with results: " + + workflowInstanceResult.getVariables()); +``` diff --git a/docs/product-manuals/clients/java-client-examples/workflow-instance-create.md b/docs/product-manuals/clients/java-client-examples/workflow-instance-create.md new file mode 100644 index 00000000000..5610ff65132 --- /dev/null +++ b/docs/product-manuals/clients/java-client-examples/workflow-instance-create.md @@ -0,0 +1,23 @@ +--- +id: workflow-instance-create +title: "Create a workflow instance" +--- + +## Prerequisites + +1. Running Zeebe broker with endpoint `localhost:26500` (default) +1. Run the [deploy a workflow example](workflow-deploy.md) + +## WorkflowInstanceCreator.java + +[Source on github](https://github.com/zeebe-io/zeebe/tree/develop/samples/src/main/java/io/zeebe/example/workflow/WorkflowInstanceCreator.java) + +```java +final WorkflowInstanceEvent workflowInstanceEvent = + client + .newCreateInstanceCommand() + .bpmnProcessId(bpmnProcessId) + .latestVersion() + .send() + .join(); +``` diff --git a/docs/product-manuals/zeebe/clients/java-client/assets/order-process-simple.png b/docs/product-manuals/clients/java-client/assets/order-process-simple.png similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/assets/order-process-simple.png rename to docs/product-manuals/clients/java-client/assets/order-process-simple.png diff --git a/docs/product-manuals/zeebe/clients/java-client/assets/order-process.png b/docs/product-manuals/clients/java-client/assets/order-process.png similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/assets/order-process.png rename to docs/product-manuals/clients/java-client/assets/order-process.png diff --git a/docs/product-manuals/clients/java-client/get-started.md b/docs/product-manuals/clients/java-client/get-started.md new file mode 100644 index 00000000000..0199ec16a55 --- /dev/null +++ b/docs/product-manuals/clients/java-client/get-started.md @@ -0,0 +1,387 @@ +--- +id: get-started +title: "Java client - Getting started guide" +sidebar_label: "Getting started guide" +--- + +In this tutorial, you will learn to use the Java client in a Java application to interact with Camunda Cloud. + +You can find the complete source code, including the BPMN diagrams, on [GitHub](https://github.com/zeebe-io/zeebe-get-started-java-client). + +## Prerequisites + +- [Camunda Cloud account](/guides/getting-started/create-camunda-cloud-account.md) +- [Cluster](/guides/getting-started/create-cluster.md) and [client credentials](/guides/getting-started/setup-client-connection-credentials.md) +- [Modeler](/guides/getting-started/model-your-first-process.md) +- Java 8 or higher +- [Apache Maven](https://maven.apache.org/) + +## Set up a project + +First, we need a Maven project. +Create a new project using your IDE, or run the Maven command: + +``` +mvn archetype:generate \ + -DgroupId=io.zeebe \ + -DartifactId=zeebe-get-started-java-client \ + -DarchetypeArtifactId=maven-archetype-quickstart \ + -DinteractiveMode=false +``` + +Add the Zeebe client library as dependency to the project's `pom.xml`: + +```xml + + io.zeebe + zeebe-client-java + ${zeebe.version} + +``` + +Set the connection settings and client credentials as environment variables: + +```bash +export ZEEBE_ADDRESS='[Zeebe API]' +export ZEEBE_CLIENT_ID='[Client ID]' +export ZEEBE_CLIENT_SECRET='[Client Secret]' +export ZEEBE_AUTHORIZATION_SERVER_URL='[OAuth API]' +``` + +**Hint:** When you create client credentials in Camunda Cloud you have the option to download a file with the lines above filled out for you. + +Create a main class and add the following lines to bootstrap the Zeebe client: + +```java +package io.zeebe; + +import io.zeebe.client.ZeebeClient; + +public class App +{ + public static void main(final String[] args) + { + final String gatewayAddress = System.getenv("ZEEBE_ADDRESS"); + + final ZeebeClient client = + ZeebeClient.newClientBuilder() + .gatewayAddress(gatewayAddress) + .build(); + + System.out.println("Connected"); + + ... + + client.close(); + System.out.println("Closed."); + } +} +``` + +Run the program: + +- If you use an IDE, you can just execute the main class, using your IDE. +- Otherwise, you must build an executable JAR file with Maven and execute it. + +### Build an executable JAR file + +Add the Maven Shade plugin to your pom.xml: + +```xml + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + + package + + shade + + + + + + io.zeebe.App + + + + + + +``` + +Now run `mvn package`, and it will generate a JAR file in the `target` subdirectory. You can run this with `java -jar target/${JAR file}`. + +### Output of executing program + +You should see the output: + +``` +Connected. + +Closed. +``` + +## Model a workflow + +Now, we need a simple workflow we can deploy. Later, we will extend the workflow with more functionality. + +Open the [modeler](/guides/getting-started/model-your-first-process.md) of your choice and create a new BPMN diagram. + +Add a start event named `Order Placed` and an end event named `Order Delivered` to the diagram and connect the events. + +![model-workflow-step-1](assets/order-process-simple.png) + +Set the **id** (the BPMN process id), and mark the diagram as **executable**. + +Save the diagram as `src/main/resources/order-process.bpmn` under the project's folder. + +## Deploy a workflow + +Next, we want to deploy the modeled workflow to the broker. + +The broker stores the workflow under its BPMN process id and assigns a version. + +Add the following deploy command to the main class: + +```java +package io.zeebe; + +import io.zeebe.client.api.response.DeploymentEvent; + +public class Application +{ + public static void main(final String[] args) + { + // after the client is connected + + final DeploymentEvent deployment = client.newDeployCommand() + .addResourceFromClasspath("order-process.bpmn") + .send() + .join(); + + final int version = deployment.getWorkflows().get(0).getVersion(); + System.out.println("Workflow deployed. Version: " + version); + + // ... + } +} +``` + +Run the program and verify that the workflow is deployed successfully. +You should see the output: + +``` +Workflow deployed. Version: 1 +``` + +## Create a workflow instance + +We are ready to create our first instance of the deployed workflow. + +A workflow instance is created from a specific version of the workflow, which can be set on creation. + +Add the following create command to the main class: + +```java +package io.zeebe; + +import io.zeebe.client.api.response.WorkflowInstanceEvent; + +public class Application +{ + public static void main(final String[] args) + { + // after the workflow is deployed + + final WorkflowInstanceEvent wfInstance = client.newCreateInstanceCommand() + .bpmnProcessId("order-process") + .latestVersion() + .send() + .join(); + + final long workflowInstanceKey = wfInstance.getWorkflowInstanceKey(); + + System.out.println("Workflow instance created. Key: " + workflowInstanceKey); + + // ... + } +} +``` + +Run the program and verify that the workflow instance is created. You should see the output: + +``` +Workflow instance created. Key: 2113425532 +``` + +You did it! + +## See the workflow in action + +You want to see how the workflow instance is executed? + +1. Go to the cluster in Camunda Cloud and select it +1. Click on the link to [Operate](/product-manuals/operate/userguide/basic-operate-navigation.md) +1. Select the workflow _order process_ + +As you can see, a workflow instance has been started and finished. + +## Work on a job + +Now we want to do some work within our workflow. + +First, add a few service jobs to the BPMN diagram and set the required attributes. Then extend your main class and create a job worker to process jobs which are created when the workflow instance reaches a service task. + +Open the BPMN diagram in the modeler. Insert three service tasks between the start and the end event. + +- Name the first task `Collect Money`. +- Name the second task `Fetch Items`. +- Name the third task `Ship Parcel`. + +![model-workflow-step-2](assets/order-process.png) + +You need to set the type of each task, which identifies the nature of the work to be performed. + +- Set the **type** of the first task to `payment-service`. +- Set the **type** of the second task to `fetcher-service`. +- Set the **type** of the third task to `shipping-service`. + +Save the BPMN diagram to the same file. When you run the program again, the changed workflow will be deployed and a new version of the workflow will be created. + +Switching back to the main class, add the following lines to create a job worker for the first jobs type: + +```java +package io.zeebe; + +import io.zeebe.client.api.worker.JobWorker; + +public class App +{ + public static void main(final String[] args) + { + // after the workflow instance is created + + try(final JobWorker jobWorker = client.newWorker()) { + jobWorker.jobType("payment-service") + .handler((jobClient, job) -> + { + System.out.println("Collect money"); + + // ... + + jobClient.newCompleteCommand(job.getKey()) + .send() + .join(); + }) + .open(); + + // waiting for the jobs + // Don't close, we need to keep polling to get work + // It will be close after last statement in try-with resources block + + // ... + } + + } +} +``` + +Run the program and verify that the job is processed. You should see the output: + +``` +Collect money +``` + +Looking at Operate, you can see that the workflow instance moved from the first service task to the next one. + +## Work with data + +Usually, a workflow is more than just tasks, there is also a data flow. The worker gets the data from the workflow instance to do its work and send the result back to the workflow instance. + +In Zeebe, the data is stored as key-value-pairs in the form of variables. Variables can be set when the workflow instance is created. Within the workflow, variables can be read and modified by workers. + +In our example, we want to create a workflow instance with the following variables: + +```json +"orderId": 31243 +"orderItems": [435, 182, 376] +``` + +The first task should read `orderId` as input and return `totalPrice` as result. + +Modify the workflow instance create command and pass the data as variables. Also, modify the job worker to read the job variables and complete the job with a result. + +```java +package io.zeebe; + +public class App +{ + public static void main(final String[] args) + { + // after the workflow is deployed + + final Map data = new HashMap<>(); + data.put("orderId", 31243); + data.put("orderItems", Arrays.asList(435, 182, 376)); + + final WorkflowInstanceEvent wfInstance = client.newCreateInstanceCommand() + .bpmnProcessId("order-process") + .latestVersion() + .variables(data) + .send() + .join(); + + // ... + + final JobWorker jobWorker = client.newWorker() + .jobType("payment-service") + .handler((jobClient, job) -> + { + final Map variables = job.getVariablesAsMap(); + + System.out.println("Process order: " + variables.get("orderId")); + double price = 46.50; + System.out.println("Collect money: $" + price); + + // ... + + final Map result = new HashMap<>(); + result.put("totalPrice", price); + + jobClient.newCompleteCommand(job.getKey()) + .variables(result) + .send() + .join(); + }) + .fetchVariables("orderId") + .open(); + + // ... + } +} +``` + +Run the program and verify that the variable is read. You should see the output: + +``` +Process order: 31243 +Collect money: $46.50 +``` + +When we have a look at the Operate, then we can see that the variable `totalPrice` is set. + +## Next steps + +From here there are several steps to take, depending on your preference: + +- Implement workers for the other two jobs to get the hang of it +- Check out examples for use cases not covered here: + - [Create non-blocking workflow instances](../java-client-examples/workflow-instance-create-nonblocking.md) + - [Create a workflow instance with results](../java-client-examples/workflow-instance-create-with-result.md) + - [Handle variables as POJO](../java-client-examples/data-pojo.md) +- Learn how to [write tests](testing.md) +- Learn more about [BPMN workflows](/reference/bpmn-workflows/bpmn-primer.md) in general diff --git a/docs/product-manuals/clients/java-client/index.md b/docs/product-manuals/clients/java-client/index.md new file mode 100644 index 00000000000..0eb14d27a95 --- /dev/null +++ b/docs/product-manuals/clients/java-client/index.md @@ -0,0 +1,90 @@ +--- +id: index +title: "Java client" +sidebar_label: "Quick reference" +--- + +## Dependencies + +To use the Java client library, declare the following Maven dependency in your project: + +```xml + + io.zeebe + zeebe-client-java + ${zeebe.version} + +``` + +If you are using Gradle, declare the following: + +```groovy +implementation 'io.zeebe:zeebe-client-java:${zeebe.version}' +``` + +Use the latest released version from [Maven Central](https://search.maven.org/artifact/io.zeebe/zeebe-client-java). + +## Bootstrapping + +In Java code, instantiate the client as follows: + +```java + private static final String zeebeAPI = "[Zeebe API]"; + private static final String clientId = "[Client ID]"; + private static final String clientSecret = "[Client Secret]"; + private static final String oAuthAPI = "[OAuth API] "; + + public static void main(String[] args) { + OAuthCredentialsProvider credentialsProvider = + new OAuthCredentialsProviderBuilder() + .authorizationServerUrl(oAuthAPI) + .audience(zeebeAPI) + .clientId(clientId) + .clientSecret(clientSecret) + .build(); + + ZeebeClient client = + ZeebeClient.newClientBuilder() + .gatewayAddress(zeebeAPI) + .credentialsProvider(credentialsProvider) + .build(); + + client.newTopologyRequest().send().join(); + } +``` + +Let's go over this code snippet line by line: + +- First we declare a couple of variables to define the connection properties. These values can be taken from the connection info on the _Client Credentials_ page. Note that `clientSecret` is only visible when you create the client credentials. +- Next we create the credentials provider for the OAuth protocol. This is needed to authenticate your client. +- Next we create the client passing in the address of the cluster we want to connect to as well as the credentials provider from the step above. +- Finally, we send a test request to verify that the connection was established. + +See `io.zeebe.client.ZeebeClientBuilder` for a description of all available configuration properties. + +Another, more compact, option is to pass in the connection settings via environment variables: + +```bash +export ZEEBE_ADDRESS='[Zeebe API]' +export ZEEBE_CLIENT_ID='[Client ID]' +export ZEEBE_CLIENT_SECRET='[Client Secret]' +export ZEEBE_AUTHORIZATION_SERVER_URL='[OAuth API]' +``` + +When you create client credentials in Camunda Cloud you have the option to download a file with the lines above filled out for you. + +Given these environment variables, you can instantiate the client as follows: + +```java +ZeebeClient client = + ZeebeClient.newClientBuilder() + .gatewayAddress(System.getenv("ZEEBE_ADDRESS")) + .build(); +``` + +## Next Steps + +- [Getting started guide](get-started.md) - Comprehensive tutorial that covers Zeebe Modeler, Operate and the Java client. +- [Logging](logging.md) - Introduction on how to configure logging for Zeebe Client +- [Writing tests](testing.md) - Introduction to writing tests that use an embedded version of the workflow engine +- [Examples](../java-client-examples/index.md) - Collection of specific examples for different use cases diff --git a/docs/product-manuals/zeebe/clients/java-client/logging.md b/docs/product-manuals/clients/java-client/logging.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/logging.md rename to docs/product-manuals/clients/java-client/logging.md diff --git a/docs/product-manuals/clients/java-client/testing.md b/docs/product-manuals/clients/java-client/testing.md new file mode 100644 index 00000000000..af767f91f50 --- /dev/null +++ b/docs/product-manuals/clients/java-client/testing.md @@ -0,0 +1,69 @@ +--- +id: testing +title: "Writing tests" +--- +You can use the `zeebe-test` module to write JUnit tests for your job worker and BPMN workflow. It provides a JUnit rule to bootstrap the broker and some basic assertions. + +## Usage in a Maven project + +Add `zeebe-test` as Maven test dependency to your project: + +```xml + + io.zeebe + zeebe-test + test + +``` + +## Bootstrap the broker + +Use the `ZeebeTestRule` in your test case to start an embedded broker. It contains a client which can be used to deploy a BPMN workflow or create an instance. + +```java +import io.zeebe.client.ZeebeClient; +import io.zeebe.client.api.response.WorkflowInstanceEvent; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +public class MyTest { + + @Rule public final ZeebeTestRule testRule = new ZeebeTestRule(); + + private ZeebeClient client; + + @Test + public void test() { + client = testRule.getClient(); + + client + .newDeployCommand() + .addResourceFromClasspath("process.bpmn") + .send() + .join(); + + final WorkflowInstanceEvent workflowInstance = + client + .newCreateInstanceCommand() + .bpmnProcessId("process") + .latestVersion() + .send() + .join(); + } +} +``` + +## Verify the Result + +The `ZeebeTestRule` provides also some basic assertions in AssertJ style. The entry point of the assertions is `ZeebeTestRule.assertThat(...)`. + +```java +final WorkflowInstanceEvent workflowInstance = ... + +ZeebeTestRule.assertThat(workflowInstance) + .isEnded() + .hasPassed("start", "task", "end") + .hasVariable("result", 21.0); +``` + diff --git a/docs/product-manuals/zeebe/clients/other-clients/c-sharp.md b/docs/product-manuals/clients/other-clients/c-sharp.md similarity index 100% rename from docs/product-manuals/zeebe/clients/other-clients/c-sharp.md rename to docs/product-manuals/clients/other-clients/c-sharp.md diff --git a/docs/product-manuals/clients/other-clients/index.md b/docs/product-manuals/clients/other-clients/index.md new file mode 100644 index 00000000000..9b2c70cbed7 --- /dev/null +++ b/docs/product-manuals/clients/other-clients/index.md @@ -0,0 +1,12 @@ +--- +id: index +title: "Overview" +--- + +In addition to the core Java and Go clients provided by Zeebe, there are a number of community-maintained Zeebe client libraries. + +- [C#](c-sharp.md) +- [JavaScript/NodeJS](javascript.md) +- [Python](python.md) +- [Ruby](ruby.md) +- [Rust](rust.md) diff --git a/docs/product-manuals/clients/other-clients/javascript.md b/docs/product-manuals/clients/other-clients/javascript.md new file mode 100644 index 00000000000..a10996fdfae --- /dev/null +++ b/docs/product-manuals/clients/other-clients/javascript.md @@ -0,0 +1,43 @@ +--- +id: javascript +title: "JavaScript/NodeJS" +--- + +## Zeebe Node + +The Zeebe Node client is maintained by [Josh Wulf](https://github.com/jwulf). It can be used to create Node.js applications. + +- [Source code](https://github.com/creditsenseau/zeebe-client-node-js) +- [NPM package](https://www.npmjs.com/package/zeebe-node) +- [User Guide](http://zeebe.joshwulf.com/) +- [API docs](https://creditsenseau.github.io/zeebe-client-node-js/) + +## NestJS client + +The NestJS client is maintained by [Dan Shapir](https://github.com/danshapir). It is a microservice transport that integrates Zeebe with the [NestJS](https://nestjs.com/) framework. + +- [Source code](https://github.com/pay-k/nestjs-zeebe) +- [NPM package](https://www.npmjs.com/package/@payk/nestjs-zeebe) +- [Podcast interview with Dan Shapir](https://zeebe.buzzsprout.com/454051/1989112-zeebe-and-nestjs) + +## Node-RED + +The [Node-RED](https://nodered.org/) Zeebe client is maintained by [Patrick Dehn](https://github.com/pedesen). + +- [Source code](https://github.com/pedesen/node-red-contrib-zeebe) +- [NPM package](https://www.npmjs.com/package/node-red-contrib-zeebe) + +## Workit Zeebe Client + +The Workit Zeebe client is maintained by [Olivier Albertini](https://github.com/OlivierAlbertini). It allows you to run the same application code against Zeebe or the Camunda engine, based on configuration settings. + +- [Source code](https://github.com/VilledeMontreal/workit) +- [NPM package](https://www.npmjs.com/package/workit-zeebe-client) +- [API docs](https://villedemontreal.github.io/workit/) + +## Zeebe ElasticSearch client + +The Zeebe ElasticSearch client is maintained by [Olivier Albertini](https://github.com/OlivierAlbertini). It provides an API for querying Zeebe's ElasticSearch export. + +- [Source](https://github.com/VilledeMontreal/workit/tree/master/packages/zeebe-elasticsearch-client) +- [NPM Package](https://www.npmjs.com/package/zeebe-elasticsearch-client) diff --git a/docs/product-manuals/zeebe/clients/other-clients/python.md b/docs/product-manuals/clients/other-clients/python.md similarity index 100% rename from docs/product-manuals/zeebe/clients/other-clients/python.md rename to docs/product-manuals/clients/other-clients/python.md diff --git a/docs/product-manuals/zeebe/clients/other-clients/ruby.md b/docs/product-manuals/clients/other-clients/ruby.md similarity index 100% rename from docs/product-manuals/zeebe/clients/other-clients/ruby.md rename to docs/product-manuals/clients/other-clients/ruby.md diff --git a/docs/product-manuals/zeebe/clients/other-clients/rust.md b/docs/product-manuals/clients/other-clients/rust.md similarity index 100% rename from docs/product-manuals/zeebe/clients/other-clients/rust.md rename to docs/product-manuals/clients/other-clients/rust.md diff --git a/docs/product-manuals/clients/overview.md b/docs/product-manuals/clients/overview.md new file mode 100644 index 00000000000..db43b14859e --- /dev/null +++ b/docs/product-manuals/clients/overview.md @@ -0,0 +1,44 @@ +--- +id: overview +title: "Clients" +sidebar_label: "Overview" +--- + +Clients allow applications to do the following things: + +- Deploy workflows +- Start/cancel workflow instances +- Activate jobs, work on those jobs and subsequently complete/fail jobs +- Publish messages +- Update workflow instance variables and resolve incidents + +Clients connect to Camunda Cloud via [gRPC](https://grpc.io), which is a high-performance, open source universal RPC protocol. + +Camunda Cloud provides several offical clients based on this API. Official clients have been developed and tested by Camunda. They also add convenience functions (e.g. thread handling for job workers) on top of the core API. + +Community clients supplement the official clients. These clients have not been tested by Camunda. + +## Official clients + +- [Java](java-client/index.md) +- [Go](go-client/get-started.md) +- [CLI](cli-client/index.md) + +## Community clients + +- [C#](other-clients/c-sharp.md) +- [JavaScript/NodeJS](other-clients/javascript.md) +- [Python](other-clients/python.md) +- [Ruby](other-clients/ruby.md) +- [Rust](other-clients/rust.md) + +Finally, it is possible to [build your own client](build-your-own-client.md) in case none of the other options are suitable. + +## Interacting with other components + +The clients mentioned above interact with Zeebe, the workflow engine integrated into Camunda Cloud. + +Other components in Camunda Cloud provide language-agnostic APIs, but no clients, to interact with them: + +- [Console API (REST)](/reference/cloud-console-api-reference.md) - enables you to create and manage clusters programmatically +- [Tasklist API (GraphQL)](/reference/tasklist-api/generated.md) - enables you to query, claim and complete user tasks diff --git a/docs/product-manuals/cloud-console/introduction.md b/docs/product-manuals/cloud-console/introduction.md new file mode 100644 index 00000000000..eeaa6511e06 --- /dev/null +++ b/docs/product-manuals/cloud-console/introduction.md @@ -0,0 +1,13 @@ +--- +id: introduction +title: Introduction to Cloud Console +--- + +The Cloud Console is the management application for the included products. Via the Cloud Console you can + +- [create](./manage-clusters/create-cluster.md) and [delete](./manage-clusters/delete-cluster.md) clusters, +- [manage API Clients](./manage-clusters/manage-api-clients.md) to interact with Zeebe and Tasklist, +- [manage Cloud Management API clients](./manage-organization/manage-cloud-management-api-clients.md) to manage clusters programmatically, and you can +- change your [organization settings](./manage-organization/organization-settings.md). + +If you don't have a Camunda Cloud account yet, you can find a registration description [here](../../guides/getting-started/create-camunda-cloud-account.md). diff --git a/docs/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue-multiple-organisations.png b/docs/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue-multiple-organisations.png deleted file mode 100644 index 92a539250fe..00000000000 Binary files a/docs/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue-multiple-organisations.png and /dev/null differ diff --git a/docs/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue.png b/docs/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue.png deleted file mode 100644 index 801907373e3..00000000000 Binary files a/docs/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue.png and /dev/null differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/create-cluster.md b/docs/product-manuals/cloud-console/manage-clusters/create-cluster.md index c4ce073b2e8..e28624ab266 100644 --- a/docs/product-manuals/cloud-console/manage-clusters/create-cluster.md +++ b/docs/product-manuals/cloud-console/manage-clusters/create-cluster.md @@ -1,18 +1,18 @@ --- id: create-cluster -title: Create a Cluster +title: Create a cluster --- After login you'll see the console overview page. Since you haven't created a cluster, the overview will be empty. ![cluster-creating](./img/cluster-overview-empty.png) -In the upper right area you'll find the button _Create New Cluster_. Click on it to create a new cluster. After you've assigned a name and created the cluster, a new entry appears in the overview: +In the upper right area you'll find the button **Create New Cluster**. Click on it to create a new cluster. After you've assigned a name and created the cluster, a new entry appears in the overview: ![cluster-creating](./img/cluster-overview-new-cluster-creating.png) -The cluster is now being set up. During this phase, its state is _Creating_. After one or two minutes the cluster is ready for use and changes its state to _healthy_: +The cluster is now being set up. During this phase, its state is _Creating_. After one or two minutes the cluster is ready for use and changes its state to _Healthy_: ![cluster-healthy](./img/cluster-overview-new-cluster-healthy.png) -After the cluster has been created, you can jump into the cluster detail page by clicking at the newly created cluster. +After the cluster has been created, you can jump into the cluster detail page by clicking on the cluster name. diff --git a/docs/product-manuals/cloud-console/manage-clusters/delete-cluster.md b/docs/product-manuals/cloud-console/manage-clusters/delete-cluster.md new file mode 100644 index 00000000000..fb668169edc --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-clusters/delete-cluster.md @@ -0,0 +1,15 @@ +--- +id: delete-cluster +title: Delete your cluster +--- + +:::danger +This action cannot be undone! +::: + +The cluster can be deleted at any time. The option can be found in the menu next to the cluster name in the cluster details. + +![cluster-delete](./img/cluster-delete.png) + + + \ No newline at end of file diff --git a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-delete.png b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-delete.png new file mode 100644 index 00000000000..a46a07998cd Binary files /dev/null and b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-delete.png differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png index 4927141ea9d..476effdc1af 100644 Binary files a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png and b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png index 6fbfd019586..e0f20c6f60a 100644 Binary files a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png and b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png index c62a211a9f1..72eef36281b 100644 Binary files a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png and b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/img/cluster-rename.png b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-rename.png new file mode 100644 index 00000000000..9d59f69c501 Binary files /dev/null and b/docs/product-manuals/cloud-console/manage-clusters/img/cluster-rename.png differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/manage-api-clients.md b/docs/product-manuals/cloud-console/manage-clusters/manage-api-clients.md new file mode 100644 index 00000000000..0a608b7bd73 --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-clusters/manage-api-clients.md @@ -0,0 +1,39 @@ +--- +id: manage-api-clients +title: Manage API clients +--- + +To be able to interact with Zeebe in the cloud from the outside, every client application must authenticate itself. An OAuth Flow is used for authentication, which is shown below: + +![auth-flow](./img/client-auth.png) + +The client configuration is shown at the bottom of the cluster detail view. Create a new client and all necessary information is displayed. + +With the `Client Id` and `Client Secret`, a client application can request an access token at the authentication URL (steps 1 and 2). The access token is necessary to interact with Zeebe in the cloud (step 3). + +Please note: + +- Access tokens have a validity period that can be found in the access token. After this time a new access token must be requested. +- The auth service has a built-in rate limiting. If too many token requests are executed in a short time, the client is blocked for a certain time. Since the access tokens have a certain validity period, they must be cached on the client side. + +The officially offered client libraries (as well as the node client) have already integrated the auth routine and take care of obtaining and refreshing an access token and make use of a local cache. + +### Create a client + +To create a new client you have to navigate into the `API` tab: + +![cluster-details](../../../guides/getting-started/img/cluster-detail-clients.png) + +Click **Create New Client** to create a new client and name your client accordingly. + +![create-client](../../../guides/getting-started/img/cluster-details-create-client.png) + +Make sure you keep the generated client credentials in a safe place - the **client secret** will not be shown again. For your convenience, you can also download the client information to your computer. + +![created-client](../../../guides/getting-started/img/cluster-details-created-client.png) + +The downloaded file contains all necessary information to later on communicate with your zeebe instance: + +- `ZEEBE_ADDRESS`: address where your cluster can be reached. +- `ZEEBE_CLIENT_ID` and `ZEEBE_CLIENT_SECRET`: credentials to request a new access token. +- `ZEEBE_AUTHORIZATION_SERVER_URL`: a new token can be requested at this address, using the diff --git a/docs/product-manuals/cloud-console/manage-clusters/rename-cluster.md b/docs/product-manuals/cloud-console/manage-clusters/rename-cluster.md new file mode 100644 index 00000000000..0972acfe149 --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-clusters/rename-cluster.md @@ -0,0 +1,8 @@ +--- +id: rename-cluster +title: Rename your cluster +--- + +The cluster can be renamed at any time. The option can be found in the menu next to the current cluster name in the cluster details. + +![cluster-rename](./img/cluster-rename.png) diff --git a/docs/product-manuals/cloud-console/manage-organization/img/activity-view.png b/docs/product-manuals/cloud-console/manage-organization/img/activity-view.png new file mode 100644 index 00000000000..9ab751d3089 Binary files /dev/null and b/docs/product-manuals/cloud-console/manage-organization/img/activity-view.png differ diff --git a/docs/product-manuals/cloud-console/manage-organization/img/avatar-menue-multiple-organisations.png b/docs/product-manuals/cloud-console/manage-organization/img/avatar-menue-multiple-organisations.png new file mode 100644 index 00000000000..e53138ce1d1 Binary files /dev/null and b/docs/product-manuals/cloud-console/manage-organization/img/avatar-menue-multiple-organisations.png differ diff --git a/docs/product-manuals/cloud-console/manage-organization/img/avatar-menue.png b/docs/product-manuals/cloud-console/manage-organization/img/avatar-menue.png new file mode 100644 index 00000000000..b3e95540960 Binary files /dev/null and b/docs/product-manuals/cloud-console/manage-organization/img/avatar-menue.png differ diff --git a/docs/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-edit.png b/docs/product-manuals/cloud-console/manage-organization/img/early-access-reserved-clusters-edit.png similarity index 100% rename from docs/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-edit.png rename to docs/product-manuals/cloud-console/manage-organization/img/early-access-reserved-clusters-edit.png diff --git a/docs/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-overview.png b/docs/product-manuals/cloud-console/manage-organization/img/early-access-reserved-clusters-overview.png similarity index 100% rename from docs/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-overview.png rename to docs/product-manuals/cloud-console/manage-organization/img/early-access-reserved-clusters-overview.png diff --git a/docs/product-manuals/cloud-console/manage-organization/manage-cloud-management-api-clients.md b/docs/product-manuals/cloud-console/manage-organization/manage-cloud-management-api-clients.md new file mode 100644 index 00000000000..85f88e80fef --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-organization/manage-cloud-management-api-clients.md @@ -0,0 +1,37 @@ +--- +id: manage-cloud-management-api-clients +title: Manage cloud management API clients +--- + +To interact with Camunda Cloud programmatically, without using the Camunda Cloud UI, you can create Cloud Management API clients. + +Cloud Management API clients are created for an organization, and can access all Zeebe clusters of this organization. + +You can manage clients in the organization settings under the tab `Cloud Management API`. + +A client can have one or multiple of the following permissions: + +- **Get clusters** - retrieve information of all clusters of the organization +- **Create clusters** - create a cluster for the organization +- **Delete clusters** - delete a cluster of the organization +- **Get Zeebe clients** - retrieve all Zeebe clients of the organization +- **Create Zeebe clients** - create a Zeebe client for a cluster of the organization +- **Delete Zeebe clients** - delete a Zeebe client of a cluster owned by the organization + +After a Cloud Management API client is created, the `Client Secret` is only shown once! You can also download a script that requests an access roken with your credentials. + +To retrieve an access token for the Cloud Management API client: + +```bash +curl --header "Content-Type: application/json" \ + --request POST \ + --data '{"grant_type":"client_credentials", "audience":"api.cloud.camunda.io", "client_id":"XXX", "client_secret":"YYY"}' \ + https://login.cloud.camunda.io/oauth/token +``` + +:::note Please note + +- Access tokens have a validity period that can be found in the access token. After this time a new access token must be requested. +- The auth service has built-in rate limiting. If too many token requests are executed in a short time, the client is blocked for a certain time. Since the access tokens have a certain validity period, they must be cached on the client side. + +::: diff --git a/docs/product-manuals/cloud-console/manage-organization/manage-users.md b/docs/product-manuals/cloud-console/manage-organization/manage-users.md new file mode 100644 index 00000000000..e0f3cca3bcb --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-organization/manage-users.md @@ -0,0 +1,34 @@ +--- +id: manage-users +title: Manage users of your organization +--- + +## General rights concept + +When a user signs up to Camunda Cloud, they receive a personal organization. Clusters that the user creates in this organization are assigned to this organization. + +If several users need access to the same Zeebe cluster, all users can be assigned to the same organization. + +## Users + +Under this setting members of the current organization can be managed. A user can have one of the following roles: + +- Owner: Owner of the organization (currently limited to one user, cannot be changed by the user) +- Admin: Restricted rights for user management +- Member: Can manage Zeebe Clusters and Client and use Operate + +The following table illustrates the rights of each role: + +| | Owner | Admin | Member | +| ---------------------------- | ----- | ----- | ------ | +| Manage Zeebe clusters | X | X | X | +| Manage clients | X | X | X | +| Use Operate | X | X | X | +| Users: Manage members | X | X | | +| Billing: Manage reservations | X | X | | +| Billing: Request paid plan | X | X | | +| Users: Manage admins | X | | | + +Users are invited to a Camunda Cloud organization via their email address, which must be accepted by the user. As long as the invitation has not been accepted, the user remains in the 'Pending' state. + +People can also be invited to an organization that does not yet have a Camunda Cloud account. In this case the invited person must first create a Camunda Cloud account and then gain access to the organization. diff --git a/docs/product-manuals/cloud-console/manage-organization/organization-settings.md b/docs/product-manuals/cloud-console/manage-organization/organization-settings.md new file mode 100644 index 00000000000..87b6565740e --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-organization/organization-settings.md @@ -0,0 +1,16 @@ +--- +id: organization-settings +title: Organization settings +--- + +Organization settings can be accessed via the menu in the navigation bar. + +![avatar-menue](./img/avatar-menue.png) + +### Overview + +The overview provides a summary of the organization including: + +- Organization name +- Pricing plan +- Owner of the organization diff --git a/docs/product-manuals/cloud-console/manage-organization/switch-organization.md b/docs/product-manuals/cloud-console/manage-organization/switch-organization.md new file mode 100644 index 00000000000..339da663284 --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-organization/switch-organization.md @@ -0,0 +1,8 @@ +--- +id: switch-organization +title: Switch organization +--- + +If a user is assigned to more than one organization, the organization can be changed in the menu of the navigation bar. + +![avatar-menue-multiple-organisations](./img/avatar-menue-multiple-organisations.png) diff --git a/docs/product-manuals/cloud-console/manage-organization/update-billing-reservations.md b/docs/product-manuals/cloud-console/manage-organization/update-billing-reservations.md new file mode 100644 index 00000000000..ebfbb323a1a --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-organization/update-billing-reservations.md @@ -0,0 +1,32 @@ +--- +id: update-billing-reservations +title: Update billing reservations +--- + +This setting is only visible in the Professional Plan for owners and admins. More about it under [Professional Plan](../manage-plan/professional-plan/overview.md). + +## Managing reservations + +Once signed up for the Professional Plan, you have access to the `Cluster Reservations` page. + +Cluster Reservations control how many clusters you can deploy. Increasing the number of reservations allows you to deploy more clusters, decreasing the number of reservations does the opposite. + +You can access the `Cluster Reservations` page by selecting the menu entry **Organization Settings** from the Camunda Cloud Console navigation bar. + +### Inspect active reservations + +The page lists available cluster types along with their specification. A cluster type has the following parameters: + +- **Type** - name of the cluster type +- **Current usage** - number of clusters currently deployed for a given cluster type +- **Reserved** - number of clusters currently reserved. This value is important for billing. Users in your organization cannot deploy more clusters per cluster configuration than specified by this value +- **Partitions** - the number of partitions specified in the cluster configuration +- **Monthly price per unit** - the monthly price of this cluster type. Indicates the price of this cluster in dollars if used for a full month + +![reserved-clusters-overview](./img/early-access-reserved-clusters-overview.png) + +### Edit reservations + +The number of reserved clusters can be changed with the `Edit` button. The number of reserved clusters cannot exceed the maximum limit and cannot go below what is currently in use. + +![reserved-clusters-overview](./img/early-access-reserved-clusters-edit.png) diff --git a/docs/product-manuals/cloud-console/manage-organization/view-organization-activity.md b/docs/product-manuals/cloud-console/manage-organization/view-organization-activity.md new file mode 100644 index 00000000000..8e908980dea --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-organization/view-organization-activity.md @@ -0,0 +1,8 @@ +--- +id: view-organization-activity +title: View organization activity +--- + +The `Activity` tab lists all activities within an organization. There you can see for example when a cluster was created or deleted. + +![activity-view](./img/activity-view.png) diff --git a/docs/product-manuals/cloud-console/manage-plan/available-plans.md b/docs/product-manuals/cloud-console/manage-plan/available-plans.md index bd2104f7928..5ddf7841c08 100644 --- a/docs/product-manuals/cloud-console/manage-plan/available-plans.md +++ b/docs/product-manuals/cloud-console/manage-plan/available-plans.md @@ -1,6 +1,6 @@ --- id: available-plans -title: Available Plans +title: Available plans --- Camunda Cloud was released to the world as Beta in September 2019. In order to signup for Camunda Cloud, please go to [the signup page](https://accounts.cloud.camunda.io/signup). @@ -8,6 +8,6 @@ Camunda Cloud was released to the world as Beta in September 2019. In order to s There are two plans available for Camunda Cloud: - **Trial Plan** (Beta) - The Trial Plan allows you to test-drive Camunda Cloud for free and develop your first applications. Go to [Overview of the Trial Plan](./trial-plan.md) for more details. -- **Professional Plan** (Early Access) - The Professional Plan allows you to start using Camunda Cloud for production projects. Go to [Overview of the Professional Plan](./professional-plan.md) for more details. +- **Professional Plan** (Early Access) - The Professional Plan allows you to start using Camunda Cloud for production projects. Go to [Overview of the Professional Plan](./professional-plan/overview.md) for more details. In the future, Camunda Cloud will provide an enterprise plan for large projects and enterprises who plan on adoption Camunda Cloud at large scale. diff --git a/docs/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png b/docs/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png index 3cb527d5c10..754262eb2aa 100644 Binary files a/docs/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png and b/docs/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png differ diff --git a/docs/product-manuals/cloud-console/manage-plan/professional-plan/billing-parameters.md b/docs/product-manuals/cloud-console/manage-plan/professional-plan/billing-parameters.md new file mode 100644 index 00000000000..25e433edc0e --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-plan/professional-plan/billing-parameters.md @@ -0,0 +1,54 @@ +--- +id: billing-parameters +title: Billing parameters +--- + +:::note +The terms under which the Professional Plan is available might change in the future. +::: + +The Professional Plan has a fixed monthly subscription fee (_"Base Fee"_) as well as a variable, pay as you go component which depends on the amount of [cluster reservations](#managing-reservations) (_"Reservations Billing"_). + +Reservations billing works as follows: for each day (GMT+2), the _daily total_ is calculated. To obtain the daily total, all reservations that were active on that day are recorded and for each such reservation, the daily price of the cluster type corresponding to that reservation is added. (Note: The daily price of a cluster type is obtained by dividing the monthly price of the cluster type by the numbers of days in the month). At the end of the month, the daily totals are added up to obtain the _monthly total_. + +## Example + +:::caution +Example values are used to better understand calculation. These are not actual prices in Camunda Cloud. +::: + +### Given + +- Cluster Type A: 300 Euro +- Cluster Type B: 900 Euro + +### Reservation updates + +| Day of the month | Number of reservations for A | Number of reservations for B | +| ---------------------------- | ---------------------------- | ---------------------------- | +| reservations from last month | 2 | 1 | +| 11, 10:00 | 3 | 2 | +| 11, 17:00 | 5 | 2 | +| 21, 09:00 | 4 | 3 | + +### Daily Totals + +| Day of month | Price A | Price B | Daily Total | +| ------------ | ------- | ------- | ----------- | +| 1 | 20 | 30 | 50 | +| ... | 20 | 30 | 50 | +| 10 | 20 | 30 | 50 | +| 11 | 50 | 60 | 110 | +| ... | 50 | 60 | 110 | +| 20 | 50 | 60 | 110 | +| 21 | 40 | 90 | 130 | +| 30 | 40 | 90 | 130 | + +### Monthly Total + +| Position | Value | +| --------- | ------------- | +| Basic Fee | 1000 Euro | +| A | 1100 Euro | +| B | 1800 Euro | +| **Sum** | **3900 Euro** | diff --git a/docs/product-manuals/cloud-console/manage-plan/professional-plan/overview.md b/docs/product-manuals/cloud-console/manage-plan/professional-plan/overview.md new file mode 100644 index 00000000000..a7074467db7 --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-plan/professional-plan/overview.md @@ -0,0 +1,25 @@ +--- +id: overview +title: Overview +--- + +:::note +The terms under which the Professional Plan is available might change in the future. +::: + +## Overview + +For users who seek to use Camunda Cloud for production projects we make available an early access edition of the professional plan. + +The early access edition ensures that you have the support of Camunda that you need to be successful in your project. + +The professional plan is a subscription (anually renewing) providing access to Camunda Cloud at an [affordable monthly fee](https://camunda.com/cloud). + +Details: + +- Professional support by Camunda (8x5) +- Remote consulting budget for dedicated sessions with technical expert from Camunda +- Access to one Zeebe development cluster +- Additional production clusters can be added on demand using a flexible pay as you go model + +Request access to the professional plan by visiting the [Camunda Cloud page on the website](https://camunda.com/cloud). diff --git a/docs/product-manuals/cloud-console/manage-plan/professional-plan/upgrade-to-professional-plan.md b/docs/product-manuals/cloud-console/manage-plan/professional-plan/upgrade-to-professional-plan.md new file mode 100644 index 00000000000..d6a58caac08 --- /dev/null +++ b/docs/product-manuals/cloud-console/manage-plan/professional-plan/upgrade-to-professional-plan.md @@ -0,0 +1,14 @@ +--- +id: upgrade-to-professional-plan +title: Upgrade to Professional Plan +--- + +:::note +The terms under which the Professional Plan is available might change in the future. +::: + +To request you need to have an active [Trial Plan](../trial-plan.md) account. In case you have not yet signed up for Camunda Cloud, you can do it via [the signup form](https://accounts.cloud.camunda.io/signup). + +To request early access to the Professional Plan, use the button in the navigation bar. This will send a request to the Camunda Sales Team, and an Account Manager will contact you as soon as possible. The account manager will explain the conditions and next steps to you. + +![paid-request](../img/early-access-paid-request.png) diff --git a/docs/product-manuals/cloud-console/manage-plan/trial-plan.md b/docs/product-manuals/cloud-console/manage-plan/trial-plan.md index 5fb1dde9047..473f3de7c25 100644 --- a/docs/product-manuals/cloud-console/manage-plan/trial-plan.md +++ b/docs/product-manuals/cloud-console/manage-plan/trial-plan.md @@ -7,6 +7,6 @@ _Note: the terms under which the trial plan is available might change in the fut In order to test drive Camunda Cloud, you can [sign up](https://accounts.cloud.camunda.io/signup) for the trial plan. -The trial plan is free and provides access to a single Zeebe Cluster to be used for development projects. +The trial plan is free and provides access to a single Zeebe cluster to be used for development projects. -In case you want to use Camunda Cloud in production we recommend switching to the [professional plan](./professional-plan.md). +In case you want to use Camunda Cloud in production we recommend switching to the [Professional Plan](./professional-plan/overview.md). diff --git a/docs/product-manuals/cloud-console/troubleshooting/common-pitfalls.md b/docs/product-manuals/cloud-console/troubleshooting/common-pitfalls.md new file mode 100644 index 00000000000..abe12442b04 --- /dev/null +++ b/docs/product-manuals/cloud-console/troubleshooting/common-pitfalls.md @@ -0,0 +1,17 @@ +--- +id: common-pitfalls +title: Common Pitfalls +--- + +If you have a problem, you can always use the [feedback form](./feedback-and-support.md). + +## The button to create new clusters is disabled + +- Your organization is on a Trial Plan and you have already created a cluster. In this case you cannot create another cluster, because only one cluster is included in the trial plan. +- Your billing reservations do not allow any more clusters. In this case you have to increase the [reservations](../manage-organization/update-billing-reservations.md) if you want to create more clusters. If you do not have the necessary rights, contact an admin or the owner of the organization. + +## I cannot connect to Zeebe + +- Check if your [API Client](../manage-clusters/manage-api-clients.md) has the necessary rights. To interact with Zeebe the **Scope** `Zeebe` must be set. +- Check if your credentials are configured correctly. There is a CLI tool that allows you to easily check the status: [`zbctl`](https://www.npmjs.com/package/zbctl). With the command `zbctl status` you can read the topology. If this command works, the connection can be established. +- Check if your cluster is _Healthy_: it can happen that a Zeebe cluster is temporarily unavailable. Check the status of your cluster via the cluster overview. diff --git a/docs/product-manuals/cloud-console/troubleshooting/feedback-and-support.md b/docs/product-manuals/cloud-console/troubleshooting/feedback-and-support.md new file mode 100644 index 00000000000..378d492d096 --- /dev/null +++ b/docs/product-manuals/cloud-console/troubleshooting/feedback-and-support.md @@ -0,0 +1,10 @@ +--- +id: feedback-and-support +title: Feedback and support +--- + +If you have any problems, questions or suggestions you can contact us via the Cloud Console Feedback Form. + +**Feebback and support** can be submitted or requested via the corresponding entry in the navigation menu. If you have a **license agreement** with us you will be redirected to the [Support queue](https://jira.camunda.com/projects/SUPPORT/) at Camunda. In the Free Plan, contact can be made using the internal form: + +![feedback-dialog](./img/contact-feedback-and-support.png) diff --git a/docs/product-manuals/cloud-console/troubleshooting/img/contact-feedback-and-support.png b/docs/product-manuals/cloud-console/troubleshooting/img/contact-feedback-and-support.png new file mode 100644 index 00000000000..e6138ad4e38 Binary files /dev/null and b/docs/product-manuals/cloud-console/troubleshooting/img/contact-feedback-and-support.png differ diff --git a/docs/product-manuals/zeebe/reference/assets/create-workflow-with-result.png b/docs/product-manuals/concepts/assets/create-workflow-with-result.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/create-workflow-with-result.png rename to docs/product-manuals/concepts/assets/create-workflow-with-result.png diff --git a/docs/product-manuals/zeebe/reference/assets/create-workflow.png b/docs/product-manuals/concepts/assets/create-workflow.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/create-workflow.png rename to docs/product-manuals/concepts/assets/create-workflow.png diff --git a/docs/product-manuals/zeebe/reference/message-correlation/assets/message-aggregator.png b/docs/product-manuals/concepts/assets/message-aggregator.png similarity index 100% rename from docs/product-manuals/zeebe/reference/message-correlation/assets/message-aggregator.png rename to docs/product-manuals/concepts/assets/message-aggregator.png diff --git a/docs/product-manuals/zeebe/reference/message-correlation/assets/message-correlation.png b/docs/product-manuals/concepts/assets/message-correlation.png similarity index 100% rename from docs/product-manuals/zeebe/reference/message-correlation/assets/message-correlation.png rename to docs/product-manuals/concepts/assets/message-correlation.png diff --git a/docs/product-manuals/zeebe/reference/message-correlation/assets/message-single-instance.png b/docs/product-manuals/concepts/assets/message-single-instance.png similarity index 100% rename from docs/product-manuals/zeebe/reference/message-correlation/assets/message-single-instance.png rename to docs/product-manuals/concepts/assets/message-single-instance.png diff --git a/docs/product-manuals/zeebe/introduction/assets/order-process.png b/docs/product-manuals/concepts/assets/order-process.png similarity index 100% rename from docs/product-manuals/zeebe/introduction/assets/order-process.png rename to docs/product-manuals/concepts/assets/order-process.png diff --git a/docs/product-manuals/zeebe/reference/assets/variable-mappings.png b/docs/product-manuals/concepts/assets/variable-mappings.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/variable-mappings.png rename to docs/product-manuals/concepts/assets/variable-mappings.png diff --git a/docs/product-manuals/zeebe/reference/assets/variable-propagation.png b/docs/product-manuals/concepts/assets/variable-propagation.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/variable-propagation.png rename to docs/product-manuals/concepts/assets/variable-propagation.png diff --git a/docs/product-manuals/zeebe/reference/assets/variable-scopes.png b/docs/product-manuals/concepts/assets/variable-scopes.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/variable-scopes.png rename to docs/product-manuals/concepts/assets/variable-scopes.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflow-conditions.png b/docs/product-manuals/concepts/assets/workflow-conditions.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflow-conditions.png rename to docs/product-manuals/concepts/assets/workflow-conditions.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflow-data-flow.png b/docs/product-manuals/concepts/assets/workflow-data-flow.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflow-data-flow.png rename to docs/product-manuals/concepts/assets/workflow-data-flow.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflow-events.png b/docs/product-manuals/concepts/assets/workflow-events.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflow-events.png rename to docs/product-manuals/concepts/assets/workflow-events.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflow-parallel-gw.png b/docs/product-manuals/concepts/assets/workflow-parallel-gw.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflow-parallel-gw.png rename to docs/product-manuals/concepts/assets/workflow-parallel-gw.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflow-parallel-mi.png b/docs/product-manuals/concepts/assets/workflow-parallel-mi.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflow-parallel-mi.png rename to docs/product-manuals/concepts/assets/workflow-parallel-mi.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflow-sequence.png b/docs/product-manuals/concepts/assets/workflow-sequence.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflow-sequence.png rename to docs/product-manuals/concepts/assets/workflow-sequence.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflows-data-based-conditions.png b/docs/product-manuals/concepts/assets/workflows-data-based-conditions.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflows-data-based-conditions.png rename to docs/product-manuals/concepts/assets/workflows-data-based-conditions.png diff --git a/docs/product-manuals/zeebe/basics/assets/workflows-parallel-gateway.png b/docs/product-manuals/concepts/assets/workflows-parallel-gateway.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/workflows-parallel-gateway.png rename to docs/product-manuals/concepts/assets/workflows-parallel-gateway.png diff --git a/docs/product-manuals/zeebe/basics/assets/zeebe-job-workers-graphic.png b/docs/product-manuals/concepts/assets/zeebe-job-workers-graphic.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/zeebe-job-workers-graphic.png rename to docs/product-manuals/concepts/assets/zeebe-job-workers-graphic.png diff --git a/docs/product-manuals/concepts/expressions.md b/docs/product-manuals/concepts/expressions.md new file mode 100644 index 00000000000..1e2770c598f --- /dev/null +++ b/docs/product-manuals/concepts/expressions.md @@ -0,0 +1,340 @@ +--- +id: expressions +title: "Expressions" +--- + +Expressions can be used to access variables and calculate values dynamically. + +The following attributes of BPMN elements **require** an expression: + +- Sequence flow on an exclusive gateway: [condition](/reference/bpmn-workflows/exclusive-gateways/exclusive-gateways.md#conditions) +- Message catch event / receive task: [correlation key](/reference/bpmn-workflows/message-events/message-events.md#messages) +- Multi-instance activity: [input collection](/reference/bpmn-workflows/multi-instance/multi-instance.md#defining-the-collection-to-iterate-over), [output element](/reference/bpmn-workflows/multi-instance/multi-instance.md#collecting-the-output) +- Input/output variable mappings: [source](variables.md#inputoutput-variable-mappings) + +Additionally, the following attributes of BPMN elements can define an expression **optionally** instead of a static value: + +- Timer catch event: [timer definition](/reference/bpmn-workflows/timer-events/timer-events.md#timers) +- Message catch event / receive task: [message name](/reference/bpmn-workflows/message-events/message-events.md#messages) +- Service task: [job type](/reference/bpmn-workflows/service-tasks/service-tasks.md#task-definition), [job retries](/reference/bpmn-workflows/service-tasks/service-tasks.md#task-definition) +- Call activity: [process id](/reference/bpmn-workflows/call-activities/call-activities.md#defining-the-called-workflow) + +## Expressions vs. static values + +Some attributes of BPMN elements, like the timer definition of a timer catch event, can be defined either: + +- as an expression (e.g. `= remaingTime`), or +- as a static value (e.g. `PT2H`). + +Expressions always start with an _equal sign_ (e.g. `= order.amount > 100`). The text behind the equal sign is the actual expression (e.g. `order.amount > 100` checks whether the amount of the order is greater than 100). + +If the element does not start with the prefix then it is used as a static value. A static value is used either as a string (e.g. job type) or as a number (e.g. job retries). A string value must not be enclosed in quotes. + +Note that an expression can also define a static value by using literals (e.g. `= "foo"`, `= 21`, `= true`, `= [1,2,3]`, `= {x: 22}`, etc.). + +## The expression language + +An expression is written in **FEEL** (Friendly Enough Expression Language). FEEL is part of the OMG's DMN (Decision Model and Notation) specification. It is designed to have the following properties: + +- Side-effect free +- Simple data model with JSON-like object types: numbers, dates, strings, lists, and contexts +- Simple syntax designed for business professionals and developers +- Three-valued logic (true, false, null) + +Camunda Cloud integrates the [FEEL Scala](https://github.com/camunda/feel-scala) engine to evaluate FEEL expressions. The following sections cover common use cases in Zeebe. A complete list of supported expressions can be found in [FEEL Expressions](/reference/feel/what-is-feel.md). + +### Access variables + +A variable can be accessed by its name. + +```feel +owner +// "Paul" + +totalPrice +// 21.2 + +items +// ["item-1", "item-2", "item-3"] +``` + +If a variable is a JSON document/object then it is handled as a FEEL context. A property of the context (aka nested variable property) can be accessed by `.` (a dot) and the property name. + +```feel +order.id +// "order-123" + +order.customer.name +// "Paul" +``` + +### Boolean expressions + +Values can be compared using the following operators: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorDescriptionExample
= (only one equal sign)equal toowner = "Paul"
!=not equal toowner != "Paul"
<less thantotalPrice < 25
<=less than or equal tototalPrice <= 25
>greater thantotalPrice > 25
>=greater than or equal tototalPrice >= 25
between [X] and [Y]same as (v >= [X] and v <= [Y]])totalPrice between 10 and 25
+ +Multiple boolean values can be combined as disjunction (`and`) or conjunction (`or`). + +```feel +orderCount >= 5 and orderCount < 15 + +orderCount > 15 or totalPrice > 50 +``` + +### Null Checks + +If a variable or a nested property can be `null` then it can be compared to the `null` value. Comparing `null` to a value different from `null` results in `false`. + +```feel +order = null +// true - if "order" is null or doesn't exist + +order.id = null +// true - if "order" is null, "order" doesn't exist, +// "id" is null, or "order" has no property "id" +``` + +In addition to the comparison with `null`, the built-in function `is defined()` can be used to differentiate between a value that is `null` and a value that doesn’t exist. + +```feel +is defined(order) +// true - if "order" has any value or is null + +is defined(order.id) +// false - if "order" doesn't exist or it has no property "id" +``` + +### String Expressions + +A string value must be enclosed in double quotes. Multiple string values can be concatenated using the `+` operator. + +```feel +"foo" + "bar" +// "foobar" +``` + +Any value can be transformed into a string value using the `string()` function. + +```feel +"order-" + string(orderId) +// "order-123" +``` + +More functions for string values are available as [built-in String functions](/reference/feel/builtin-functions/feel-built-in-functions-string.md) (e.g. contains, matches, etc.). + +### Temporal Expressions + +The current date and date-time can be accessed using the built-in functions `today()` and `now()`. In order to store the current date or date-time in a variable, it must be converted to a string using the built-in function `string()`. + +```feel +now() +// date and time("2020-04-06T15:30:00@UTC") + +today() +// date("2020-04-06") + +string(today()) +// "2020-04-06" +``` + +The following operators can be applied on temporal values: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Temporal TypeExamplesOperators
datedate("2020-04-06") +
  • date + duration
  • +
  • date - date
  • +
  • date - duration
  • +
    time + time("15:30:00"),
    + time("15:30:00+02:00"),
    + time("15:30:00@Europe/Berlin") +
    +
  • time + duration
  • +
  • time - time
  • +
  • time - duration
  • +
    date-time + date and time("2020-04-06T15:30:00"),
    + date and time("2020-04-06T15:30:00+02:00"),
    + date and time("2020-04-06T15:30:00@UTC") +
    +
  • date-time + duration
  • +
  • date-time - date-time
  • +
  • date-time - duration
  • +
    durationduration("P12H"),
    duration("P4Y")
    +
  • duration + duration
  • +
  • duration + date
  • +
  • duration + time
  • +
  • duration + date-time
  • +
  • duration - duration
  • +
  • date - duration
  • +
  • time - duration
  • +
  • date-time - duration
  • +
  • duration * number
  • +
  • duration / duration
  • +
  • duration / number
  • +
    cyclecycle(3, duration("PT1H")),
    cycle(duration("P7D"))
    + +A temporal value can be compared in a boolean expression with another temporal value of the same type. + +The `cycle` type is different from the other temporal types because it is not supported in the FEEL type system. Instead, it is defined as a function that returns the definition of the cycle as a string in the ISO 8601 format of a recurring time interval. The function expects two arguments: the number of repetitions and the recurring interval as duration. If the first argument is `null` or not passed in then the interval is unbounded (i.e. infinitely repeated). + +```feel +cycle(3, duration("PT1H")) +// "R3/PT1H" + +cycle(duration("P7D")) +// "R/P7D" +``` + +### List Expressions + +An element of a list can be accessed by its index. The index starts at `1` with the first element (**not** at `0`). A negative index starts at the end by `-1`. If the index is out of the range of the list then `null` is returned instead. + +```feel +["a","b","c"][1] +// "a" + +["a","b","c"][2] +// "b" + +["a","b","c"][-1] +// "c" +``` + +A list value can be filtered using a boolean expression. The result is a list of elements that fulfill the condition. The current element in the condition is assigned to the variable `item`. + +```feel +[1,2,3,4][item > 2] +// [3,4] +``` + +The operators `every` and `some` can be used to test if all elements or at least one element of a list fulfill a given condition. + +```feel +every x in [1,2,3] satisfies x >= 2 +// false + +some x in [1,2,3] satisfies x > 2 +// true +``` + +### Invoke Functions + +A function can be invoked by its name followed by the arguments. The arguments can be assigned to the function parameters either by their position or by defining the parameter names. + +```feel +floor(1.5) +// 1 + +count(["a","b","c"]) +// 3 + +append(["a","b"], "c") +// ["a","b","c"] + +contains(string: "foobar", match: "foo") +// true +``` + +FEEL defines several built-in functions: + +- [Conversion Functions](/reference/feel/builtin-functions/feel-built-in-functions-conversion.md) +- [Boolean Functions](/reference/feel/builtin-functions/feel-built-in-functions-boolean.md) +- [String Functions](/reference/feel/builtin-functions/feel-built-in-functions-string.md) +- [Numeric Functions](/reference/feel/builtin-functions/feel-built-in-functions-numeric.md) +- [List Functions](/reference/feel/builtin-functions/feel-built-in-functions-list.md) +- [Context Functions](/reference/feel/builtin-functions/feel-built-in-functions-context.md) +- [Temporal Functions](/reference/feel/builtin-functions/feel-built-in-functions-temporal.md) + +## Additional Resources + +- [FEEL](/reference/feel/what-is-feel.md) +- [FEEL Data Types](/reference/feel/language-guide/feel-data-types.md) +- [FEEL Expressions](/reference/feel/language-guide/feel-expression.md) +- [DMN Specification](https://www.omg.org/spec/DMN/About-DMN/) diff --git a/docs/product-manuals/concepts/incidents.md b/docs/product-manuals/concepts/incidents.md new file mode 100644 index 00000000000..7fac6dd9e94 --- /dev/null +++ b/docs/product-manuals/concepts/incidents.md @@ -0,0 +1,65 @@ +--- +id: incidents +title: "Incidents" +--- + +In Camunda Cloud, an incident represents a problem in a workflow execution. That means a workflow instance is stuck at some point and it needs a user interaction to resolve the problem. + +Incidents are created in different situations, for example, when + +- a job is failed and it has no more retries left +- an input or output variable mapping can't be applied +- a condition can't be evaluated + +Note that incidents are not created when an unexpected exception (e.g. `NullPointerException`, `OutOfMemoyError` etc.) happens. + +## Resolving + +In order to resolve an incident, the user must identify and resolve the problem first. Then, the user marks the incident as resolved and thereby triggers to retry workflow execution. If the problem still exists then a new incident is created. + +### Resolving a job-related incident + +If a job is failed and it has no more retries left then an incident is created. There can be different reasons why the job is failed, for example, the variables are not in the expected format, or a service is not available (e.g. a database). + +In case that it is caused by the variables, the user needs to update the variables of the workflow instance first. Then, the user needs to increase the remaining retries of the job and mark the incident as resolved. It is recommended to do this in [Operate](/product-manuals/operate/index.md). + +However, it is also possible to do this through the client API. Using the Java client, this could look like: + +```java +client.newSetVariablesCommand(incident.getElementInstanceKey()) + .variables(NEW_PAYLOAD) + .send() + .join(); + +client.newUpdateRetriesCommand(incident.getJobKey()) + .retries(3) + .send() + .join(); + +client.newResolveIncidentCommand(incident.getKey()) + .send() + .join(); +``` + +When the incident is resolved then the job can be activated by a worker again. + +### Resolving a workflow instance-related incident + +If an incident is created while workflow execution and it is not related to a job, then it is usually related to the variables of the workflow instance. For example, an input or output variable mapping can't be applied. + +To resolve the incident, the user needs to update the variables first and then mark the incident as resolved. It is recommended to do this in [Operate](/product-manuals/operate/index.md). + +Using the Java client, this could look like: + +```java +client.newSetVariablesCommand(incident.getElementInstanceKey()) + .variables(NEW_VARIABLES) + .send() + .join(); + +client.newResolveIncidentCommand(incident.getKey()) + .send() + .join(); +``` + +When the incident is resolved then the workflow instance continues. diff --git a/docs/product-manuals/concepts/job-workers.md b/docs/product-manuals/concepts/job-workers.md new file mode 100644 index 00000000000..3330101d5c4 --- /dev/null +++ b/docs/product-manuals/concepts/job-workers.md @@ -0,0 +1,67 @@ +--- +id: job-workers +title: "Job workers" +--- + +A job worker is a service capable of performing a particular task in a workflow. + +Each time such a task needs to be performed, this is represented by a job. + +A job has the following properties: + +- **Type**: Describes the work item and is defined in each task in the workflow. The type is referenced by workers to request the jobs they are able to perform. +- **Custom headers**: Additional static metadata that is defined in the workflow. Custom headers are used to configure reusable job workers (e.g. a `notify Slack` worker might read out the Slack channel from its header). +- **Key**: Unique key to identify a job. The key is used to hand in the results of a job execution, or to report failures during job execution. +- **Variables**: The contextual/business data of the workflow instance that is required by the worker to do its work. + +## Requesting jobs + +Job workers request jobs of a certain type on a regular interval (i.e. polling). This interval and the number of jobs requested are configurable in the Zeebe client. + +If one or more jobs of the requested type are available, then Zeebe (the workflow engine inside Camunda Cloud) will stream activated jobs to the worker. Upon receiving jobs, a worker performs them and sends back a _complete_ or _fail_ +command for each job depending on whether the job could be completed successfully or not. + +For example, the following workflow might generate three different types of jobs: `process-payment`, `fetch-items`, and `ship-parcel`: + +![order-workflow-model](assets/order-process.png) + +Three different job workers, one for each job type, could request jobs from Zeebe: + +![zeebe-job-workers-requesting-jobs](assets/zeebe-job-workers-graphic.png) + +Many workers can request the same job type in order to scale up processing. In this scenario, Zeebe ensures that each job is sent to only one of the workers. +Such a job is considered activated until the job is completed, failed or the job activation times out. + +On requesting jobs, the following properties can be set: + +- **Worker**: The identifier of the worker. Used for auditing purposes. +- **Timeout**: The time a job is assigned to the worker. If a job is not completed within this time then it can be reassigned by Zeebe to another worker. +- **MaxJobsToActivate**: The maximum number of jobs which should be activated by this request. +- **FetchVariables**: A list of variables names which are required. If the list is empty, all variables of the workflow instance are requested. + +### Long polling + +Ordinarily, a request for jobs can be completed immediately when no jobs are available. +To find a job to work on, the worker now needs to poll again for available jobs. +This leads to workers repeatedly sending requests until a job is available. +This is expensive in terms of resource usage, because both the worker and the server are performing a lot of unproductive work. Zeebe supports _long polling_ for available jobs to better utilize resources. + +With _long polling_ a request will be kept open while no jobs are available. +The request is completed when at least one job becomes available. + +### Job queueing + +Zeebe decouples creation of jobs from performing the work on them. It is always possible to create jobs at the highest possible rate, regardless of whether or not there is a job worker available to work on them. This is possible because Zeebe queues jobs until workers request them. + +This increases the resilience of the overall system. Camunda Cloud is highly available so that job workers don't have to be highly available. Zeebe queues all jobs during any job worker outages and progress will resume as soon as workers come back online. + +It also insulates job workers against sudden bursts in traffic. Because workers request jobs, they have full control over the rate at which they take on new jobs. + +## Completing or failing jobs + +After working on an activated job, a job worker informs Camunda Cloud that the job has either _completed_ or _failed_. + +- When the job worker completes its work, it sends a _complete job_ command along with any variables, which in turn will be merged into the workflow instance. This is how the job worker exposes the results of its work. +- If the job worker could not successfully complete its work, it will send _fail job_ command. Fail job commands include the number of remaining retries, which is set by the job worker. If _remaining retries_ is greather than zero, then the job will be retried and reassigned. If _remaining retries_ is zero or negative, an incident will be raised and the job will not be retried until the incident is resolved. + +Another possibbility is that the job worker completes its work, but a little too late. If the job could not be completed within the configured job activation timeout, then Zeebe will reassign the job to another job worker. This leads to two workers working on the same job at the same time. In this case, the first _complete job_ command will win, and the second _complete job_ command will be rejected with an error. diff --git a/docs/product-manuals/concepts/messages.md b/docs/product-manuals/concepts/messages.md new file mode 100644 index 00000000000..5a0130b1bbe --- /dev/null +++ b/docs/product-manuals/concepts/messages.md @@ -0,0 +1,107 @@ +--- +id: messages +title: "Messages" +--- + +Workflow instances can respond to incoming messages. Published messages need to be mapped onto a workflow instance. This step is called message correlation. + +## Message subscriptions + +A message is not sent to a workflow instance directly. Instead, the message correlation is based on subscriptions that contains the _message name_ and the _correlation key_ (aka correlation value). + +![Message Correlation](assets/message-correlation.png) + +A subscription is opened when a workflow instance awaits a message, for example, when entering a message catch event. The message name is defined either statically in the workflow (e.g. `Money collected`) or dynamically as an expression. The correlation key is defined dynamically as an expression (e.g. `= orderId`). The expressions are evaluated on activating the message catch event. The results of the evaluations are used as message name and as correlation key of the subscription (e.g. `"order-123"`). + +When a message is published and the message name and the correlation key matches to a subscription then the message is correlated to the corresponding workflow instance. If no proper subscription is opened then the message is discarded. + +A subscription is closed when the corresponding element (e.g. the message catch event), or its scope is left. After a subscription is opened, it is not updated, for example, when the referenced workflow instance variable is changed. + +
    + Publish message via zbctl +

    + +``` +zbctl publish message "Money collected" --correlationKey "order-123" +``` + +

    +
    + +## Message buffering + +Messages can be buffered for a given time. Buffering can be useful in a situation when it is not guaranteed that the subscription is opened before the message is published. + +A message has a _time-to-live_ (TTL) which specifies for how long it is buffered. Within this time, the message can be correlated to a workflow instance. + +When a subscription is opened then it polls the buffer for a proper message. If a proper message exists then it is correlated to the corresponding workflow instance. In case multiple messages match to the subscription then the first published message is correlated (like a FIFO queue). + +The buffering of a message is disabled when its TTL is set to zero. If no proper subscription is open then the message is discarded. + +
    + Publish message with TTL via zbctl +

    + +``` +zbctl publish message "Money collected" --correlationKey "order-123" --ttl 1h +``` + +

    +
    + +## Message cardinality + +A message is correlated only **once** to a workflow (based on the BPMN process id), across all versions of this workflow. If multiple subscriptions for the same workflow are opened (by multiple workflow instances or within one instance) then the message is correlated only to one of the subscriptions. + +When subscriptions are opened for different workflows then the message is correlated to **all** of the subscriptions. + +A message is **not** correlated to a message start event subscription if an instance of the workflow is active and was created by a message with the same correlation key. If the message is buffered then it can be correlated after the active instance is ended. Otherwise, it is discarded. + +## Message uniqueness + +A message can have an optional message id - a unique id to ensure that the message is published and processed only once (i.e. idempotency). The id can be any string, for example, a request id, a tracking number or the offset/position in a message queue. + +A message is rejected and not correlated if a message with the same name, the same correlation key and the same id is already buffered. After the message is discarded from the buffer, a message with the same name, correlation key and id can be published again. + +The uniqueness check is disabled when no message id is set. + +
    + Publish message with id via zbctl +

    + +``` +zbctl publish message "Money collected" --correlationKey "order-123" --messageId "tracking-12345" +``` + +

    +
    + +## Message patterns + +The following patterns describe solutions to common problems what can be solved using the message correlation. + +### Message aggregator + +Problem: aggregate/collect multiple messages, map-reduce, batching + +Solution: + +![Message Aggregator](assets/message-aggregator.png) + +The messages are published with a TTL > 0 and a correlation key that groups the messages per entity. + +The first message creates a new workflow instance. The following messages are correlated to the same workflow instance if they have the same correlation key. + +When the instance is ended and messages with the same correlation key are not correlated yet then a new workflow instance is created. + +### Single instance + +Problem: create exactly one instance of a workflow + +Solution: + +![Message Single Instance](assets/message-single-instance.png) + +The message is published with a TTL = 0 and a correlation key that identifies the entity. + +The first message creates a new workflow instance. Following messages are discarded and do not create a new instance if they have the same correlation key and the created workflow instance is still active. diff --git a/docs/product-manuals/concepts/variables.md b/docs/product-manuals/concepts/variables.md new file mode 100644 index 00000000000..67eb29721d6 --- /dev/null +++ b/docs/product-manuals/concepts/variables.md @@ -0,0 +1,133 @@ +--- +id: variables +title: "Variables" +--- + +Variables are part of a workflow instance and represent the data of the instance. A variable has a name and a JSON value. The visibility of a variable is defined by its variable scope. + +## Variable names + +The name of a variable can be any alphanumeric string including the `_` symbol. For a combination of words, it is recommended to use the `camelCase` or the `snake_case` format. The `kebab-case` format is not allowed because it contains the operator `-`. + +When accessing a variable in an expression, keep in mind that the variable name is case-sensitive. + +Restrictions of a variable name: + +- it may not start with a number (e.g. `1stChoice` is not allowed; you can use `firstChoice`instead) +- it may not contain whitespaces (e.g. `order number` is not allowed; you can use `orderNumber` instead) +- it may not contain an operator (e.g. `+`, `-`, `*`, `/`, `=`, `>`, `?`, `.`) +- it may not be a literal (e.g. `null`, `true`, `false`) or a keyword (e.g. `function`, `if`, `then`, `else`, `for`, `between`, `instance`, `of`, `not`) + +## Variable values + +The value of a variable is stored as a JSON value. It can have one of the following types: + +- String (e.g. `"John Doe"`) +- Number (e.g. `123`, `0.23`) +- Boolean (e.g. `true` or `false`) +- Array (e.g. `["item1" , "item2", "item3"]`) +- Object (e.g. `{ "orderNumber": "A12BH98", "date": "2020-10-15", "amount": 185.34}`) +- Null (`null`) + +## Variable scopes + +Variable scopes define the _visibility_ of variables. The root scope is the workflow instance itself. Variables in this scope are visible everywhere in the workflow. + +When the workflow instance enters a subprocess or an activity then a new scope is created. Activities in this scope can see all variables of this and of higher scopes (i.e. parent scopes). But activities outside of this scope can not see the variables which are defined in this scope. + +If a variable has the same name as a variable from a higher scope then it covers this variable. Activities in this scope see only the value of this variable and not the one from the higher scope. + +The scope of a variable is defined when the variable is created. By default, variables are created in the root scope. + +Example: + +![variable-scopes](assets/variable-scopes.png) + +This workflow instance has the following variables: + +- `a` and `b` are defined on the root scope and can be seen by _Task A_, _Task B_, and _Task C_. +- `c` is defined in the sub process scope and can be seen by _Task A_ and _Task B_. +- `b` is defined again on the activity scope of _Task A_ and can be seen only by _Task A_. It covers the variable `b` from the root scope. + +### Variable propagation + +When variables are merged into a workflow instance (e.g. on job completion, on message correlation) then each variable is propagated from the scope of the activity to its higher scopes. + +The propagation ends when a scope contains a variable with the same name. In this case, the variable value is updated. + +If no scope contains this variable then it is created as a new variable in the root scope. + +Example: + +![variable-propagation](assets/variable-propagation.png) + +The job of _Task B_ is completed with the variables `b`, `c`, and `d`. The variables `b` and `c` are already defined in higher scopes and are updated with the new values. Variable `d` doesn't exist before and is created in the root scope. + +### Local variables + +In some cases, variables should be set in a given scope, even if they don't exist in this scope before. + +In order to deactivate the variable propagation, the variables are set as _local variables_. That means that the variables are created or updated in the given scope, whether they exist in this scope before or not. + +## Input/output variable mappings + +Input/output variable mappings can be used to create new variables or customize how variables are merged into the workflow instance. + +Variable mappings are defined in the workflow as extension elements under `ioMapping`. Every variable mapping has a `source` and a `target` expression. + +The `source` expression defines the **value** of the mapping. Usually, it [accesses a variable](expressions.md#access-variables) of the workflow instance that holds the value. If the variable or the nested property doesn't exist then an [incident](incidents.md) is created. + +The `target` expression defines **where** the value of the `source` expression is stored. It can reference a variable by its name or a nested property of a variable. If the variable or the nested property doesn't exist then it is created. + +Variable mappings are evaluated in the defined order. So, a `source` expression can access the target variable of a previous mapping. + +Example: + +![variable-mappings](assets/variable-mappings.png) + +**Input mappings** + +| Source | Target | +| --------------- | ----------- | +| `customer.name` | `sender` | +| `customer.iban` | `iban` | +| `totalPrice` | `price` | +| `orderId` | `reference` | + +**Output mapping** + +| Source | Target | +| -------- | --------------- | +| `status` | `paymentStatus` | + +### Input mappings + +Input mappings can be used to create new variables. They can be defined on service tasks and subprocesses. + +When an input mapping is applied then it creates a new **local variable** in the scope where the mapping is defined. + +Examples: + +| Workflow instance variables | Input mappings | New variables | +| -------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------- | +| `orderId: "order-123"` | **source:** `=orderId`
    **target:** `reference` | `reference: "order-123"` | +| `customer:{"name": "John"}` | **source:** `=customer.name`
    **target:** `sender` | `sender: "John"` | +| `customer: "John"`
    `iban: "DE456"` | **source:** `=customer`
    **target:** `sender.name`
    **source:** `=iban`
    **target:** `sender.iban` | `sender: {"name": "John", "iban": "DE456"}` | + +### Output mappings + +Output mappings can be used to customize how job/message variables are merged into the workflow instance. They can be defined on service tasks, receive tasks, message catch events and subprocesses. + +If **one or more** output mappings are defined then the job/message variables are set as _local variables_ in the scope where the mapping is defined. Then, the output mappings are applied to the variables and create new variables in this scope. The new variables are merged into the parent scope. If there is no mapping for a job/message variable then the variable is not merged. + +If **no** output mappings are defined then all job/message variables are merged into the workflow instance. + +In case of a subprocess, the behavior is different. There are no job/message variables to be merged. But output mappings can be used to propagate _local variables_ of the subprocess to higher scopes. By default, all _local variables_ are removed when the scope is left. + +Examples: + +| Job/message variables | Output mappings | Workflow instance variables | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------- | +| `status: "Ok"` | **source:** `=status`
    **target:** `paymentStatus` | `paymentStatus: "OK"` | +| `result: {"status": "Ok", "transactionId": "t-789"}` | **source:** `=result.status`
    **target:** `paymentStatus`
    **source:** `=result.transactionId`
    **target:** `transactionId` | `paymentStatus: "Ok"`
    `transactionId: "t-789"` | +| `status: "Ok"`
    `transactionId: "t-789"` | **source:** `=transactionId`
    **target:** `order.transactionId` | `order: {"transactionId": "t-789"}` | diff --git a/docs/product-manuals/concepts/what-is-camunda-cloud.md b/docs/product-manuals/concepts/what-is-camunda-cloud.md new file mode 100644 index 00000000000..7da32e55a22 --- /dev/null +++ b/docs/product-manuals/concepts/what-is-camunda-cloud.md @@ -0,0 +1,42 @@ +--- +id: what-is-camunda-cloud +title: "What is Camunda Cloud?" +--- + +Camunda Cloud is a software-as-a-service (SaaS) offering for microservices orchestration. Camunda Cloud ensures that, once started, flows are always carried out fully, retrying steps in case of failures. Along the way, Camunda Cloud maintains a complete audit log so that the progress of flows can be traced. + +Camunda Cloud is a turn-key solution that will accelerate your project implementation. It is particularly suited for integrating heterogeneous systems and orchestrating dispersed services implemented in different programming languages. + +Behind the scenes, resources inside Camunda Cloud are highly available and fault tolerant to give you peace of mind. Finally, Camunda Cloud offers clusters of different sizes, so you can pick the offering that best fits your business needs. + +## What problem does it solve? + +A company’s end-to-end workflows almost always span more than one microservice. In an e-commerce company, for example, a “customer order” workflow might involve a payments microservice, an inventory microservice, a shipping microservice, and more: + +![order-process](assets/order-process.png) + +These end-to-end workflows are mission critical, yet the workflows themselves are rarely modeled and monitored. Often, the flow of events through different microservices is opaque. + +Camunda Cloud addresses these challenges and provides: + +1. **Visibility** into the state of a company’s end-to-end workflows, including the number of in-flight workflows, average workflow duration, current errors within a workflow, and more. +2. **Workflow orchestration** based on the current state of a workflow; Camunda Cloud publishes “jobs” that can be exexcuted by one or more microservices, ensuring that workflows progress according to their definition. +3. **Monitoring for timeouts** or other workflow errors with the ability to configure error-handling steps such as stateful retries or escalation to teams that can resolve an issue manually. + +## What are its core quality attributes? + +Camunda Cloud was designed to operate at very large scale, and to achieve this, it provides: + +- **Horizontal scalability** and no dependence on an external database; Zeebe (the workflow engine inside Camunda Cloud) writes data directly to the filesystem on the same servers where it is deployed. Zeebe makes it simple to distribute processing across a cluster of machines to deliver high throughput. +- **High availability and fault tolerance** via a pre-configured replication mechanism, ensuring that Camunda Cloud can recover from machine or software failure with no data loss and minimal downtime. This ensures that the system as a whole remains available without requiring manual action. +- **Audit trail** - all workflow-relevant events are written to an append-only log, providing an audit trail and a history of the state of a workflow. +- **Reactive publish-subscribe interaction model**, which enables microservices that connect to Camunda Cloud to maintain a high degree of control and autonomy, including control over processing rates. These properties make Camunda Cloud resilient, scalable, and reactive. +- **Visual workflows modeled in ISO-standard BPMN 2.0** so that technical and non-technical stakeholders can collaborate on workflow design in a widely-used modeling language. +- **Language-agnostic client model** makes it possible to build a client in just about any programming language that an organization uses to build microservices. +- **Operational ease-of-use** as a SaaS provider we take care of all operational details. + +## How does it compare to other solutions? + +Most existing workflow engines offer a vast amount of features. While having access to lots of features is generally a good thing, it can come at a cost of increased complexity and degraded performance. + +Camunda Cloud is 100% focused on providing a compact, robust, and scalable solution for orchestration of workflows. Rather than supporting a broad spectrum of features, its goal is to excel within this scope. diff --git a/docs/product-manuals/concepts/workflow-instance-creation.md b/docs/product-manuals/concepts/workflow-instance-creation.md new file mode 100644 index 00000000000..92bf3847fb2 --- /dev/null +++ b/docs/product-manuals/concepts/workflow-instance-creation.md @@ -0,0 +1,100 @@ +--- +id: workflow-instance-creation +title: "Workflow instance creation" +--- + +Depending on the workflow definition, an instance of it can be created in the following ways + +- **CreateWorkflowInstance** commands +- timer event handler +- message event + +## Commands + +A workflow instance can be created by sending a command specifying the BPMN process id or the unique key of the workflow. +There are two commands to create a workflow instance. + +### Create and execute asynchronously + +A workflow that has a [none start event](/reference/bpmn-workflows/none-events/none-events.md#none-start-events) can be started explicitly using **[CreateWorkflowInstance](/reference/grpc.md#createworkflowinstance-rpc)**. +This command creates a new workflow instance and immediately responds with the workflow instance id. The execution of the workflow happens after the response is send. + +![create-workflow](assets/create-workflow.png) + +
    + Code example +

    Create a workflow instance: + +``` +zbctl create instance "order-process" +``` + +Response: + +``` +{ + "workflowKey": 2251799813685249, + "bpmnProcessId": "order-process", + "version": 1, + "workflowInstanceKey": 2251799813686019 +} + +``` + +

    +
    + +### Create and await results + +Typically, workflow creation and execution are decoupled. +However, there are use-cases that need to collect the results of a workflow when it's execution is completed. +**[CreateWorkflowInstanceWithResult](/reference/grpc.md#createworkflowinstancewithresult-rpc)** allows you to “synchronously” execute workflows and receive the results via a set of variables. The response is sent when the workflow execution is completed. + +![create-workflow](assets/create-workflow-with-result.png) + +This command is typically useful for short-running workflows and workflows that collect information. +If the workflow mutates system state, or further operations rely on the workflow outcome response to the client, take care to consider and design your system for failure states and retries. +Note that when the client resends the command, it creates a new workflow instance. + +
    + Code example +

    Create a workflow instance and await results: + +``` +zbctl create instance "order-process" --withResult --variables '{"orderId": "1234"}' +``` + +Response: (Note that the variables in the response depend on the workflow.) + +``` +{ + "workflowKey": 2251799813685249, + "bpmnProcessId": "order-process", + "version": 1, + "workflowInstanceKey": 2251799813686045, + "variables": "{\"orderId\":\"1234\"}" +} +``` + +

    +
    + +Failure scenarios that are applicable to other commands are applicable to this command, as well. Clients may not get a response in the following cases even if the workflow execution is completed successfully. + +- Connection timeout: If the gRPC deadlines are not configured for long request timeout, the connection may be closed before the workflow is completed. +- Network connection loss: This can happen at several steps in the communication chain +- Failover: When the node that is processing this workflow crashed, another node continues the processing. But that other node does not send the response because the request is registered on the first one. +- Gateway failure: If the gateway to which the client is connected fails, nodes inside the cluster cannot send the response to the client. + +## Events + +Workflow instances are also created implicitly via various start events. Camunda Cloud supports message start events and timer start events. + +### Message Event + +A workflow with a [message start event](/reference/bpmn-workflows/message-events/message-events.md#message-start-events) can be started by publishing a message with the name that matches the message name of the start event. +For each new message a new instance is created. + +### Timer Event + +A workflow can also have one or more [timer start events](/reference/bpmn-workflows/timer-events/timer-events.md#timer-start-events). An instance of the workflow is created when the associated timer is triggered. Timers can also trigger periodically. diff --git a/docs/product-manuals/concepts/workflows.md b/docs/product-manuals/concepts/workflows.md new file mode 100644 index 00000000000..dd1f8aea2fe --- /dev/null +++ b/docs/product-manuals/concepts/workflows.md @@ -0,0 +1,66 @@ +--- +id: workflows +title: "Workflows" +--- + +Workflows are flowchart-like blueprints that define the orchestration of _tasks_. Every task represents a piece of business logic such that the ordered execution produces a meaningful result. + +A _job worker_ implements the business logic required to complete a task. A job worker must be able to communicate with Camunda Cloud, but otherwise, there are no restrictions on its implementation. You can choose to write a worker as a microservice, but also as part of a classical three-tier application, as a \(lambda\) function, via command line tools, etc. + +Running a workflow then requires three steps: + +- Deploy a workflow to Camunda Cloud +- Implement and register job workers for tasks in the worklfows +- Create new instances of said workflow + +But let us not get ahead of ourselves. The very first step is to design the process. + +## BPMN 2.0 + +Zeebe uses [BPMN 2.0](http://www.bpmn.org/) for representing workflows. BPMN is an industry standard which is widely supported by different vendors and implementations. Using BPMN ensures that workflows can be interchanged between Zeebe and other workflow systems. + +## BPMN modeler + +Zeebe provides a free and open-source BPMN modeling tool to create BPMN diagrams and configure their technical properties. The modeler is a desktop application based on the [bpmn.io](https://bpmn.io) open source project. + +Zeebe Modeler can be [downloaded from GitHub](https://github.com/zeebe-io/zeebe-modeler/releases). + +## Sequences + +The simplest kind of workflow is an ordered sequence of tasks. Whenever workflow execution reaches a task, Zeebe (the workflow engine inside Camunda Cloud) creates a job that can be requested and completed by a job worker. + +![workflow-sequence](assets/order-process.png) + +You can think of Zeebe's workflow orchestration as a state machine. A workflow instance reaches a task, and Zeebe creates a job that can be requested by a worker. Zeebe then waits for the worker to request a job and complete the work. Once the work is completed, the flow continues to the next step. If the worker fails to complete the work, the workflow remains at the current step, and the job could be retried until it's successfully completed. + +## Data flow + +As Zeebe progresses from one task to the next in a workflow, it can move custom data in the form of variables. Variables are key-value-pairs and part of the workflow instance. + +![data-flow](assets/workflow-data-flow.png) + +Any job worker can read the variables and modify them when completing a job so that data can be shared between different tasks in a workflow. + +## Data-based conditions + +Some workflows do not always execute the same tasks but need to choose different tasks based on variables and conditions: + +![data-conditions](assets/workflows-data-based-conditions.png) + +The diamond shape with the "X" in the middle is an element indicating that the workflow decides to take one of several paths. + +## Events + +Events represent things that happen. A workflow can react to events (catching event) and can emit events (throwing event). For example: + +![workflow](assets/workflow-events.png) + +There are different types of events such as message, timer or error. + +## Parallel execution + +In many cases, it is also useful to perform multiple tasks in parallel. This can be achieved with a parallel gateway: + +![data-conditions](assets/workflows-parallel-gateway.png) + +The diamond shape with the "+" marker means that all outgoing paths are activated. The tasks on those paths can run in parallel. The order is only fulfilled after both tasks have completed. diff --git a/docs/product-manuals/modeler/cloud-modeler/img/bpmn-diagrams-overview.png b/docs/product-manuals/modeler/cloud-modeler/img/bpmn-diagrams-overview.png new file mode 100644 index 00000000000..6374c342481 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/bpmn-diagrams-overview.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/cluster-creating.png b/docs/product-manuals/modeler/cloud-modeler/img/cluster-creating.png new file mode 100644 index 00000000000..dd9a3f44bf9 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/cluster-creating.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/element-configuration.png b/docs/product-manuals/modeler/cloud-modeler/img/element-configuration.png new file mode 100644 index 00000000000..60ee5fb64af Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/element-configuration.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/elements.png b/docs/product-manuals/modeler/cloud-modeler/img/elements.png new file mode 100644 index 00000000000..28acf82aca2 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/elements.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/go-to-operate.png b/docs/product-manuals/modeler/cloud-modeler/img/go-to-operate.png new file mode 100644 index 00000000000..fc606b81cd9 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/go-to-operate.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/import-diagram.png b/docs/product-manuals/modeler/cloud-modeler/img/import-diagram.png new file mode 100644 index 00000000000..6b72f97bcd0 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/import-diagram.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/new-bpmn-diagram.png b/docs/product-manuals/modeler/cloud-modeler/img/new-bpmn-diagram.png new file mode 100644 index 00000000000..5651d7488b6 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/new-bpmn-diagram.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/no-cluster-message.png b/docs/product-manuals/modeler/cloud-modeler/img/no-cluster-message.png new file mode 100644 index 00000000000..b3c48f6fbe9 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/no-cluster-message.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/properties-panel.png b/docs/product-manuals/modeler/cloud-modeler/img/properties-panel.png new file mode 100644 index 00000000000..612899a3b33 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/properties-panel.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/save-and-deploy.png b/docs/product-manuals/modeler/cloud-modeler/img/save-and-deploy.png new file mode 100644 index 00000000000..52e5a22e990 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/save-and-deploy.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/start-process-instance-variables.png b/docs/product-manuals/modeler/cloud-modeler/img/start-process-instance-variables.png new file mode 100644 index 00000000000..b2e519a39f2 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/start-process-instance-variables.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/img/start-process-instance.png b/docs/product-manuals/modeler/cloud-modeler/img/start-process-instance.png new file mode 100644 index 00000000000..c33bd530252 Binary files /dev/null and b/docs/product-manuals/modeler/cloud-modeler/img/start-process-instance.png differ diff --git a/docs/product-manuals/modeler/cloud-modeler/import-diagram.md b/docs/product-manuals/modeler/cloud-modeler/import-diagram.md new file mode 100644 index 00000000000..37180521b97 --- /dev/null +++ b/docs/product-manuals/modeler/cloud-modeler/import-diagram.md @@ -0,0 +1,8 @@ +--- +id: import-diagram +title: Import diagram +--- + +In the Cloud Modeler you can import a BPMN diagram at any time. To do so, click **Import Diagram**. + +![import diagram](img/import-diagram.png) diff --git a/docs/product-manuals/modeler/cloud-modeler/launch-cloud-modeler.md b/docs/product-manuals/modeler/cloud-modeler/launch-cloud-modeler.md new file mode 100644 index 00000000000..bd5ab0ca751 --- /dev/null +++ b/docs/product-manuals/modeler/cloud-modeler/launch-cloud-modeler.md @@ -0,0 +1,8 @@ +--- +id: launch-cloud-modeler +title: Launch Cloud Modeler +--- + +Since the Cloud Modeler is embedded in the Camunda Cloud Console, it does not need to be started separately. Go to the tab **BPMN Diagrams** and click the button **Create New Diagram** or click on an **existing diagram** to jump to the Modeler. + +![diagram overview](img/bpmn-diagrams-overview.png) diff --git a/docs/product-manuals/modeler/cloud-modeler/model-your-first-diagram.md b/docs/product-manuals/modeler/cloud-modeler/model-your-first-diagram.md new file mode 100644 index 00000000000..d5113fafcb5 --- /dev/null +++ b/docs/product-manuals/modeler/cloud-modeler/model-your-first-diagram.md @@ -0,0 +1,20 @@ +--- +id: model-your-first-diagram +title: Model your first diagram +--- + +After you have created a new BPMN diagram you can start modeling it. We have preconfigured a very simple diagram - it consists of a start and end event and does not need to be configured further to be deployed. Of course you can add more elements and configure the different events. + +![new bpmn diagram](img/new-bpmn-diagram.png) + +On the left side you will find the element palette that is supported by the engine. You can drag and drop the elements into the diagram. + +![supported bpmn elements](img/elements.png) + +Elements that support different types can be reconfigured by clicking on the corresponding icon. In the following screenshot a task has been added to the diagram. It can be converted to a service task, for example. + +![task configuration](img/element-configuration.png) + +Each element has certain attributes that can be changed. The properties panel is located on the right side. + +![properties panel](img/properties-panel.png) diff --git a/docs/product-manuals/modeler/cloud-modeler/save-and-deploy.md b/docs/product-manuals/modeler/cloud-modeler/save-and-deploy.md new file mode 100644 index 00000000000..39c5d0b24eb --- /dev/null +++ b/docs/product-manuals/modeler/cloud-modeler/save-and-deploy.md @@ -0,0 +1,22 @@ +--- +id: save-and-deploy +title: Save and deploy your diagram +--- + +Your BPMN diagram can be saved in your organizational context at any time. You have to differentiate between saving and deploying. If a diagram is only saved it has no effect on your cluster(s). It can be used by all members of your organization. + +As soon as you deploy the diagram it will be available on the selected cluster and new instances can be started. Click **Save and Deploy** to deploy your diagram. If no cluster is available yet you can create a new cluster. + +![no-cluster](img/no-cluster-message.png) + +After you have created a cluster it must be ready to deploy a diagram. + +![cluster creating](img/cluster-creating.png) + +As soon as the cluster is _Healthy_, the deployment is possible. + +![save and deploy](img/save-and-deploy.png) + +After a successful deployment you can [start a new instance](./start-instance.md). + +![start process instance](img/start-process-instance.png) diff --git a/docs/product-manuals/modeler/cloud-modeler/start-instance.md b/docs/product-manuals/modeler/cloud-modeler/start-instance.md new file mode 100644 index 00000000000..45a2e1492a2 --- /dev/null +++ b/docs/product-manuals/modeler/cloud-modeler/start-instance.md @@ -0,0 +1,16 @@ +--- +id: start-instance +title: Start a new process instance +--- + +If a BPMN diagram was deployed via the Cloud Modeler you can start a new instance of this diagram. To do so, click **Start Instance**. + +![start instance](img/start-process-instance-variables.png) + +You can also specify variables that are written to the process context at startup. The variables must be formatted in valid JSON. As an example you can use the following JSON: + +```json +{ + "hello": "world" +} +``` diff --git a/docs/product-manuals/modeler/overview.md b/docs/product-manuals/modeler/overview.md new file mode 100644 index 00000000000..a71a1831124 --- /dev/null +++ b/docs/product-manuals/modeler/overview.md @@ -0,0 +1,18 @@ +--- +id: overview +title: Overview +--- + +Any executable process needs a **BPMN diagram** that must be designed and configured beforehand. The design is used to specify the flow of a process. Thereby different events have to be configured in the model so that the workflow engine understands what is to be executed in this step. + +A configuration can be the conditions in a gateway or the specification of a service task. + +Camunda offers three tools for this: + +- [Cawemo](https://cawemo.com/), +- the [Cloud Modeler](./cloud-modeler/launch-cloud-modeler.md), and +- the [Zeebe Modeler](./zeebe-modeler/install-the-modeler.md). + +Cawemo focuses on the design phase and provides options for collaborative work on a BPMN model. The Cloud Modeler and the Zeebe Modeler support the technical parameterization of the models. It is possible to design the model in Cawemo and then continue working with the Cloud Modeler or Zeebe Modeler. + +The Cloud Modeler and the Zeebe Modeler differ mainly in their environment. The Zeebe Modeler is a desktop application that can be installed and used locally. The Cloud Modeler is part of the Cloud Console and offers a seamless integration into Camunda Cloud. diff --git a/docs/product-manuals/modeler/zeebe-modeler/connect-to-camunda-cloud.md b/docs/product-manuals/modeler/zeebe-modeler/connect-to-camunda-cloud.md new file mode 100644 index 00000000000..ed387c442f5 --- /dev/null +++ b/docs/product-manuals/modeler/zeebe-modeler/connect-to-camunda-cloud.md @@ -0,0 +1,18 @@ +--- +id: connect-to-camunda-cloud +title: Connect to Camunda Cloud +--- + +The Zeebe Modeler can communicate directly with Camunda Cloud. Click on the deployment icon: + +![deployment icon](./img/deploy-icon.png) + +You have two possibilities to select a target. Besides a self-hosted solution you can configure Camunda Cloud. + +![deployment configuration](./img/deploy-diagram-camunda-cloud.png) + +Select **Camunda Cloud** to continue. For the communication you need the `Cluster Id` of your cluster and the credentials (`Client Id`, `Client Secret`) of your [API client](../../cloud-console/manage-clusters/manage-api-clients.md). + +![deployment via camunda cloud](./img/deploy-diagram-camunda-cloud-remember.png) + +You can select the **Remember** checkbox if you want your connection data to be persisted. diff --git a/docs/product-manuals/modeler/zeebe-modeler/deploy-to-cloud.md b/docs/product-manuals/modeler/zeebe-modeler/deploy-to-cloud.md new file mode 100644 index 00000000000..9b37669c7d7 --- /dev/null +++ b/docs/product-manuals/modeler/zeebe-modeler/deploy-to-cloud.md @@ -0,0 +1,16 @@ +--- +id: deploy-to-cloud +title: Deploy to Camunda Cloud +--- + +Once you have established your [connection to Camunda Cloud](./connect-to-camunda-cloud.md) you can deploy your BPMN diagram via the deployment icon. + +![deployment icon](./img/deploy-icon.png) + +:::note +The BPMN diagram must not only be valid, but must also be understood by the Zeebe engine. For example, if you model a service task but do not configure the element, you will get an error message during the deployment. +::: + +If the BPMN diagram has been deployed successfully, a corresponding message is displayed. + +![deployment successful](./img/deployment-successful.png) diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram-camunda-cloud-remember.png b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram-camunda-cloud-remember.png new file mode 100644 index 00000000000..af5c1c4a623 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram-camunda-cloud-remember.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram-camunda-cloud.png b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram-camunda-cloud.png new file mode 100644 index 00000000000..3863be90f58 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram-camunda-cloud.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram.png b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram.png new file mode 100644 index 00000000000..f9dc2e9ca9f Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-diagram.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/deploy-icon.png b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-icon.png new file mode 100644 index 00000000000..e5851179d27 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/deploy-icon.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/deployment-successful.png b/docs/product-manuals/modeler/zeebe-modeler/img/deployment-successful.png new file mode 100644 index 00000000000..7597f01f386 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/deployment-successful.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/element-configuration.png b/docs/product-manuals/modeler/zeebe-modeler/img/element-configuration.png new file mode 100644 index 00000000000..6861344020a Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/element-configuration.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/elements.png b/docs/product-manuals/modeler/zeebe-modeler/img/elements.png new file mode 100644 index 00000000000..bc692eba227 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/elements.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/empty.png b/docs/product-manuals/modeler/zeebe-modeler/img/empty.png new file mode 100644 index 00000000000..9862fd470a7 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/empty.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/new-diagram.png b/docs/product-manuals/modeler/zeebe-modeler/img/new-diagram.png new file mode 100644 index 00000000000..d6f128823e7 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/new-diagram.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/properties-panel.png b/docs/product-manuals/modeler/zeebe-modeler/img/properties-panel.png new file mode 100644 index 00000000000..8872faf0892 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/properties-panel.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/start-instance-icon.png b/docs/product-manuals/modeler/zeebe-modeler/img/start-instance-icon.png new file mode 100644 index 00000000000..259f384a8fa Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/start-instance-icon.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/img/start-instance-successful.png b/docs/product-manuals/modeler/zeebe-modeler/img/start-instance-successful.png new file mode 100644 index 00000000000..00798ca7f72 Binary files /dev/null and b/docs/product-manuals/modeler/zeebe-modeler/img/start-instance-successful.png differ diff --git a/docs/product-manuals/modeler/zeebe-modeler/install-the-modeler.md b/docs/product-manuals/modeler/zeebe-modeler/install-the-modeler.md new file mode 100644 index 00000000000..7ce93e254e7 --- /dev/null +++ b/docs/product-manuals/modeler/zeebe-modeler/install-the-modeler.md @@ -0,0 +1,6 @@ +--- +id: install-the-zeebe-modeler +title: Install the Zeebe Modeler +--- + +The [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler) is the desktop application for modeling Zeebe workflows with BPMN. The application can be run on Windows, MacOS and Linux. The corresponding packages can be found on the [releases page](https://github.com/zeebe-io/zeebe-modeler/releases). diff --git a/docs/product-manuals/modeler/zeebe-modeler/model-your-first-diagram.md b/docs/product-manuals/modeler/zeebe-modeler/model-your-first-diagram.md new file mode 100644 index 00000000000..9a8af033d0d --- /dev/null +++ b/docs/product-manuals/modeler/zeebe-modeler/model-your-first-diagram.md @@ -0,0 +1,26 @@ +--- +id: model-your-first-diagram +title: Model your first diagram +--- + +After [downloading](./install-the-modeler.md), setting up, and starting the Zeebe Modeler, you can model your first BPMN diagram. Create a new BPMN diagram. + +![empty application](./img/empty.png) + +Now you see a BPMN diagram with a start event: + +![new diagram](./img/new-diagram.png) + +As with the [Cloud Modeler](../cloud-modeler/model-your-first-diagram.md), you can now add new elements. On the left side you will find the element palette that is supported by the engine. You can drag and drop the elements into the diagram. + +![elements](./img/elements.png) + +Elements that support different types can be reconfigured by clicking on the corresponding icon. In the following screenshot a task has been added to the diagram. It can be converted to a service task, for example. + +![task configuration](img/element-configuration.png) + +Each element has certain attributes that can be changed. The properties panel is located on the right side. + +![properties panel](img/properties-panel.png) + +Once you have finished modeling and configuring your diagram, you can save it as BPMN or deploy it on a [Camunda Cloud cluster](./connect-to-camunda-cloud.md) (of course you can also export the diagram as an image). diff --git a/docs/product-manuals/modeler/zeebe-modeler/start-instance.md b/docs/product-manuals/modeler/zeebe-modeler/start-instance.md new file mode 100644 index 00000000000..01d09a00400 --- /dev/null +++ b/docs/product-manuals/modeler/zeebe-modeler/start-instance.md @@ -0,0 +1,16 @@ +--- +id: start-instance +title: Start a new process instance +--- + +Once you have established your [connection to Camunda Cloud](./connect-to-camunda-cloud.md) you can start a new Instance of your BPMN diagram via the play icon. + +![start instance icon](./img/start-instance-icon.png) + +:::note +The BPMN diagram must be deployed on your cluster before, otherwise no instance can be started. +::: + +If an instance could be started successfully a corresponding message is displayed. + +![start instance successful](./img/start-instance-successful.png) diff --git a/docs/product-manuals/operate/deployment/configuration.md b/docs/product-manuals/operate/deployment/configuration.md index 0333bd65cbb..1f57ab1475f 100644 --- a/docs/product-manuals/operate/deployment/configuration.md +++ b/docs/product-manuals/operate/deployment/configuration.md @@ -8,18 +8,30 @@ Operate is a Spring Boot application. That means all ways to [configure](https:/ a Spring Boot application can be applied. By default the configuration for Operate is stored in a YAML file `application.yml`. All Operate related settings are prefixed with `camunda.operate`. The following parts are configurable: - * [Elasticsearch Connection](#elasticsearch) - * [Zeebe Broker connection](#zeebe-broker-connection) - * [Zeebe Elasticsearch Exporter](#zeebe-elasticsearch-exporter) - * [Operation Executor](#operation-executor) - * [Authentication](authentication.md) - * [Scaling Operate](importer-and-archiver.md) - * [Monitoring possibilities](#monitoring-operate) - * [Logging configuration](#logging) - * [Probes](#probes) +* [Webserver](#webserver) +* [Elasticsearch Connection](#elasticsearch) +* [Zeebe Broker connection](#zeebe-broker-connection) +* [Zeebe Elasticsearch Exporter](#zeebe-elasticsearch-exporter) +* [Operation Executor](#operation-executor) +* [Authentication](authentication.md) +* [Scaling Operate](importer-and-archiver.md) +* [Monitoring possibilities](#monitoring-operate) +* [Logging configuration](#logging) ## Configurations +### Webserver + +Operate supports customizing the *context-path* by using default spring configuration. + +Example for `application.yml`: +`server.servlet.context-path: /operate` + +Example for environment variable: +`SERVER_SERVLET_CONTEXT_PATH=/operate` + +Default context-path is `/` + ### Elasticsearch Operate stores and reads data in/from Elasticsearch. @@ -40,22 +52,6 @@ camunda.operate.elasticsearch.url | URL of Elasticsearch REST API | http://local camunda.operate.elasticsearch.username | Username to access Elasticsearch REST API | - camunda.operate.elasticsearch.password | Password to access Elasticsearch REST API | - -### Settings for shards and replicas - -Operate creates the template with index settings named `operate-_template` that Elasticsearch will use for all Operate indices. -These settings can be changed. - -Following configuration parameters will define the settings: - -Name|Description|Default value -----|-----------|-------------- -camunda.operate.elasticsearch.numberOfShards| How many shards Elasticsearch uses for all Operate indices| 1 -camunda.operate.elasticsearch.numberOfReplicas| How many replicas Elasticsearch uses for all Operate indices| 0 - -These values are applied only on first startup of Operate or during version upgrade. After Operate -ELS schema is created, settings may be adjusted directly in ELS template and the new settings will be applied -to indices created after adjustment. - ### A snippet from application.yml: ```yaml @@ -63,13 +59,13 @@ camunda.operate: elasticsearch: # Cluster name clusterName: elasticsearch - # Host + # Url url: http://localhost:9200 ``` -## Zeebe Broker Connection +## Zeebe broker connection -Operate needs a connection to Zeebe Broker to start the import and to execute user operations. +Operate needs a connection to Zeebe broker to start the import and to execute user operations. ### Settings to connect @@ -86,7 +82,7 @@ camunda.operate: brokerContactPoint: localhost:26500 ``` -## Zeebe Elasticsearch Exporter +## Zeebe Elasticsearch exporter Operate imports data from Elasticsearch indices created and filled in by [Zeebe Elasticsearch Exporter](https://github.com/zeebe-io/zeebe/tree/develop/exporters/elasticsearch-exporter). Therefore settings for this Elasticsearch connection must be defined and must correspond to the settings on Zeebe side. @@ -98,6 +94,7 @@ Name | Description | Default value camunda.operate.zeebeElasticsearch.clusterName | Cluster name of Elasticsearch | elasticsearch camunda.operate.zeebeElasticsearch.host | Hostname where Elasticsearch is running | localhost camunda.operate.zeebeElasticsearch.port | Port of Elasticsearch REST API | 9200 +camunda.operate.zeebeElasticsearch.url | URL of Zeebe Elasticsearch REST API | http://localhost:9200 camunda.operate.zeebeElasticsearch.prefix | Index prefix as configured in Zeebe Elasticsearch exporter | zeebe-record camunda.operate.zeebeElasticsearch.username | Username to access Elasticsearch REST API | - camunda.operate.zeebeElasticsearch.password | Password to access Elasticsearch REST API | - @@ -109,15 +106,13 @@ camunda.operate: zeebeElasticsearch: # Cluster name clusterName: elasticsearch - # Host - host: localhost - # Transport port - port: 9200 + # Url + url: localhost:9200 # Index prefix, configured in Zeebe Elasticsearch exporter prefix: zeebe-record ``` -## Operation Executor +## Operation executor Operations are user operations like Cancellation of workflow instance(s) or Updating the variable value. Operations are executed in multi-threaded manner. @@ -175,16 +170,13 @@ that can be further adjusted to your needs: %clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx - ${env:OPERATE_LOG_STACKDRIVER_SERVICENAME:-operate} - ${env:OPERATE_LOG_STACKDRIVER_SERVICEVERSION:-} - - + + @@ -210,7 +202,7 @@ OPERATE_LOG_APPENDER=Stackdriver ## An example of application.yml file The following snippet represents the default Operate configuration, which is shipped with the distribution. It can be found inside the `config` folder (`config/application.yml`) - and can be used to adjust Operate to your needs. +and can be used to adjust Operate to your needs. ```yaml # Operate configuration file @@ -243,4 +235,4 @@ camunda.operate: port: 9200 # Index prefix, configured in Zeebe Elasticsearch exporter prefix: zeebe-record -``` +``` \ No newline at end of file diff --git a/docs/product-manuals/operate/deployment/img/operate-dashboard-no-workflows_dark.png b/docs/product-manuals/operate/deployment/img/operate-dashboard-no-workflows_dark.png new file mode 100644 index 00000000000..48959e8e352 Binary files /dev/null and b/docs/product-manuals/operate/deployment/img/operate-dashboard-no-workflows_dark.png differ diff --git a/docs/product-manuals/operate/deployment/img/operate-dashboard-no-workflows_light.png b/docs/product-manuals/operate/deployment/img/operate-dashboard-no-workflows_light.png new file mode 100644 index 00000000000..1b6d71e1f7a Binary files /dev/null and b/docs/product-manuals/operate/deployment/img/operate-dashboard-no-workflows_light.png differ diff --git a/docs/product-manuals/operate/deployment/importer-and-archiver.md b/docs/product-manuals/operate/deployment/importer-and-archiver.md index 330e38140cc..6fb64976b45 100644 --- a/docs/product-manuals/operate/deployment/importer-and-archiver.md +++ b/docs/product-manuals/operate/deployment/importer-and-archiver.md @@ -1,6 +1,6 @@ --- id: importer-and-archiver -title: Importer & Archiver +title: Importer and archiver --- Operate consists of three modules: * **Webapp** - contains the UI and operation executor functionality diff --git a/docs/product-manuals/operate/deployment/install-and-start.md b/docs/product-manuals/operate/deployment/install-and-start.md new file mode 100644 index 00000000000..cb1c88293ac --- /dev/null +++ b/docs/product-manuals/operate/deployment/install-and-start.md @@ -0,0 +1,105 @@ +--- +id: install-and-start +title: Install and start Operate +--- +## Running via Docker (local development) + +The easiest way to run Operate in development is with Docker. This gives you a consistent, reproducible environment and an out-of-the-box integrated experience for experimenting with Zeebe and Operate. + +To do this, you need [Docker Desktop](https://www.docker.com) installed on your development machine. + +The [zeebe-docker-compose](https://github.com/zeebe-io/zeebe-docker-compose) repository contains an [operate](https://github.com/zeebe-io/zeebe-docker-compose/tree/master/operate) profile that starts a single Zeebe broker with Operate and all its dependencies. **See the README file in the repository for instructions to start Zeebe and Operate using Docker.** + +If you are using Docker, once you follow the instructions in the repository, skip ahead to the section ["Access the Operate Web Interface”](#access-the-operate-web-interface). + +## Running with Kubernetes (production) + +We will update this section after Operate is available for production use. + +Running Operate with Kubernetes will be recommended for production deployments. + +## Manual Configuration (local development) + +Here, we’ll walk you through how to download and run an Operate distribution manually, without using Docker. + +Note that the Operate web UI is available by default at [http://localhost:8080](http://localhost:8080), so please be sure this port is available. + + +### Download Operate and a compatible version of Zeebe. + +[Operate and Zeebe distributions are available for download on the same release page. ](https://github.com/zeebe-io/zeebe/releases) + +Note that each version of Operate is compatible with a specific version of Zeebe. + +On the Zeebe release page, compatible versions of Zeebe and Operate are grouped together. Please be sure to download and use compatible versions. This is handled for you if you use the Docker profile from our repository. + +### Download Elasticsearch + +Operate uses open-source Elasticsearch as its underlying data store, and so to run Operate, you need to download and run Elasticsearch. + +Operate is currently compatible to Elasticsearch 6.8.13. [You can download Elasticsearch here.](https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-13) + +### Run Elasticsearch + +To run Elasticsearch, execute the following commands in Terminal or another command line tool of your choice: + +``` +cd elasticsearch-* +bin/elasticearch +``` + +You’ll know Elasticsearch has started successfully when you see a message similar to: + +``` +[INFO ][o.e.l.LicenseService ] [-IbqP-o] license [72038058-e8ae-4c71-81a1-e9727f2b81c7] mode [basic] - valid +``` + +### Run Zeebe + +To run Zeebe, execute the following commands: + + +``` +cd zeebe-broker-* +./bin/broker +``` + + +You’ll know Zeebe has started successfully when you see a message similar to: + + +``` +[partition-0] [0.0.0.0:26501-zb-actors-0] INFO io.zeebe.raft - Joined raft in term 0 +[exporter] [0.0.0.0:26501-zb-actors-1] INFO io.zeebe.broker.exporter.elasticsearch - Exporter opened +``` + +### Run Operate + +To run Operate, execute the following commands: + +``` +cd camunda-operate-distro-0.26.0-* +bin/operate +``` + +You’ll know Operate has started successfully when you see messages similar to: + +``` +DEBUG 1416 --- [ Thread-6] o.c.o.e.w.BatchOperationWriter : 0 operations locked +DEBUG 1416 --- [ Thread-4] o.c.o.z.ZeebeESImporter : Latest loaded position for alias [zeebe-record-deployment] and partitionId [0]: 0 +INFO 1416 --- [ Thread-4] o.c.o.z.ZeebeESImporter : Elasticsearch index for ValueType DEPLOYMENT was not found, alias zeebe-record-deployment. Skipping. +``` + +## Access the Operate web interface + +The Operate web interface is available at [http://localhost:8080](http://localhost:8080). + +The first screen you'll see is a sign-in page. Use the credentials `demo` / `demo` to sign in. + +After you sign in, you'll see an empty dashboard if you haven't yet deployed any workflows: + +![operate-dash-no-workflows](img/operate-dashboard-no-workflows_light.png) + +If you _have_ deployed workflows or created workflow instances, you'll see those on your dashboard: + +![operate-dash-with-workflows](../img/operate-introduction_light.png) \ No newline at end of file diff --git a/docs/product-manuals/operate/deployment/schema-and-migration.md b/docs/product-manuals/operate/deployment/schema-and-migration.md index c4cbbc08b1a..ba432ce0890 100644 --- a/docs/product-manuals/operate/deployment/schema-and-migration.md +++ b/docs/product-manuals/operate/deployment/schema-and-migration.md @@ -1,11 +1,11 @@ --- id: schema-and-migration -title: Schema & Migration +title: Schema and migration --- Operate stores data in Elasticsearch. On first start Operate will create all required indices and templates. * [Schema](#schema) -* [Data Migration](#data-migration) +* [Data migration](#data-migration) * [How to migrate](#how-to-migrate) * [Example for migrate in Kubernetes](#example-for-migrate-in-kubernetes) diff --git a/docs/product-manuals/operate/img/operate-introduction_dark.png b/docs/product-manuals/operate/img/operate-introduction_dark.png new file mode 100644 index 00000000000..283cdb910f9 Binary files /dev/null and b/docs/product-manuals/operate/img/operate-introduction_dark.png differ diff --git a/docs/product-manuals/operate/img/operate-introduction_light.png b/docs/product-manuals/operate/img/operate-introduction_light.png new file mode 100644 index 00000000000..4d37fdeedd1 Binary files /dev/null and b/docs/product-manuals/operate/img/operate-introduction_light.png differ diff --git a/docs/product-manuals/operate/index.md b/docs/product-manuals/operate/index.md new file mode 100644 index 00000000000..ab2655dd01e --- /dev/null +++ b/docs/product-manuals/operate/index.md @@ -0,0 +1,31 @@ +--- +id: index +title: Introduction +--- + +Operate is a tool for monitoring and troubleshooting workflow instances running in Zeebe. + + +In addition to providing visibility into active and completed workflow instances, Operate also makes it possible to carry out key operations such as resolving incidents and updating workflow instance variables. + +![operate-introduction](img/operate-introduction_light.png) + +In the [Operate User Guide](userguide/basic-operate-navigation) you can find out how to use it to monitor workflow instances and more features. + +In the [Operate Deployment Guide](deployment/install-and-start) you can walk through how to install and run Operate. + +Operate is also available for production use (with support) in the Camunda Cloud offering. +If you'd like try out Operate in the Camunda Cloud, [please sign up here.](https://accounts.cloud.camunda.io/signup) + +Because Operate can be a helpful tool when getting started with Zeebe and building an initial proof of concept, we make it available under a developer license for **free, non-production use**. [You can find the developer license here](https://zeebe.io/legal/operate-evaluation-license/). There are no restrictions under this license when it comes to the length of the evaluation period or the available feature set _as long as you use Operate in non-production environments only._ + diff --git a/docs/product-manuals/operate/userguide/basic-operate-navigation.md b/docs/product-manuals/operate/userguide/basic-operate-navigation.md index 361f38b83c4..fd4d072f23e 100644 --- a/docs/product-manuals/operate/userguide/basic-operate-navigation.md +++ b/docs/product-manuals/operate/userguide/basic-operate-navigation.md @@ -1,36 +1,36 @@ --- id: basic-operate-navigation -title: Getting Familiar With Operate +title: Getting familiar with Operate --- -This section "Getting Familiar With Operate" and the next section “Incidents and Payloads” assumes that you’ve deployed a workflow to Zeebe and have created at least one workflow instance. +This section "Getting familiar with Operate" and the next section “Variables and incidents” assumes that you’ve deployed a workflow to Zeebe and have created at least one workflow instance. -If you’re not sure how to deploy workflows or create instances, we recommend going through the "Getting Started tutorial". +If you’re not sure how to deploy workflows or create instances, we recommend going through the [Getting started tutorial](./guides/getting-started/model-your-first-process.md) In the following sections, we’ll use the same `order-process.bpmn` workflow model from the Getting Started guide. -## View A Deployed Workflow +## View a deployed workflow -In the “Instances by Workflow” panel in your dashboard, you should see a list of your deployed workflows and running instances. +In the **Instances by Workflow** panel in your dashboard, you should see a list of your deployed workflows and running instances. -![operate-dash-with-workflows](./img/Operate-Dashboard-Deployed-Workflow.png) +![operate-view-workflow](../img/operate-introduction_light.png) -When you click on the name of a deployed workflow in the “Instances by Workflow” panel, you’ll navigate to a view of that workflow model along with all running instances. +When you click on the name of a deployed workflow in the **Instances by Workflow** panel, you’ll navigate to a view of that workflow model along with all running instances. -![operate-view-workflow](./img/Operate-View-Workflow.png) +![operate-view-workflow](./img/operate-view-workflow_light.png) -From this “Running Instances” view, you have the ability to cancel a single running workflow instance. +From this **Running Instances** view, you have the ability to cancel a single running workflow instance. -![operate-cancel-workflow-instance](./img/Operate-View-Workflow-Cancel.png) +![operate-cancel-workflow-instance](./img/operate-view-workflow-cancel_light.png) -## Inspect A Workflow Instance +## Inspect a workflow instance -Running workflow instances appear in the “Instances” section below the workflow model. To inspect a specific instance, you can click on the instance ID. +Running workflow instances appear in the **Instances** section below the workflow model. To inspect a specific instance, you can click on the instance id. -![operate-inspect-instance](./img/Operate-Workflow-Instance-ID.png) +![operate-inspect-instance](./img/operate-workflow-instance-id_light.png) There, you’ll be able to see detail about the workflow instance, including the instance history and the variables attached to the instance. -![operate-view-instance-detail](./img/Operate-View-Instance-Detail.png) +![operate-view-instance-detail](./img/operate-view-instance-detail_light.png) diff --git a/docs/product-manuals/operate/userguide/img/operate-create-selection_dark.png b/docs/product-manuals/operate/userguide/img/operate-create-selection_dark.png new file mode 100644 index 00000000000..f7e4f629181 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-create-selection_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-create-selection_light.png b/docs/product-manuals/operate/userguide/img/operate-create-selection_light.png new file mode 100644 index 00000000000..fec42fd5ce5 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-create-selection_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-incident-resolved-path_dark.png b/docs/product-manuals/operate/userguide/img/operate-incident-resolved-path_dark.png new file mode 100644 index 00000000000..e3a6336790f Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-incident-resolved-path_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-incident-resolved-path_light.png b/docs/product-manuals/operate/userguide/img/operate-incident-resolved-path_light.png new file mode 100644 index 00000000000..50890ea6bc6 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-incident-resolved-path_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-incident-resolved_dark.png b/docs/product-manuals/operate/userguide/img/operate-incident-resolved_dark.png new file mode 100644 index 00000000000..ed6802eec4d Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-incident-resolved_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-incident-resolved_light.png b/docs/product-manuals/operate/userguide/img/operate-incident-resolved_light.png new file mode 100644 index 00000000000..60f2c646491 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-incident-resolved_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-many-instances-with-incident_dark.png b/docs/product-manuals/operate/userguide/img/operate-many-instances-with-incident_dark.png new file mode 100644 index 00000000000..e6798672910 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-many-instances-with-incident_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-many-instances-with-incident_light.png b/docs/product-manuals/operate/userguide/img/operate-many-instances-with-incident_light.png new file mode 100644 index 00000000000..6c92963d64b Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-many-instances-with-incident_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-operations-panel_dark.png b/docs/product-manuals/operate/userguide/img/operate-operations-panel_dark.png new file mode 100644 index 00000000000..c58a77b6b9b Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-operations-panel_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-operations-panel_light.png b/docs/product-manuals/operate/userguide/img/operate-operations-panel_light.png new file mode 100644 index 00000000000..3a11e361e7c Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-operations-panel_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-select-operation_dark.png b/docs/product-manuals/operate/userguide/img/operate-select-operation_dark.png new file mode 100644 index 00000000000..b843211d1c5 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-select-operation_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-select-operation_light.png b/docs/product-manuals/operate/userguide/img/operate-select-operation_light.png new file mode 100644 index 00000000000..f3f4bc3d676 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-select-operation_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-detail_dark.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-detail_dark.png new file mode 100644 index 00000000000..947c96cfa6c Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-detail_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-detail_light.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-detail_light.png new file mode 100644 index 00000000000..f60ba824d0f Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-detail_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-edit-icon_dark.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-edit-icon_dark.png new file mode 100644 index 00000000000..6fc382a76cf Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-edit-icon_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-edit-icon_light.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-edit-icon_light.png new file mode 100644 index 00000000000..d2ed57bfde7 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-edit-icon_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-incident_dark.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-incident_dark.png new file mode 100644 index 00000000000..903377ae545 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-incident_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-incident_light.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-incident_light.png new file mode 100644 index 00000000000..75b49efaf1c Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-incident_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-save-var-edit_dark.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-save-var-edit_dark.png new file mode 100644 index 00000000000..5c8c38040a7 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-save-var-edit_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-instance-save-var-edit_light.png b/docs/product-manuals/operate/userguide/img/operate-view-instance-save-var-edit_light.png new file mode 100644 index 00000000000..08ac494c4d9 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-instance-save-var-edit_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-workflow-cancel_dark.png b/docs/product-manuals/operate/userguide/img/operate-view-workflow-cancel_dark.png new file mode 100644 index 00000000000..546bef44752 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-workflow-cancel_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-workflow-cancel_light.png b/docs/product-manuals/operate/userguide/img/operate-view-workflow-cancel_light.png new file mode 100644 index 00000000000..f7e2c5da999 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-workflow-cancel_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-workflow_dark.png b/docs/product-manuals/operate/userguide/img/operate-view-workflow_dark.png new file mode 100644 index 00000000000..626aed179d5 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-workflow_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-view-workflow_light.png b/docs/product-manuals/operate/userguide/img/operate-view-workflow_light.png new file mode 100644 index 00000000000..0e5a9e37c80 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-view-workflow_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-workflow-instance-id_dark.png b/docs/product-manuals/operate/userguide/img/operate-workflow-instance-id_dark.png new file mode 100644 index 00000000000..aff21c3827a Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-workflow-instance-id_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-workflow-instance-id_light.png b/docs/product-manuals/operate/userguide/img/operate-workflow-instance-id_light.png new file mode 100644 index 00000000000..0812d829133 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-workflow-instance-id_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-workflow-retry-incident_dark.png b/docs/product-manuals/operate/userguide/img/operate-workflow-retry-incident_dark.png new file mode 100644 index 00000000000..3b2e9a35ccc Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-workflow-retry-incident_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-workflow-retry-incident_light.png b/docs/product-manuals/operate/userguide/img/operate-workflow-retry-incident_light.png new file mode 100644 index 00000000000..4d1b2d04e3a Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-workflow-retry-incident_light.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-workflow-view-incident_dark.png b/docs/product-manuals/operate/userguide/img/operate-workflow-view-incident_dark.png new file mode 100644 index 00000000000..20596d806ae Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-workflow-view-incident_dark.png differ diff --git a/docs/product-manuals/operate/userguide/img/operate-workflow-view-incident_light.png b/docs/product-manuals/operate/userguide/img/operate-workflow-view-incident_light.png new file mode 100644 index 00000000000..4c2bf8b1338 Binary files /dev/null and b/docs/product-manuals/operate/userguide/img/operate-workflow-view-incident_light.png differ diff --git a/docs/product-manuals/operate/userguide/operate-feedback-and-questions.md b/docs/product-manuals/operate/userguide/operate-feedback-and-questions.md index 64e63f1c0de..1660b877336 100644 --- a/docs/product-manuals/operate/userguide/operate-feedback-and-questions.md +++ b/docs/product-manuals/operate/userguide/operate-feedback-and-questions.md @@ -1,6 +1,6 @@ --- id: operate-feedback-and-questions -title: Giving Feedback And Asking Questions +title: Giving feedback and asking questions --- If you have questions or feedback about Operate, the [Zeebe user forum](https://forum.zeebe.io) is the best way to get in touch with us. Please use the “Operate” tag when you create a post. diff --git a/docs/product-manuals/operate/userguide/resolve-incidents-update-variables.md b/docs/product-manuals/operate/userguide/resolve-incidents-update-variables.md index 7f51af309a8..2373939bbb9 100644 --- a/docs/product-manuals/operate/userguide/resolve-incidents-update-variables.md +++ b/docs/product-manuals/operate/userguide/resolve-incidents-update-variables.md @@ -1,6 +1,6 @@ --- id: resolve-incidents-update-variables -title: Variables & Incidents +title: Variables and incidents --- Every workflow instance created for the workflow model used in the Getting Started tutorial requires an `orderValue` so that the XOR gateway evaluation will happen properly. @@ -26,7 +26,7 @@ Let’s look at a case where `orderValue` is present but was set as a string, bu "orderValue\": \"99\"}' ``` -To advance the instance to our XOR gateway, we’ll quickly create a job worker to complete the “Initiate Payment” task: +To advance the instance to our XOR gateway, we’ll quickly create a job worker to complete the `Initiate Payment` task: **Linux** @@ -48,7 +48,7 @@ To advance the instance to our XOR gateway, we’ll quickly create a job worker ./bin/zbctl.exe --insecure create worker initiate-payment --handler "findstr .*" ``` -And we’ll publish a message that will be correlated with the instance so we can advance past the “Payment Received” Intermediate Message Catch Event: +And we’ll publish a message that will be correlated with the instance so we can advance past the `Payment Received` intermediate message catch event: **Linux** ``` @@ -69,33 +69,33 @@ And we’ll publish a message that will be correlated with the instance so we ca In the Operate interface, you should now see that the workflow instance has an incident, which means there’s a problem with workflow execution that needs to be fixed before the workflow instance can progress to the next step. -![operate-incident-workflow-view](./img/Operate-Workflow-View-Incident.png) +![operate-incident-workflow-view](./img/operate-workflow-view-incident_light.png) Operate provides tools for diagnosing and resolving incidents. Let’s go through incident diagnosis and resolution step-by-step. When we inspect the workflow instance, we can see exactly what our incident is: `Expected to evaluate condition 'orderValue>=100' successfully, but failed because: Cannot compare values of different types: STRING and INTEGER` -![operate-incident-instance-view](./img/Operate-View-Instance-Incident.png) +![operate-incident-instance-view](./img/operate-view-instance-incident_light.png) We have enough information to know that to resolve this incident, we need to edit the `orderValue` variable so that it’s an integer. To do so, first click on the edit icon next to the variable you’d like to edit. -![operate-incident-edit-variable](./img/Operate-View-Instance-Edit-Icon.png) +![operate-incident-edit-variable](./img/operate-view-instance-edit-icon_light.png) Next, edit the variable by removing the quotation marks from the `orderValue` value. Then click on the checkmark icon to save the change. We were able to solve this particular problem by _editing_ a variable, but it’s worth noting that you can also _add_ a variable if a variable is missing from a workflow instance altogether. -![operate-incident-save-variable-edit](./img/Operate-View-Instance-Save-Var-Edit.png) +![operate-incident-save-variable-edit](./img/operate-view-instance-save-var-edit_light.png) There’s one last step we need to take: initiating a “retry” of the workflow instance. There are two places on the workflow instance page where you can initiate a retry: -![operate-retry-instance](./img/Operate-Workflow-Retry-Incident.png) +![operate-retry-instance](./img/operate-workflow-retry-incident_light.png) You should now see that the incident has been resolved, and the workflow instance has progressed to the next step. Well done! -![operate-incident-resolved-instance-view](./img/Operate-Incident-Resolved.png) +![operate-incident-resolved-instance-view](./img/operate-incident-resolved_light.png) -If you’d like to complete the workflow instance, you can create a worker for the “Ship Without Insurance” task: +If you’d like to complete the workflow instance, you can create a worker for the `Ship Without Insurance` task: **Linux** @@ -114,3 +114,7 @@ If you’d like to complete the workflow instance, you can create a worker for t ``` ./bin/zbctl.exe --insecure create worker ship-without-insurance --handler "findstr .*" ``` + +The completed workflow instance with the path taken: + +![operate-incident-resolved-path-view](./img/operate-incident-resolved-path_light.png) \ No newline at end of file diff --git a/docs/product-manuals/operate/userguide/selections-operations.md b/docs/product-manuals/operate/userguide/selections-operations.md new file mode 100644 index 00000000000..d7fa9f0c842 --- /dev/null +++ b/docs/product-manuals/operate/userguide/selections-operations.md @@ -0,0 +1,25 @@ +--- +id: selections-operations +title: Selections and operations +--- + +In some cases, you’ll need to retry or cancel many workflow instances at once. Operate also supports this type of operation. + +Imagine a case where many workflow instances have an incident caused by the same issue. At some point, the underlying problem will have been resolved (for example, maybe a microservice was down for an extended period of time then was brought back up). + +But even though the underlying problem was resolved, the affected workflow instances are stuck until they are “retried”. + +![operate-batch-retry](./img/operate-many-instances-with-incident_light.png) + +Let's create a _selection_ in Operate. A selection is simply a set of workflow instances on which you can carry out a batch retry or batch cancellation. To create a selection, check the box next to the workflow instances you'd like to include, then click on the blue `Apply Operation on N Instances` button. + +![operate-batch-retry](img/operate-create-selection_light.png) + +Then select the operation you want to apply. + +![operate-batch-retry](./img/operate-select-operation_light.png) + +After confirmation you can see the _Operations_ panel with current status of all operations. + +![operate-batch-retry](./img/operate-operations-panel_light.png) + diff --git a/docs/product-manuals/overview.md b/docs/product-manuals/overview.md index d51184b4b04..296c14d907b 100644 --- a/docs/product-manuals/overview.md +++ b/docs/product-manuals/overview.md @@ -5,4 +5,14 @@ sidebar_label: Overview Product Manuals slug: /product-manuals/ --- -... +This section contains product manual content for each product in Camunda Cloud, including conceptual content. + +- [Concepts](concepts/what-is-camunda-cloud) - Conceptual documentation on a variety of Camunda Cloud topics. +- [Clients](clients/overview) - Supported clients for working with Camunda Cloud, including information on building your own. +- [Cloud Console](cloud-console/introduction) - More information on working with the Cloud Console. +- [Modeler](modeler/overview) - Documentation covering Camunda's modeling tools, including Cloud Modeler and Zeebe Modeler. +- [Zeebe Engine](zeebe/zeebe-overview) - Complete documentation for Zeebe. +- [Operate](operate/index.md) - User and deployment guide for Operate. +- [Tasklist](tasklist/deployment/configuration) - Deployment guide for Tasklist. + +While Camunda Cloud is cloud-first, applicable sections, like Zeebe Engine, include on-prem operation steps. \ No newline at end of file diff --git a/docs/product-manuals/tasklist/deployment/api-client.md b/docs/product-manuals/tasklist/deployment/api-client.md new file mode 100644 index 00000000000..296863d475f --- /dev/null +++ b/docs/product-manuals/tasklist/deployment/api-client.md @@ -0,0 +1,147 @@ +--- +id: api-client +title: API Client +--- + +## Endpoint + +Tasklist provides an GraphQL API at endpoint `/graphql`. + +## Authentication + +To access the API endpoint you need an access token. +Your client needs to send a header in each request: + +`Authorization: Bearer ` + +For example send a request by using *curl*: + +```shell +curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer " -d '{"query": "{tasks(query:{}){name}}"}' http://localhost:8080/graphql +``` +### How to obtain the access token + +You need to obtain a token for using the Tasklist API. When you create a Tasklist [client](../../../guides/getting-started/setup-client-connection-credentials.md) +you will get all the information you need to connect to Tasklist. + +See also [Build your own client](../../../product-manuals/clients/build-your-own-client.md) + +Following settings are needed: + +Name | Description | Default value +-----|-------------|-------------- +client id |Name of your registered client | - +client secret|Password for your registered client | - +audience | Permission name, if not given use default value| `tasklist.camunda.io` +authorization server url | Token issuer server | - + +You send a token issue POST request to the authorization server with the content: +```json +{ + "client_id": "", + "client_secret":"", + "audience":"", + "grant_type":"client_credentials" +} +``` + +An example with *curl*: + +```shell +curl -X POST --header 'content-type: application/json' --data '{"client_id": "", "client_secret":"","audience":"","grant_type":"client_credentials"}' https:// +``` + +If the authorization is successful, the authorization server sends back the access token, when it expires, scope and type: + +````json +{ + "access_token": "ey...", + "scope": "...", + "expires_in": 86400, + "token_type": "Bearer" +} +```` + +## Obtain GraphQL Schema + +To obtain the GraphQL schema you need to send a request to the endpoint with a GraphQL introspection query as described in https://graphql.org/learn/introspection/ + +or you use the [generated API documentation](../../../reference/tasklist-api/schema) + +There are also a lot of tools to explore GraphQL API's like this: https://altair.sirmuel.design + +For example you want to know all about provided types: +````graphql +query { + __schema { + queryType { + fields { + name + type { + kind + ofType { + kind + name + } + } + } + } + } +} +```` + +## Examples requests and responses + +### Get all tasks names +Request: +````graphql +{"query":"{ + tasks(query: {}) { + name + } + }" +} +```` +Response: +```json +{ + "data": { + "tasks": [ + { + "name": "Check payment" + }, + { + "name": "Register the passenger" + } + ] + } +} +``` + +### Get all tasks that are completed with id, name and state +Request: +```graphql +{ + "query" : "{ + tasks(query: { state: COMPLETED }) { + id + name + taskState + } + }" +} +``` +Response: +```json +{ + "data": { + "tasks": [ + { + "id": "2251799813685728", + "name": "Check payment", + "taskState": "COMPLETED" + } + ] + } +} +``` \ No newline at end of file diff --git a/docs/product-manuals/tasklist/deployment/configuration.md b/docs/product-manuals/tasklist/deployment/configuration.md index cead7331169..57a3714e42a 100644 --- a/docs/product-manuals/tasklist/deployment/configuration.md +++ b/docs/product-manuals/tasklist/deployment/configuration.md @@ -2,20 +2,50 @@ id: configuration title: Configuration --- -## Introduction Tasklist is a Spring Boot application. That means all ways to [configure](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config) a Spring Boot application can be applied. By default, the configuration for Tasklist is stored in a YAML file `application.yml`. All Tasklist related settings are prefixed with `zeebe.tasklist`. The following parts are configurable: - * [Elasticsearch Connection](#elasticsearch) - * [Zeebe Broker connection](#zeebe-broker-connection) - * [Zeebe Elasticsearch Exporter](#zeebe-elasticsearch-exporter) - * [Authentication](authentication.md) - * [Monitoring and health probes](#monitoring-and-health-probes) - * [Logging configuration](#logging) +* [Webserver](#webserver) +* [GraphQL API access](#graphql-api-access) +* [Elasticsearch connection](#elasticsearch) +* [Zeebe Broker connection](#zeebe-broker-connection) +* [Zeebe Elasticsearch exporter](#zeebe-elasticsearch-exporter) +* [Authentication](authentication.md) +* [Monitoring and health probes](#monitoring-and-health-probes) +* [Logging configuration](#logging) -## Configurations +## Webserver + +Tasklist supports customizing the *context-path* by using default spring configuration. + +Example for `application.yml`: +`server.servlet.context-path: /tasklist` + +Example for environment variable: +`SERVER_SERVLET_CONTEXT_PATH=/tasklist` + +Default context-path is `/` + +## GraphQL API access + +Tasklist provides a GraphQL API under the endpoint `/graphql`. Clients can access this API by using a JWT access token in an authorization header `Authorization: Bearer `. + +Tasklist server needs the following **settings** to validate the token: + +Setting|Description|Example +-------|------------|-------- +zeebe.tasklist.client.audience| Tasklist tries to match this with `aud` in JWT | tasklist.camunda.io +zeebe.tasklist.client.clusterId| Tasklist tries to match this with `scope` in JWT| cafe-0815-0235-a221-21cc6df91dc5 +spring.security.oauth2.resourceserver.jwt.jwk-set-uri (recommended) | Complete URI to get public keys for JWT validation | https://weblogin.cloud.company.com/.well-known/jwks.json +*OR* | | +spring.security.oauth2.resourceserver.jwt.issuer-uri| URI to get public keys for JWT validation| https://weblogin.cloud.company.com/ + +The settings can be given in [application.yml](https://github.com/zeebe-io/zeebe-tasklist/blob/master/config/application.yml) (eg. `zeebe.tasklist.client.audience: tasklist.camunda.io`) or +as environment variables (eg. `ZEEBE_TASKLIST_CLIENT_AUDIENCE=tasklist.camunda.io`) + +The [API client](api-client.md) needs to obtain JWT token and send it in each request to `graphql` in an authorization header as described above. ## Elasticsearch @@ -45,8 +75,8 @@ Name|Description|Default value zeebe.tasklist.elasticsearch.numberOfShards| How many shards Elasticsearch uses for all Tasklist indices| 1 zeebe.tasklist.elasticsearch.numberOfReplicas| How many replicas Elasticsearch uses for all Tasklist indices| 0 -These values are applied only on first startup of Tasklist or during version upgrade. After Tasklist -ELS schema is created, settings may be adjusted directly in ELS template and the new settings will be applied +These values are applied only on first startup of Tasklist or during version upgrade. After Tasklist +ELS schema is created, settings may be adjusted directly in ELS template and the new settings will be applied to indices created after adjustment. ### A snippet from application.yml: @@ -60,7 +90,7 @@ zeebe.tasklist: url: http://localhost:9200 ``` -## Zeebe Broker Connection +## Zeebe broker connection Tasklist needs a connection to Zeebe Broker to start the import. @@ -79,7 +109,7 @@ zeebe.tasklist: brokerContactPoint: localhost:26500 ``` -## Zeebe Elasticsearch Exporter +## Zeebe Elasticsearch exporter Tasklist imports data from Elasticsearch indices created and filled in by [Zeebe Elasticsearch Exporter](https://github.com/zeebe-io/zeebe/tree/develop/exporters/elasticsearch-exporter). Therefore settings for this Elasticsearch connection must be defined and must correspond to the settings on Zeebe side. @@ -89,6 +119,7 @@ Therefore settings for this Elasticsearch connection must be defined and must co Name | Description | Default value -----|-------------|-------------- zeebe.tasklist.zeebeElasticsearch.clusterName | Cluster name of Elasticsearch | elasticsearch +zeebe.tasklist.zeebeElasticsearch.url | URL of Elasticsearch REST API | http://localhost:9200 zeebe.tasklist.zeebeElasticsearch.host | Hostname where Elasticsearch is running | localhost zeebe.tasklist.zeebeElasticsearch.port | Port of Elasticsearch REST API | 9200 zeebe.tasklist.zeebeElasticsearch.prefix | Index prefix as configured in Zeebe Elasticsearch exporter | zeebe-record @@ -102,10 +133,8 @@ zeebe.tasklist: zeebeElasticsearch: # Cluster name clusterName: elasticsearch - # Host - host: localhost - # Transport port - port: 9200 + # Url + url: localhost:9200 # Index prefix, configured in Zeebe Elasticsearch exporter prefix: zeebe-record ``` @@ -188,7 +217,7 @@ that can be further adjusted to your needs: By default, Console log appender will be used. -#### JSON logging configuration +### JSON logging configuration You can choose to output logs in JSON format (Stackdriver compatible). To enable it, define the environment variable ```TASKLIST_LOG_APPENDER``` like this: @@ -200,7 +229,7 @@ TASKLIST_LOG_APPENDER=Stackdriver ## An example of application.yml file The following snippet represents the default Tasklist configuration, which is shipped with the distribution. It can be found inside the `config` folder (`config/application.yml`) - and can be used to adjust Tasklist to your needs. +and can be used to adjust Tasklist to your needs. ```yaml # Tasklist configuration file @@ -233,4 +262,4 @@ zeebe.tasklist: port: 9200 # Index prefix, configured in Zeebe Elasticsearch exporter prefix: zeebe-record -``` \ No newline at end of file +``` diff --git a/docs/product-manuals/tasklist/deployment/install-and-start.md b/docs/product-manuals/tasklist/deployment/install-and-start.md new file mode 100644 index 00000000000..5c7fbe48b60 --- /dev/null +++ b/docs/product-manuals/tasklist/deployment/install-and-start.md @@ -0,0 +1,100 @@ +--- +id: install-and-start +title: Install and start Tasklist +--- +## Running via Docker (local development) + +You can use the Docker image `camunda/zeebe-tasklist:latest` to run Tasklist as container. + +Please make sure to set appropriate settings described in [configuration](../deployment/configuration) section of deployment guide. +Here an example configuration for `docker-compose`: +``` +zeebe-tasklist: + container_name: zeebe-tasklist + image: camunda/zeebe-tasklist:latest + ports: + - 8080:8080 + environment: + - zeebe.tasklist.elasticsearch.url=http://elasticsearch:9200 + - zeebe.tasklist.zeebeElasticsearch.url=http://elasticsearch:9200 + - zeebe.tasklist.zeebe.brokerContactPoint=zeebe:26500 +``` +## Manual configuration (local development) + +Here, we’ll walk you through how to download and run a Tasklist distribution manually, without using Docker. + +Note that the Tasklist web UI is available by default at [http://localhost:8080](http://localhost:8080), so please be sure this port is available. + +### Download Tasklist and a compatible version of Zeebe. + +[Tasklist and Zeebe distributions are available for download on the same release page. ](https://github.com/zeebe-io/zeebe/releases) + +Note that each version of Tasklist is compatible with a specific version of Zeebe. + +On the Zeebe release page, compatible versions of Zeebe and Tasklist are grouped together. Please be sure to download and use compatible versions. This is handled for you if you use the Docker profile from our repository. + +### Download Elasticsearch + +Tasklist uses open-source Elasticsearch as its underlying data store, and so to run Tasklist, you need to download and run Elasticsearch. + +Tasklist is currently compatible to Elasticsearch 6.8.13. [You can download Elasticsearch here.](https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-13) + +### Run Elasticsearch + +To run Elasticsearch, execute the following commands in Terminal or another command line tool of your choice: + +``` +cd elasticsearch-* +bin/elasticearch +``` + +You’ll know Elasticsearch has started successfully when you see a message similar to: + +``` +[INFO ][o.e.l.LicenseService ] [-IbqP-o] license [72038058-e8ae-4c71-81a1-e9727f2b81c7] mode [basic] - valid +``` + +### Run Zeebe + +To run Zeebe with Elasticsearch Exporter, execute the following commands: + +``` +cd zeebe-broker-* +ZEEBE_BROKER_EXPORTERS_ELASTICSEARCH_CLASSNAME=io.zeebe.exporter.ElasticsearchExporter ./bin/broker +``` + + +You’ll know Zeebe has started successfully when you see a message similar to: + + +``` +[partition-0] [0.0.0.0:26501-zb-actors-0] INFO io.zeebe.raft - Joined raft in term 0 +[exporter] [0.0.0.0:26501-zb-actors-1] INFO io.zeebe.broker.exporter.elasticsearch - Exporter opened +``` + +### Run Tasklist + +To run Tasklist, execute the following commands: + +``` +cd zeebe-tasklist* +./bin/tasklist +``` + +You’ll know Tasklist has started successfully when you see messages similar to: + +``` +2020-12-09 13:31:41.437 INFO 45899 --- [ main] i.z.t.ImportModuleConfiguration : Starting module: importer +2020-12-09 13:31:41.438 INFO 45899 --- [ main] i.z.t.ArchiverModuleConfiguration : Starting module: archiver +2020-12-09 13:31:41.555 INFO 45899 --- [ main] i.z.t.w.StartupBean : Tasklist Version: 0.26.0-alpha2 +``` + +## Access the Tasklist web interface + +The Tasklist web interface is available at [http://localhost:8080](http://localhost:8080). + +The first screen you'll see is a sign-in page. Use the credentials `demo` / `demo` to sign in. + +If you already have some user tasks in Zeebe you can see these on the left panel in the start screen: + +![tasklist-start-screen](../img/tasklist-start-screen_light.png) diff --git a/docs/product-manuals/tasklist/img/tasklist-introduction_light.png b/docs/product-manuals/tasklist/img/tasklist-introduction_light.png new file mode 100644 index 00000000000..5ea44549351 Binary files /dev/null and b/docs/product-manuals/tasklist/img/tasklist-introduction_light.png differ diff --git a/docs/product-manuals/tasklist/img/tasklist-start-screen_light.png b/docs/product-manuals/tasklist/img/tasklist-start-screen_light.png new file mode 100644 index 00000000000..680c6b59aa5 Binary files /dev/null and b/docs/product-manuals/tasklist/img/tasklist-start-screen_light.png differ diff --git a/docs/product-manuals/tasklist/introduction.md b/docs/product-manuals/tasklist/introduction.md new file mode 100644 index 00000000000..9fa0137bd57 --- /dev/null +++ b/docs/product-manuals/tasklist/introduction.md @@ -0,0 +1,31 @@ +--- +id: introduction +title: Introduction +--- + +Tasklist is a tool for working with [User Tasks](https://docs.camunda.org/manual/7.8/reference/bpmn20/tasks/user-task/) in Zeebe. +You can filter, claim and complete user tasks. + + + + +![tasklist-introduction](img/tasklist-introduction_light.png) + +In the [Tasklist User Guide](userguide/overview) you can find out how to filter, claim and complete Usertasks + +In the [Tasklist Deployment Guide](deployment/install-and-start) you can walk through how to install and run Operate. + +Tasklist is also available for production use (with support) in the Camunda Cloud offering. +If you'd like try out Tasklist in the Camunda Cloud, [please sign up here.](https://accounts.cloud.camunda.io/signup) + + \ No newline at end of file diff --git a/docs/product-manuals/tasklist/userguide/img/tasklist-claim_light.png b/docs/product-manuals/tasklist/userguide/img/tasklist-claim_light.png new file mode 100644 index 00000000000..08e01004c48 Binary files /dev/null and b/docs/product-manuals/tasklist/userguide/img/tasklist-claim_light.png differ diff --git a/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me-empty_light.png b/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me-empty_light.png new file mode 100644 index 00000000000..5f88f2c636d Binary files /dev/null and b/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me-empty_light.png differ diff --git a/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me-list_light.png b/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me-list_light.png new file mode 100644 index 00000000000..f300eb36047 Binary files /dev/null and b/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me-list_light.png differ diff --git a/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me_light.png b/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me_light.png new file mode 100644 index 00000000000..2de8150eedb Binary files /dev/null and b/docs/product-manuals/tasklist/userguide/img/tasklist-claimed-by-me_light.png differ diff --git a/docs/product-manuals/tasklist/userguide/img/tasklist-complete-task_light.png b/docs/product-manuals/tasklist/userguide/img/tasklist-complete-task_light.png new file mode 100644 index 00000000000..db646c89d19 Binary files /dev/null and b/docs/product-manuals/tasklist/userguide/img/tasklist-complete-task_light.png differ diff --git a/docs/product-manuals/tasklist/userguide/img/tasklist-task-completed_light.png b/docs/product-manuals/tasklist/userguide/img/tasklist-task-completed_light.png new file mode 100644 index 00000000000..b8362420ac6 Binary files /dev/null and b/docs/product-manuals/tasklist/userguide/img/tasklist-task-completed_light.png differ diff --git a/docs/product-manuals/tasklist/userguide/overview.md b/docs/product-manuals/tasklist/userguide/overview.md new file mode 100644 index 00000000000..3f424612d80 --- /dev/null +++ b/docs/product-manuals/tasklist/userguide/overview.md @@ -0,0 +1,58 @@ +--- +id: overview +title: Overview and example use case +--- + +## What can I do with Tasklist? +Tasklist shows you all user tasks that appeared in processes. Those processes are running in Zeebe. + +User tasks needs an interaction from the user - that can be updating and adding variables or just completion of the task. The user needs to claim a task first, a user can even unclaim an already claimed task. +If the user has claimed a task, then the task is completable. Different Task status filters helps the user +to choose the desired task. + +## Example use case +If you have successfully logged in you can see a screen like this: + +![tasklist-start-screen](../img/tasklist-start-screen_light.png) + +On the left side you can see tasks and on the right side details of the current selected task. +You can change the list of tasks by applying filters. You can collapse and expand the task list. + +You can choose which tasks you want to see: + +* All open +* Claimed by me +* Unclaimed +* Completed + +At the begin we have no **Claimed by me** tasks. + +### Claimed by me tasks +![tasklist-claimed-by-me-empty](img/tasklist-claimed-by-me-empty_light.png) + +We select the **Unclaimed** list and claim a task by using the **Claim** button on the details panel: + +### Claim a task +![tasklist-claim](img/tasklist-claim_light.png) + +Now select the **Claimed by me** list to see whether you have the task claimed: + +![tasklist-claimed-by-me-list](img/tasklist-claimed-by-me-list_light.png) + +### Complete a task +Only then you can complete the task by adding and updating variables and finally using the **Complete Task** button: + +![tasklist-claimed-by-me](img/tasklist-claimed-by-me_light.png) + +You always choose a list of tasks with a specified status and then select the task you want to work on. + +Now we complete the task and check if it will be shown in **Completed** list. +Change and variables as needed and start the completion with **Complete Task**. + +#### Add and update variables +![tasklist-complete-task](img/tasklist-complete-task_light.png) + +### Completed tasks +If everything went fine you can see the completed task by selecting the **Completed** task list: + +![tasklist-task-completed](img/tasklist-task-completed_light.png) \ No newline at end of file diff --git a/docs/product-manuals/zeebe/deployment-guide/configuration/configuration.md b/docs/product-manuals/zeebe/deployment-guide/configuration/configuration.md new file mode 100644 index 00000000000..f76e97e7644 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/configuration/configuration.md @@ -0,0 +1,182 @@ +--- +id: configuration +title: "Configuration" +sidebar_label: "Overview" +--- + +Zeebe can be configured through: + +- configuration files, +- environment variables, +- or a mix of both. + +If both configuration files and environment variables are present, then environment variables overwrite settings in configuration files. + +If you want to make small changes to the configuration, we recommend to use environment variables. +If you want to make big changes to the configuration, we recommend to use a configuration file. + +The configuration will be applied during startup of Zeebe. It is not possible to change the configuration at runtime. + +## Default configuration + +The default configuration is located in `config/application.yaml`. This configuration contains the most common configuration settings for a standalone broker. It also lists the corresponding environment variable for each setting. + +> **Note** +> +> The default configuration is not suitable for a standalone gateway node. If you want to run a standalone gateway node, please have a look at `/config/gateway.yaml.template` + +## Configuration file templates + +We provide templates that contain all possible configuration settings, along with explanations for each setting: + +- [`config/application.yaml` Standalone Broker (with embedded gateway)](https://github.com/zeebe-io/zeebe/tree/develop/dist/src/main/config/application.yaml) - Default configuration containing only the most common configuration settings. Use this as the basis for a single broker deployment for test or development +- [`config/broker.standalone.yaml.template` Standalone Broker (with embedded gateway)](https://github.com/zeebe-io/zeebe/tree/develop/dist/src/main/config/broker.standalone.yaml.template) - Complete configuration template for a standalone broker with embedded gateway. Use this as the basis for a single broker deployment for test or development +- [`config/broker.yaml.template` Broker Node (without embedded gateway)](https://github.com/zeebe-io/zeebe/tree/develop/dist/src/main/config/broker.yaml.template) - Complete configuration template for a broker node without embedded gateway. Use this as the basis for deploying multiple broker nodes as part of a cluster +- [`config/gateway.yaml.template`](https://github.com/zeebe-io/zeebe/tree/develop/dist/src/main/config/gateway.yaml.template) - Complete configuration template for a standalone gateway. + +Note that these templates also include the corresponding environment variables to use for every setting. + +## Editing the configuration + +You can either start from scratch or start from the configuration templates listed above. + +If you use a configuration template and want to uncomment certain lines, make sure to also uncomment their parent elements: + +```yaml +Valid Configuration + + zeebe: + gateway: + network: + # host: 0.0.0.0 + port: 26500 + +Invalid configuration + + # zeebe: + # gateway: + # network: + # host: 0.0.0.0 + port: 26500 +``` + +Uncommenting individual lines is a bit finicky, because YAML is sensitive to indentation. The best way to do it is to position the cursor before the `#` character and delete two characters (the dash and the space). Doing this consistently will give you a valid YAML file. + +When it comes to editing individual settings two data types are worth mentioning: + +- Data size (e.g. `logSegmentSize`) + - Human friendly format: `500MB` (or `KB, GB`) + - Machine friendly format: size in bytes as long +- Timeouts/intervals (e.g. `requestTimeout`) + - Human friendly format: `15s` (or `m, h`) + - Machine friendly format: either duration in milliseconds as long, or [ISO-8601 duration](ttps://en.wikipedia.org/wiki/ISO_8601#Durations) format (e.g. `PT15S`) + +## Passing configuration files to Zeebe + +Rename the configuration file to `application.yaml` and place it in the following location: + +```shell script +./config/application.yaml +``` + +### Other ways to specify the configuration file + +Zeebe uses Spring Boot for its configuration parsing. So all other ways to [configure a Spring Boot application](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config) should also work. In particular, +you can use: + +- `SPRING_CONFIG_ADDITIONAL_LOCATION` to specify an additional configuration file. +- `SPRING_APPLICATION_JSON` to specify settings in JSON format. + +Details can be found in the Spring documentation. + +> **Note** +> +> We recommend not to use `SPRING_CONFIG_LOCATION` as this will replace all existing configuration defaults. +> When used inappropriately, some features will be disabled or will not be configured properly. +> +> If you specify `SPRING_CONFIG_LOCATION`, then specify it like this: +> +> ```shell script +> export SPRING_CONFIG_LOCATION='classpath:/,file:./[path to config file]' +> ``` +> +> This will ensure that the defaults defined in the classpath resources will be used (unless explicitly overwritten by the configuration file you provide). If you omit the defaults defined in the classpath, some features may be disabled or will not be configured properly. + +## Verifying configuration + +To verify that the configuration was applied, start Zeebe and look at the log. + +If the configuration could be read, Zeebe will log out the effective configuration during startup: + +``` +17:13:13.120 [] [main] INFO io.zeebe.broker.system - Starting broker 0 with configuration { + "network": { + "host": "0.0.0.0", + "portOffset": 0, + "maxMessageSize": { + "bytes": 4194304 + }, + "commandApi": { + "defaultPort": 26501, + "host": "0.0.0.0", + "port": 26501, +... +``` + +In some cases of invalid configuration Zeebe will fail to start with a warning that explains which configuration setting could not be read. + +``` +17:17:38.796 [] [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Failed to bind properties under 'zeebe.broker.network.port-offset' to int: + + Property: zeebe.broker.network.port-offset + Value: false + Origin: System Environment Property "ZEEBE_BROKER_NETWORK_PORTOFFSET" + Reason: failed to convert java.lang.String to int + +Action: + +Update your application's configuration +``` + +## Logging + +Zeebe uses Log4j2 framework for logging. In the distribution and the docker image you can find the default log configuration file in `config/log4j2.xml`. + +### Google Stackdriver (JSON) logging + +To enable Google Stackdriver compatible JSON logging you can set the environment variable `ZEEBE_LOG_APPENDER=Stackdriver` before starting Zeebe. + +### Default logging configuration + +- `config/log4j2.xml` (applied by default) + +``` +{{#include ../../../dist/src/main/config/log4j2.xml}} +``` + +### Change log level dynamically + +Zeebe brokers expose a [Spring Boot Actuators web endpoint](https://docs.spring.io/spring-boot/docs/current/actuator-api/html/#loggers) +for configuring loggers dynamically. +To change the log level of a logger make a `POST` request to the `/actuator/loggers/{logger.name}` endpoint as shown in the example below. +Change `io.zeebe` to the required logger name and `debug` to required log level. + +``` +curl 'http://localhost:9600/actuator/loggers/io.zeebe' -i -X POST -H 'Content-Type: application/json' -d '{"configuredLevel":"debug"}' +``` + +## Health probes + +Health probes are set to sensible defaults which cover common use cases. + +For specific use cases, it might be necessary to customize health probes: + +- [Gateway health probes](gateway-health-probes.md) diff --git a/docs/product-manuals/zeebe/deployment-guide/configuration/environment-variables.md b/docs/product-manuals/zeebe/deployment-guide/configuration/environment-variables.md new file mode 100644 index 00000000000..4d2d3e9ac83 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/configuration/environment-variables.md @@ -0,0 +1,26 @@ +--- +id: environment-variables +title: "Environment variables" +--- + +## Environment variables for configuration + +The configuration can be provided as a file or through environment variables. Mixing both sources is also possible. In that case environment variables have precedence over the configuration settings in the configuration file. + +All available environment variables are documented in the [configuration file templates](configuration/#configuration-file-templates). + +## Environment variables for operators + +The following environment variables are intended for operators: + +- `ZEEBE_LOG_LEVEL`: Sets the log level of the Zeebe Logger (default: `info`). +- `ZEEBE_LOG_APPENDER`: Sets the console log appender (default: `Console`). We recommend using `Stackdriver` if Zeebe runs on Google Cloud Platform to output JSON formatted log messages + +## Environment variables for developers + +The following environment variables are intended for developers: + +- `SPRING_PROFILES_ACTIVE=dev`: If this is set, the broker will start in a temporary folder and all data will be cleaned up upon exit +- `ZEEBE_DEBUG=true/false`: Activates a `DebugLogExporter` with default settings. The value of the environment variable toggles pretty printing + +> Note: It is not recommended to use these settings in production. diff --git a/docs/product-manuals/zeebe/deployment-guide/configuration/gateway-health-probes.md b/docs/product-manuals/zeebe/deployment-guide/configuration/gateway-health-probes.md new file mode 100644 index 00000000000..23f51996d10 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/configuration/gateway-health-probes.md @@ -0,0 +1,114 @@ +--- +id: gateway-health-probes +title: "Gateway health probes" +--- + +The health status for a standalone gateway is available at `{zeebe-gateway}:8080/actuator/health` + +The following health indicators are enabled by default + +- **Gateway Started** - checks whether the gateway is running (i.e. not currently starting and not yet shut down) +- **Gateway Responsive** - checks whether the gateway can handle a request within a given timeout +- **Gateway Cluster Awareness** - checks whether the gateway is aware of other nodes in the cluster +- **Gateway Partition Leader Awareness** - checks whether the gateway is aware of partition leaders in the cluster +- **Disk Space** - checks that the free disk space is greater than 10 MB +- **Memory** - checks that at least 10% of max memory (heap) are still available + +Health indicators are set to sensible defaults. For specific use cases, it might be necessary to customize health probes. + +## Startup probe + +The started probe is available at `{zeebe-gateway}:8080/actuator/health/startup` + +In the default configuration this is merely an alias for the **Gateway Started** health indicator. Other configurations are possible (see below). + +## Liveness probe + +The liveness probe is available at `{zeebe-gateway}:8080/actuator/health/liveness` + +It is based on the health indicators mentioned above. + +In the default configuration, the liveness probe is comprised of the following health indiactors: + +- **Gateway Started** - checks whether the gateway is running (i.e. not currently starting and not yet shut down) +- **Liveness Gateway Responsive** - checks whether the gateway can handle a request within an ample timeout, but will only report a `DOWN` health status after the underlying health indicator is down for more than 10 minutes +- **Liveness Gateway Cluster Awareness** - based on gateway cluster awareness, but will only report a `DOWN` health status after the underlying health indicator is down for more than 5 minutes +- **Liveness Gateway Partition Leader Awareness** - based on gateway partition leader awareness, but will only report a `DOWN` health status after the underlying health indicator is down for more than 5 minutes +- **Liveness Disk Space** - checks that the free disk space is greater than 1 MB +- **Liveness Memory** - checks that at least 1% of max memory (heap) are still available + +Note that health indicators with the _liveness_ prefix are intended to be customized for the liveness probe. This allows defining tighter thresholds (e.g. for free memory 1% for liveness vs. 10% for health), as well as adding tolerance for short downtimes (e.g. gateway has no awareness of other nodes in the cluster for more than 5 minutes). + +## Customizing health probes + +Global settings for all health indicators: + +- `management.health.defaults.enabled=true` - enables (default) or disables all health indicators +- `management.endpoint.health.show-details=always/never` - toggles whether a summary or details (default) of the health indicators will be returned + +### Startup probe + +Settings for started probe: + +- `management.endpoint.health.group.startup.show-details=never` - toggles whether a summary (default) or details of the startup probe will be returned +- `management.endpoint.health.group.startup.include=gatewayStarted` - defines which health indicators are included in the startup probe + +### Liveness probe + +Settings for liveness probe: + +- `management.endpoint.health.group.liveness.show-details=never` - toggles whether a summary (default) or details of the liveness probe will be returned +- `management.endpoint.health.group.liveness.include=gatewayStarted,livenessGatewayResponsive,livenessGatewayClusterAwareness,livenessGatewayPartitionLeaderAwareness,livenessDiskSpace,livenessMemory` - defines which health indicators are included in the liveness probe + +Note that the individual contributing health indicators of the liveness probe can be configured as well (see below). + +### Gateway started + +Settings for gateway started health indicator: + +- `management.health.gateway-started.enabled=true` - enables (default) or disables this health indicator + +### Gateway responsive + +Settings for gateway responsiveness health indicator: + +- `management.health.gateway-responsive.enabled=true` - enables (default) or disables this health indicator +- `management.health.gateway-responsive.requestTimeout=500ms` - defines the timeout for the request; if the test completes before the timeout, the health status is `UP`, otherwise it is `DOWN` +- `management.health.liveness.gateway-responsive.requestTimeout=5s` - defines the timeout for the request for liveness probe; if the request completes before the timeout, the health status is `UP` +- `management.health.liveness.gateway-responsive.maxdowntime=10m` - - defines the maximum downtime before the liveness health indicator for responsiveness will flip + +### Gateway cluster awareness + +Settings for gateway cluster awareness health indicator: + +- `management.health.gateway-clusterawareness.enabled=true` - enables (default) or disables this health indicator (and its liveness counterpart) +- `management.health.liveness.gateway-clusterawareness.maxdowntime=5m` - defines the maximum downtime before the liveness health indicator for cluster awareness will flip. In other words: this health indicator will report `DOWN` after the gateway was unaware of other members in the cluster for more than 5 minutes + +### Gateway partition leader awareness + +Settings for gateway partition leader awareness health indicator: + +- `management.health.gateway-partitionleaderawareness.enabled=true` - enables (default) or disables this health indicator (and its liveness counterpart) +- `management.health.liveness.gateway-partitionleaderawareness.maxdowntime=5m` - defines the maximum downtime before the liveness health indicator for partition leader awareness will flip. In other words: this health indicator will report `DOWN` after the gateway was unaware of partition leaders for more than 5 minutes + +### Disk space + +This is arguably the least critical health indicator given that the standalone gateway does not write to disk. The only exception may be the writing of log files, which depend on the log configuration. + +Settings for disk space health indicator: + +- `management.health.diskspace.enabled=true` - enables (default) or disables this health indicator (and its liveness counterpart) +- `management.health.diskspace.threshold=10MB` - defines the threshold for the required free disk space +- `management.health.diskspace.path=.` - defines the path for which the free disk space is examined +- `management.health.liveness.diskspace.threshold=1MB` - defines the threshold for the required free disk space for liveness +- `management.health.liveness.diskspace.path=.` - defines the path for which the free disk space for liveness is examined + +### Memory + +This health indicator examines free memory (heap). + +Settings for memory health indicator: + +- `management.health.memory.enabled=true` - enables (default) or disables this health indicator (and its liveness counterpart) +- `management.health.memory.threshold=0.1` - defines the threshold for the required free memory. The default is 0.1 which is interpreted as 10% of max memory +- `management.health.liveness.memory.threshold=0.01` - defines the threshold for the required free memory for liveness. The default is 0.01 which is interpreted as 10 of max memory diff --git a/docs/product-manuals/zeebe/deployment-guide/configuration/logging.md b/docs/product-manuals/zeebe/deployment-guide/configuration/logging.md new file mode 100644 index 00000000000..e28b0d91789 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/configuration/logging.md @@ -0,0 +1,75 @@ +--- +id: logging +title: "Logging" +--- + +Zeebe uses Log4j2 framework for logging. In the distribution and the docker image you can find the default log configuration file in `config/log4j2.xml`. + +## Google Stackdriver (JSON) logging + +To enable Google Stackdriver compatible JSON logging you can set the environment variable `ZEEBE_LOG_APPENDER=Stackdriver` before starting Zeebe. + +## Default logging configuration + +- `config/log4j2.xml` (applied by default) + +```xml + + + + + ${sys:app.home}/logs + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{actor-name}] [%t] %-5level %logger{36} - %msg%n + ${env:ZEEBE_LOG_STACKDRIVER_SERVICENAME:-} + ${env:ZEEBE_LOG_STACKDRIVER_SERVICEVERSION:-} + + + + + + + + + + + + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + +``` + +## Change log level dynamically + +Zeebe brokers expose a [Spring Boot Actuators web endpoint](https://docs.spring.io/spring-boot/docs/current/actuator-api/html/#loggers) +for configuring loggers dynamically. +To change the log level of a logger make a `POST` request to the `/actuator/loggers/{logger.name}` endpoint as shown in the example below. +Change `io.zeebe` to the required logger name and `debug` to required log level. + +``` +curl 'http://localhost:9600/actuator/loggers/io.zeebe' -i -X POST -H 'Content-Type: application/json' -d '{"configuredLevel":"debug"}' +``` diff --git a/docs/product-manuals/zeebe/deployment-guide/docker/install.md b/docs/product-manuals/zeebe/deployment-guide/docker/install.md new file mode 100644 index 00000000000..05adb64342c --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/docker/install.md @@ -0,0 +1,148 @@ +--- +id: install +title: "Docker container" +--- + +This page guides you through the initial installation of the Zeebe broker and Zeebe Modeler for development purposes. + +## Using Docker + +The easiest way to develop with Zeebe is using Docker. Using Docker provides you with a consistent environment, and we recommend it for development. + +### Prerequisites + +- Operating System: + - Linux + - Windows/MacOS (development only, not supported for production) +- Docker + +### Docker configurations for docker-compose + +Docker configurations for starting Zeebe using `docker-compose` are available in the [zeebe-docker-compose](https://github.com/zeebe-io/zeebe-docker-compose/blob/master/README.md) repository. + +This repository contains several pre-defined configuration options: + +- Single node +- Small cluster with and without gateway +- Single node with Operate +- Single node with simple monitor + +This allows you to start using complex configurations with a single command. Later you can tailor these configurations to your needs, when you are ready to delve to that level. + +Further instructions for using these configurations are in the [README](https://github.com/zeebe-io/zeebe-docker-compose/blob/master/README.md). + +### Using Docker without docker-compose + +You can run Zeebe with Docker: + +```bash +docker run --name zeebe -p 26500-26502:26500-26502 camunda/zeebe:latest +``` + +This will give you a a single broker node. + +#### Exposed ports + +- `26500`: Gateway API +- `26501`: Command API (gateway-to-broker) +- `26502`: Internal API (broker-to-broker) + +#### Volumes + +The default data volume is under `/usr/local/zeebe/data`. It contains +all data which should be persisted. + +#### Configuration + +The Zeebe configuration is located at `/usr/local/zeebe/config/application.yaml`. +The logging configuration is located at `/usr/local/zeebe/config/log4j2.xml`. + +The configuration of the docker image can also be changed by using environment +variables. The configuration template files also contains information on the environment +variables to use for each configuration setting. + +Available environment variables: + +- `ZEEBE_LOG_LEVEL` - sets the log level of the Zeebe Logger (default: `info`). +- `ZEEBE_BROKER_NETWORK_HOST` - sets the host address to bind to instead of the IP of the container. +- `ZEEBE_BROKER_CLUSTER_INITIALCONTACTPOINTS` - sets the contact points of other brokers in a cluster setup. + +### Mac and Windows users + +**Note**: On systems which use a VM to run Docker containers like Mac and +Windows, the VM needs at least 4GB of memory, otherwise Zeebe might fail to start +with an error similar to: + +``` +Exception in thread "actor-runner-service-container" java.lang.OutOfMemoryError: Direct buffer memory + at java.nio.Bits.reserveMemory(Bits.java:694) + at java.nio.DirectByteBuffer.(DirectByteBuffer.java:123) + at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) + at io.zeebe.util.allocation.DirectBufferAllocator.allocate(DirectBufferAllocator.java:28) + at io.zeebe.util.allocation.BufferAllocators.allocateDirect(BufferAllocators.java:26) + at io.zeebe.dispatcher.DispatcherBuilder.initAllocatedBuffer(DispatcherBuilder.java:266) + at io.zeebe.dispatcher.DispatcherBuilder.build(DispatcherBuilder.java:198) + at io.zeebe.broker.services.DispatcherService.start(DispatcherService.java:61) + at io.zeebe.servicecontainer.impl.ServiceController$InvokeStartState.doWork(ServiceController.java:269) + at io.zeebe.servicecontainer.impl.ServiceController.doWork(ServiceController.java:138) + at io.zeebe.servicecontainer.impl.ServiceContainerImpl.doWork(ServiceContainerImpl.java:110) + at io.zeebe.util.actor.ActorRunner.tryRunActor(ActorRunner.java:165) + at io.zeebe.util.actor.ActorRunner.runActor(ActorRunner.java:145) + at io.zeebe.util.actor.ActorRunner.doWork(ActorRunner.java:114) + at io.zeebe.util.actor.ActorRunner.run(ActorRunner.java:71) + at java.lang.Thread.run(Thread.java:748) +``` + +If you are using Docker with the default Moby VM, you can adjust the amount of memory available to the VM through the Docker preferences. Right-click on the Docker icon in the System Tray to access preferences. + +If you use a Docker setup with `docker-machine` and your `default` VM does +not have 4GB of memory, you can create a new one with the following command: + +``` +docker-machine create --driver virtualbox --virtualbox-memory 4000 zeebe +``` + +Verify that the Docker Machine is running correctly: + +``` +docker-machine ls +``` + +``` +NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS +zeebe * virtualbox Running tcp://192.168.99.100:2376 v17.03.1-ce +``` + +Configure your terminal: + +``` +eval $(docker-machine env zeebe) +``` + +Then run Zeebe: + +``` +docker run --rm -p 26500:26500 camunda/zeebe:latest +``` + +To get the ip of Zeebe: + +``` +docker-machine ip zeebe +``` + +``` +192.168.99.100 +``` + +Verify that you can connect to Zeebe: + +``` +telnet 192.168.99.100 26500 +``` + +## Install the Zeebe Modeler + +The Zeebe Modeler is an open-source desktop BPMN modeling application created specifically for Zeebe. + +[You can download the most recent Zeebe Modeler release here.](https://github.com/zeebe-io/zeebe-modeler/releases) diff --git a/docs/product-manuals/zeebe/getting-started/assets/Operate-Login-Page.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/Operate-Login-Page.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/Operate-Login-Page.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/Operate-Login-Page.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/order-process.bpmn b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/order-process.bpmn similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/order-process.bpmn rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/order-process.bpmn diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.0-complete-workflow.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.0-complete-workflow.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.0-complete-workflow.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.0-complete-workflow.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.1-initiate-payment-task.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.1-initiate-payment-task.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.1-initiate-payment-task.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.1-initiate-payment-task.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.10-end-event.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.10-end-event.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.10-end-event.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.10-end-event.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.11-process-id.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.11-process-id.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.11-process-id.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.11-process-id.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.2-modeler-message-event.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.2-modeler-message-event.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.2-modeler-message-event.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.2-modeler-message-event.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.3-add-message-name.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.3-add-message-name.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.3-add-message-name.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.3-add-message-name.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.4-add-correlation-key.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.4-add-correlation-key.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.4-add-correlation-key.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.4-add-correlation-key.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.5-add-xor-gateway.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.5-add-xor-gateway.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.5-add-xor-gateway.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.5-add-xor-gateway.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.6-label-xor-gateway.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.6-label-xor-gateway.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.6-label-xor-gateway.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.6-label-xor-gateway.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.7-no-insurance-task.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.7-no-insurance-task.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.7-no-insurance-task.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.7-no-insurance-task.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.8-default-flow.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.8-default-flow.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.8-default-flow.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.8-default-flow.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-3.9-condition-expression.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.9-condition-expression.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-3.9-condition-expression.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-3.9-condition-expression.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-4.0-workflow-in-operate.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.0-workflow-in-operate.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-4.0-workflow-in-operate.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.0-workflow-in-operate.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-4.2-waiting-at-message.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.2-waiting-at-message.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-4.2-waiting-at-message.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.2-waiting-at-message.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-4.3-waiting-at-shipping.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.3-waiting-at-shipping.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-4.3-waiting-at-shipping.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.3-waiting-at-shipping.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-4.4-no-insurance-complete.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.4-no-insurance-complete.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-4.4-no-insurance-complete.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.4-no-insurance-complete.png diff --git a/docs/product-manuals/zeebe/getting-started/assets/tutorial-4.5-both-instances-complete.png b/docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.5-both-instances-complete.png similarity index 100% rename from docs/product-manuals/zeebe/getting-started/assets/tutorial-4.5-both-instances-complete.png rename to docs/product-manuals/zeebe/deployment-guide/getting-started/assets/tutorial-4.5-both-instances-complete.png diff --git a/docs/product-manuals/zeebe/deployment-guide/getting-started/create-a-workflow.md b/docs/product-manuals/zeebe/deployment-guide/getting-started/create-a-workflow.md new file mode 100644 index 00000000000..b53c575c56a --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/getting-started/create-a-workflow.md @@ -0,0 +1,171 @@ +--- +id: create-a-workflow +title: "Create a workflow" +--- + +_New to BPMN and want to learn more before moving forward? [This blog post](https://zeebe.io/blog/2018/08/bpmn-for-microservices-orchestration-a-primer-part-1/) helps to explain the standard and why it's a good fit for microservices orchestration._ + +_In case you're already familiar with BPMN and how to create a BPMN model in Zeebe Modeler, you can find the finished model that we create during the tutorial here: [Zeebe Getting Started Tutorial Workflow Model](assets/order-process.bpmn)._ + +_If you're using the finished model we provide rather than building your own, you can also move ahead to [deploy a workflow](deploy-a-workflow.md)._ + +Zeebe Modeler is a desktop modeling tool that allows you to build and configure workflow models using BPMN 2.0. In this section, we'll create a workflow model and get it ready to be deployed to Zeebe. + +We'll create an e-commerce order process as our example, and we'll model a workflow that consists of: + +- Initiating a payment for an order +- Receiving a payment confirmation message from an external system +- Shipping the items in the order with or without insurance depending on order value + +This is what your workflow model will look like when we're finished: + +![Getting Started Workflow Model](assets/tutorial-3.0-complete-workflow.png) + +The payment task and shipping tasks are carried out by worker services that we'll connect to the workflow engine. The _Payment Received_ message will be published to Zeebe by an external system, and Zeebe will then correlate the message to a workflow instance. + +To get started + +- Open the Zeebe Modeler and create a new BPMN diagram. +- Save the model as `order-process.bpmn` in the top level of the Zeebe broker directory that you just downloaded. As a reminder, this directory is called `zeebe-broker-0.17.0` + +The first element in your model will be a start event, which should already be on the canvas when you open the Modeler. + +It's a BPMN best practice to label all elements in our model, so: + +- Double-click on the start event +- Label it `Order Placed` to signify that our process will be initiated whenever a customer places an order + +Next, we need to add a service task: + +- Click on the start event and select task icon +- Label the newly created Task `Initiate Payment` +- Click the wrench icon and change the task to a service task + +Next, we'll configure the _Initiate Payment_ service task so that an external microservice can work on it: + +- Click on the `Initiate Payment` task +- Expand the Properties panel on the right side of the screen if it's not already visible +- In the **Type** field in the Properties panel, enter `initiate-payment` + +This is what you should see in your Modeler now. + +![Initiate Payment Service Task](assets/tutorial-3.1-initiate-payment-task.png) + +This **Type** field represents the _job type_ in Zeebe. A couple of concepts that are important to understand at this point: + +- A _job_ is simply a work item in a workflow that needs to be completed before a workflow instance can proceed to the next step. (_[See: Job Workers](/product-manuals/concepts/job-workers.md)_) +- A _workflow instance_ is one running instance of a workflow model--in our case, an individual order to be fulfilled. (_[See: Workflows](/product-manuals/concepts/workflows.md)_) + +For every workflow instance that arrives at the `Initiate Payment` service task, Zeebe will create a job with type `initiate-payment`. The external worker service responsible for payment processing--the so-called job worker--will poll Zeebe intermittently to ask if any jobs of type `initiate-payment` are available. + +If a job is available for a given workflow instance, the worker will activate it, complete it, and notify Zeebe. Zeebe will then advance that workflow instance to the next step in the workflow. + +Next, we'll add a message event to the workflow: + +- Click on the `Initiate Payment` task on the Modeler +- Select the circular icon with a double line border +- Click on the wrench icon next to the newly created event +- Select the **Message Intermediate Catch Event** +- Double-click on the message event and label it `Payment Received` + +![Message Event](assets/tutorial-3.2-modeler-message-event.png) + +We use message catch events in Zeebe when the workflow engine needs to receive a message from an external system before the workflow instance can advance. (_[See: Message Events](/reference/bpmn-workflows/message-events/message-events.md)_) + +In the scenario we're modeling, we _initiate_ a payment with our service task, but we need to wait for some other external system to actually confirm that the payment was received. This confirmation comes in the form of a message that will be sent to Zeebe - asynchronously - by an external service. + +Messages received by Zeebe need to be correlated to specific workflow instances. To make this possible, we have some more configuring to do: + +- Select the message event and make sure you're on the `General` tab of the properties panel on the right side of the screen +- In the properties panel, click the `+` icon to create a new message. You'll now see two fields in the Modeler that we'll use to correlate a message to a specific workflow instance: message name and subscription correlation key. +- Let's give this message a self-explanatory name: `payment-received`. + +![Add Message Name](assets/tutorial-3.3-add-message-name.png) + +When Zeebe receives a message, this name field lets us know _which message event in the workflow model_ the message is referring to. + +But how do we know which _specific workflow instance_--that is, which customer order--a message refers to? That's where subscription correlation key comes in. The subscription correlation key is a unique ID present in both the workflow instance payload and the message sent to Zeebe. + +We'll use `orderId` for our correlation key. + +Go ahead and add the expression `= orderId` to the subscription correlation key field. + +When we create a workflow instance, we need to be sure to include `orderId` as a variable, and we also need to provide `orderId` as a correlation key when we send a message. + +Here's what you should see in the Modeler: + +![Message Correlation Key](assets/tutorial-3.4-add-correlation-key.png) + +Next, we'll add an exclusive (XOR) gateway to our workflow model. The exclusive gateway is used to make a data-based decision about which path a workflow instance should follow. In this case, we want to ship items _with_ insurance if total order value is greater than or equal to $100 and ship _without_ insurance otherwise. + +That means that when we create a workflow instance, we'll need to include order value as an instance variable. But we'll come to that later. + +First, let's take the necessary steps to configure our workflow model to make this decision. To add the gateway: + +- Click on the message event you just created +- Select the gateway (diamond-shaped) symbol - the exclusive gateway is the default when you add a new gateway to a model +- Double-click on the gateway and add a label `Order Value?` so that it's clear what we're using as our decision criteria + +![Add Exclusive Gateway to Model](assets/tutorial-3.5-add-xor-gateway.png) + +![Label Exclusive Gateway in Model](assets/tutorial-3.6-label-xor-gateway.png) + +We'll add two outgoing sequence flows from this exclusive gateway that lead to two different service tasks. Each sequence flow will have a data-based condition that's evaluated in the context of the workflow instance payload. + +Next, we need to: + +- Select the gateway and add a new service task to the model. +- Label the task `Ship Without Insurance` +- Set the **Type** to `ship-without-insurance` + +![Add No Insurance Service Task](assets/tutorial-3.7-no-insurance-task.png) + +Whenever we use an exclusive gateway, we want to be sure to set a default flow, which in this case will be shipping without insurance: + +- Select the sequence flow you just created from the gateway to the `Ship Without Insurance` service task +- Click on the wrench icon +- Choose **Default Flow** + +![Add No Insurance Service Task](assets/tutorial-3.8-default-flow.png) + +Now we're ready to add a _second_ outgoing sequence flow and service task from the gateway: + +- Select the gateway again +- Add another service task to the model +- Label it `Ship With Insurance` +- Set the **Type** to `ship-with-insurance` + +Next, we'll set a condition expression in the sequence flow leading to this `Ship With Insurance` service task: + +- Click on the sequence flow and open the properties panel +- Input the expression `= orderValue >= 100` in the **Condition expression** field in the properties panel +- Double-click on the sequence flow to add a label "`>= $100"` + +![Condition Expression](assets/tutorial-3.9-condition-expression.png) + +We're almost finished! To wrap things up, we'll: + +- Select the `Ship Without Insurance` task +- Add another exclusive gateway to the model to merge the branches together again (a BPMN best practice in a model like this one). +- Select the `Ship With Insurance` task +- Add an outgoing sequence flow that connects to the second exclusive gateway you just created + +The only BPMN element we need to add is an end event: + +- Click on the second exclusive gateway +- Add an end event +- Double-click on it to label it `Order Fulfilled` + +![Condition Expression](assets/tutorial-3.10-end-event.png) + +Lastly, we'll change the process ID to something more descriptive than the default `Process_1` that you'll see in the Modeler: + +- Click onto a blank part of the canvas +- Open the properties panel +- Change the **Id** to `order-process` + +Here's what you should see in the Modeler after these last few updates: + +![Update Process ID](assets/tutorial-3.11-process-id.png) + +That's all for our modeling step. Remember to save the file one more time to prepare to deploy the workflow to Zeebe, create workflow instances, and complete them. diff --git a/docs/product-manuals/zeebe/deployment-guide/getting-started/create-workflow-instance.md b/docs/product-manuals/zeebe/deployment-guide/getting-started/create-workflow-instance.md new file mode 100644 index 00000000000..cbe840913ae --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/getting-started/create-workflow-instance.md @@ -0,0 +1,269 @@ +--- +id: create-workflow-instance +title: "Create and complete workflow instances" +--- + +We're going to create 2 workflow instances for this tutorial: one with an order value less than $100 and one with an order value greater than or equal to $100 so that we can see our XOR gateway in action. + +Go back to the Terminal window where you deployed the workflow model and execute the following command. + +> **Note:** Windows users who want to execute this command using cmd or Powershell +> have to escape the variables differently. +> - cmd: `"{\"orderId\": 1234}"` +> - Powershell: `'{"\"orderId"\": 1234}'` + +**Linux** + + +``` +./bin/zbctl --insecure create instance order-process --variables '{"orderId": "1234", "orderValue":99}' +``` + + +**Mac** + + +``` +./bin/zbctl.darwin --insecure create instance order-process --variables '{"orderId": "1234", "orderValue":99}' +``` + + +**Windows (Powershell)** + + +``` +./bin/zbctl.exe --insecure create instance order-process --variables '{\"orderId\": \"1234\", \ +"orderValue\":99}' +``` + + +You'll see a response like: + + +``` +{ + "workflowKey": 1, + "bpmnProcessId": "order-process", + "version": 1, + "workflowInstanceKey": 8 +} +``` + + +This first workflow instance we just created represents a single customer order with `orderId` 1234 and `orderValue` 99 (or, $99). + +In the same Terminal window, run the command: + +**Linux** + + +``` +./bin/zbctl --insecure create instance order-process --variables '{"orderId": "2345", "orderValue":100}' +``` + + +**Mac** + + +``` +./bin/zbctl.darwin --insecure create instance order-process --variables '{"orderId": "2345", "orderValue":100}' +``` + + +**Windows (Powershell)** + + +``` +./bin/zbctl.exe --insecure create instance order-process --variables '{\"orderId\": \"2345\", \ +"orderValue\":100}' +``` + + +This second workflow instance we just created represents a single customer order with `orderId` 2345 and `orderValue` 100 (or, $100). + +If you go back to the Operate UI and refresh the page, you should now see two workflow instances (the green badge) waiting at the `Initiate Payment` task. + +![Workflow Instances in Operate](assets/tutorial-4.1-workflow-instances-first-task.png) + +Note that the workflow instance can't move past this first task until we create a job worker to complete `initiate-payment` jobs. So that's exactly what we'll do next. + +To make this point again: in a real-word use case, you probably won't manually create workflow instances using the Zeebe CLI. Rather, a workflow instance would be created programmatically in response to some business event, such as a message sent to Zeebe after a customer places an order. And instances might be created at very large scale if, for example, many customers were placing orders at the same time due to a sale. We're using the CLI here just for simplicity's sake. + +We have two instances currently waiting at our `Initiate Payment` task, which means that Zeebe has created two jobs with type `initiate-payment`. + +`zbctl` provides a command to spawn simple job workers using an external command or script. The job worker will receive the payload for every job as a JSON object on `stdin` and must also return its result as JSON object on `stdout` if it handled the job successfully. + +In this example, we'll also use the unix command `cat` which just outputs what it receives on `stdin`. + +Open a new Terminal tab or window, change into the Zeebe broker directory, and use the following command to create a job worker that will work on the `initiate-payment` job. + +> **Note:** For Windows users, this command does not work with cmd as the `cat` +> command does not exist. We recommend to use Powershell or a bash-like shell +> to execute this command. + +**Linux** + + +``` +./bin/zbctl --insecure create worker initiate-payment --handler cat +``` + + +**Mac** + + +``` +./bin/zbctl.darwin --insecure create worker initiate-payment --handler cat +``` + + +**Windows** + + +``` +./bin/zbctl.exe --insecure create worker initiate-payment --handler "findstr .*" +``` + + +You should see a response along the lines of: + + +``` +Activated job 12 with payload {"orderId":"2345","orderValue":100} +Activated job 7 with payload {"orderId":"1234","orderValue":99} +Handler completed job 12 with payload {"orderId":"2345","orderValue":100} +Handler completed job 7 with payload {"orderId":"1234","orderValue":99} +``` + + +We can see that the job worker activated then completed the two available `initiate-payment` jobs. You can shut down the job worker if you'd like--you won't need it in the rest of the tutorial. + +Now go to the browser tab where you're running Operate. You should see that the workflow instances have advanced to the intermediate message catch event and are waiting there. + +![Waiting at Message Event](assets/tutorial-4.2-waiting-at-message.png) + +The workflow instances will wait at the intermediate message catch event until a message is received by Zeebe and correlated to the instances. Messages can be published using Zeebe clients, and it's also possible for Zeebe to connect to a message queue such as Apache Kafka and correlate messages published there to workflow instances. + +`zbctl` also supports message publishing, so we'll continue to use it in our demo. Below is the command we'll use to publish and correlate a message. You'll see that we provide the message "Name" that we assigned to this message event in the Zeebe Modeler as well as the `orderId` that we included in the payload of the instance when we created it. + +Remember, `orderId` is the correlation key we set in the Modeler when configuring the message event. Zeebe requires both of these fields to be able to correlate a message to a workflow instance. Because we have two workflow instances with two distinct `orderId`, we'll need to publish two messages. Run these two commands one after the other: + +**Linux** + + +``` +./bin/zbctl --insecure publish message "payment-received" --correlationKey="1234" +./bin/zbctl --insecure publish message "payment-received" --correlationKey="2345" +``` + + +**Mac** + + +``` +./bin/zbctl.darwin --insecure publish message "payment-received" --correlationKey="1234" +./bin/zbctl.darwin --insecure publish message "payment-received" --correlationKey="2345" +``` + + +**Windows** + + +``` +./bin/zbctl.exe --insecure publish message "payment-received" --correlationKey="1234" +./bin/zbctl.exe --insecure publish message "payment-received" --correlationKey="2345" +``` + + +You won't see a response in your Terminal window, but if you refresh Operate, you should see that the messages were correlated successfully and that one workflow instance has advanced to the `Ship With Insurance` task and the other has advanced to the `Ship Without Insurance` task. + + +![Waiting at Shipping Service Tasks](assets/tutorial-4.3-waiting-at-shipping.png) + +The good news is that this visualization confirms that our decision logic worked as expected: our workflow instance with an `orderValue` of $100 will ship with insurance, and our workflow instance with an `orderValue` of $99 will ship without insurance. + +You probably know what you need to do next. Go ahead and open a Terminal window and create a job worker for the `ship-without-insurance` job type. + +**Linux** + + +``` +./bin/zbctl --insecure create worker ship-without-insurance --handler cat +``` + + +**Mac** + + +``` +./bin/zbctl.darwin --insecure create worker ship-without-insurance --handler cat +``` + + +**Windows** + + +``` +./bin/zbctl.exe --insecure create worker ship-without-insurance --handler "findstr .*" +``` + + +You should see a response along the lines of: + + +``` +Activated job 529 with payload {"orderId":"1234","orderValue":99} +Handler completed job 529 with payload {"orderId":"1234","orderValue":99} +``` + + +You can shut down this worker now. + +Select the **Finished Instances** checkbox in the bottom left of Operate, refresh the page, and voila! You'll see your first completed Zeebe workflow instance. + +![First Workflow Instance Complete](assets/tutorial-4.4-no-insurance-complete.png) + +Because the `Ship With Insurance` task has a different job type, we need to create a second worker that can take on this job. + +**Linux** + + +``` +./bin/zbctl --insecure create worker ship-with-insurance --handler cat +``` + + +**Mac** + + +``` +./bin/zbctl.darwin --insecure create worker ship-with-insurance --handler cat +``` + + +**Windows** + + +``` +./bin/zbctl.exe --insecure create worker ship-with-insurance --handler "findstr .*" +``` + + +You should see a response along the lines of: + + +``` +Activated job 535 with payload {"orderId":"2345","orderValue":100} +Handler completed job 535 with payload {"orderId":"2345","orderValue":100} +``` + + +You can shut down this worker, too. + +Let's take one more look in Operate to confirm that both workflow instances have been completed. + +![Both Workflow Instances Complete](assets/tutorial-4.5-both-instances-complete.png) + +Hooray! You've completed the tutorial! Congratulations. + +In the next and final section, we'll point you to resources we think you'll find helpful as you continue working with Zeebe. diff --git a/docs/product-manuals/zeebe/deployment-guide/getting-started/deploy-a-workflow.md b/docs/product-manuals/zeebe/deployment-guide/getting-started/deploy-a-workflow.md new file mode 100644 index 00000000000..e5e770093e4 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/getting-started/deploy-a-workflow.md @@ -0,0 +1,174 @@ +--- +id: deploy-a-workflow +title: "Deploy a workflow" +--- + +_In this section, we're going to start up the Zeebe broker as well as Camunda Operate, a tool that gives you visibility into deployed workflows and running workflow instances and contains tooling for fixing problems in those workflow instances._ + +_We offer Operate free of charge for unrestricted **non-production** use because we think it's a great tool for getting familiar with Zeebe and building initial proofs-of-concept. And at this time, Operate is available for non-production use only. In the future, we'll offer an Operate enterprise license that allows for production use, too._ + +Before we run the Zeebe broker, we need to configure an Elasticsearch exporter in the Zeebe configuration file. Which leads to the question: what's an exporter, and why is Elasticsearch a part of this tutorial? + +The answer is that Zeebe itself doesn't store historic data related to your workflow instances. If you want to keep this data for auditing or for analysis, you need to export to another storage system. Zeebe _does_ provide an easy-to-use exporter interface, and it also offers an Elasticsearch exporter out of the box. (_[See: Exporters](/product-manuals/zeebe/open-source/exporters.md)_) + +Elasticsearch is also what Camunda Operate uses to store data, so to run Operate, you need to enable the Elasticsearch exporter in Zeebe and run an instance of Elasticsearch. In this section and the next section of the tutorial, we'll use Operate to visualize what's going on in Zeebe with each step we take. + +## Docker compose + +If you are using Docker and [zeebe-docker-compose](https://github.com/zeebe-io/zeebe-docker-compose) then follow the instructions in the README file in the `operate` directory of that repository to start Zeebe and Operate. Once you have done that, skip the following section, and continue from [check the status of the broker](#check-the-status-of-the-broker). + +If you are using individual components, then you will need to manually configure and start components. + +## Manually configure and start Zeebe and Operate + +_These instructions are for using separate components, and are not necessary when using Docker._ + +First, copy the following lines into a new file `getting-started.yaml` file (in the `config` directory of the Zeebe broker). + +``` +zeebe: + broker: + exporters: + elasticsearch: + className: io.zeebe.exporter.ElasticsearchExporter +``` + +These settings enable the Zeebe Elasticsearch exporter. + +> **Note:** Some command examples might not work on Windows if you use cmd or +> Powershell. For Windows users we recommend to use a bash-like shell, i.e. Git +> Bash, Cygwin or MinGW for this guide. + +Next, open Terminal or another command line tool and start up Elasticsearch. + +``` +cd elasticsearch-6.7.0 +``` + +**Linux / Mac** + +``` +bin/elasticsearch +``` + +**Windows** + +``` +bin\elasticsearch.bat +``` + +You'll know that startup was successful when you see something like: + +``` +[2019-04-05T10:26:22,288][INFO ][o.e.n.Node ] [oy0juRR] started +``` + +Then start the Zeebe broker in another Terminal window. + +``` +./bin/broker --spring.config.location=file:./config/getting-started.yaml +``` + +And finally, start Operate in yet another Terminal window. Note that you'll need port 8080 in order to run Operate and access the UI, so be sure to check that it's available. + +``` +cd camunda-operate-distro-1.0.0-RC2 +bin/operate +``` + +To confirm that Operate was started, go to [http://localhost:8080](http://localhost:8080). You should see the following: + +![Zeebe Configuration File](assets/Operate-Login-Page.png) + +You can leave this tab open as we'll be returning to it shortly. + +## Check the status of the broker + +You can use the Zeebe CLI to check the status of your broker. Open a new Terminal window to run it. + +If you are using Docker, change into the `zeebe-docker-compose` directory. + +If you are using separate components, then change into the Zeebe broker directory. + +Run the following: + +**Linux** + +``` +./bin/zbctl --insecure status +``` + +**Mac** + +``` +./bin/zbctl.darwin --insecure status +``` + +**Windows** + +``` +./bin/zbctl.exe --insecure status +``` + +You should see a response like this one: + +``` +Cluster size: 1 +Partitions count: 1 +Replication factor: 1 +Brokers: + Broker 0 - 0.0.0.0:26501 + Partition 0 : Leader +``` + +For all Zeebe-related operations moving forward, we'll be using Zeebe's command-line interface (CLI). In a real-world deployment, you likely wouldn't rely on the CLI to send messages or create job workers. Rather, you would embed Zeebe clients in worker microservices that connect to the Zeebe engine. + +But for the sake of keeping this guide simple (and language agnostic), we're going to use the CLI. + +## Deploy the worklfow + +Next, we'll deploy our workflow model via the CLI. We'll deploy the workflow model we created in the previous section. + +**Linux** + +``` +./bin/zbctl --insecure deploy order-process.bpmn +``` + +**Mac** + +``` +./bin/zbctl.darwin --insecure deploy order-process.bpmn +``` + +**Windows** + +``` +./bin/zbctl.exe --insecure deploy order-process.bpmn +``` + +You should see a response like this one: + +``` +{ + "key": 2, + "workflows": [ + { + "bpmnProcessId": "order-process", + "version": 1, + "workflowKey": 1, + "resourceName": "order-process.bpmn" + } + ] +} +``` + +Now we'll take a look at the Operate user interface: + +- Go to [http://localhost:8080](http://localhost:8080) and use the credentials `demo` / `demo` to access Operate +- Click on the `Running Instances` option in the navigation bar at the top of the interface +- Select the `order-process` workflow from the **Workflows** selector on the left side of the screen + +You should see the workflow model we just deployed – the same model we built in the previous section. You won't see any workflow instances because we haven't created them yet, and that's exactly what we'll do in the next section. + +![Workflow in Operate](assets/tutorial-4.0-workflow-in-operate.png) diff --git a/docs/product-manuals/zeebe/deployment-guide/getting-started/index.md b/docs/product-manuals/zeebe/deployment-guide/getting-started/index.md new file mode 100644 index 00000000000..40bf6a99ab8 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/getting-started/index.md @@ -0,0 +1,13 @@ +--- +id: index +title: "Getting started tutorial" +sidebar_label: "Overview" +--- + +We'll walk you through an end-to-end Zeebe example, including building and configuring a workflow model in Zeebe Modeler, deploying the model, creating and working on instances using the Zeebe Command Line Interface, and then seeing what's going on in a tool called Operate. + +1. [Tutorial setup](tutorial-setup.md) +1. [Create a workflow](create-a-workflow.md) +1. [Deploy a workflow](deploy-a-workflow.md) +1. [Create and complete instances](create-workflow-instance.md) +1. [Next steps and resources](next-steps-resources.md) diff --git a/docs/product-manuals/zeebe/deployment-guide/getting-started/next-steps-resources.md b/docs/product-manuals/zeebe/deployment-guide/getting-started/next-steps-resources.md new file mode 100644 index 00000000000..8a69ea0ff5e --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/getting-started/next-steps-resources.md @@ -0,0 +1,25 @@ +--- +id: next-steps-resources +title: "Next steps and resources" +--- + +Zeebe's Java and Go clients each have getting started guides of their own, showing in much greater detail how you can use the clients in the worker services you orchestrate with Zeebe. + +- [Getting started with the Java client](/product-manuals/clients/java-client/get-started.md) +- [Getting started with the Go client](/product-manuals/clients/go-client/get-started.md) + +Beyond Java and Go, it's possible to create clients for Zeebe in a range of other programming languages, including JavaScript and C#, via community-supported libraries. The [Awesome Zeebe](https://awesome.zeebe.io/) page includes community-contributed clients in other languages, and [this blog post](https://zeebe.io/blog/2018/11/grpc-generating-a-zeebe-python-client/) walks through how to generate a new client stub for Zeebe using gRPC. + +The [Zeebe docs](/) (where this tutorial is located) contain resources to help you move your Zeebe project forward. + +If you have questions, you can get in touch with us via the: + +- [User forum](https://forum.zeebe.io/) +- [Public Slack channel](https://zeebe-slack-invite.herokuapp.com/) +- [GitHub issue tracker](https://github.com/zeebe-io/zeebe/issues) + +Please reach out if we can help you! We're here to offer support. + +Lastly, we do a lot of writing about project news along with an occasional deep dive into the product in the [Zeebe blog](https://zeebe.io/blog/). And we usually make product announcements [via Twitter](https://twitter.com/zeebehq) and our email mailing list, which you can sign up for at the bottom of the [homepage](https://zeebe.io). + +Thanks so much for working through this tutorial with us. We're really glad you're here, and we're happy to welcome you to the Zeebe community! diff --git a/docs/product-manuals/zeebe/deployment-guide/getting-started/tutorial-setup.md b/docs/product-manuals/zeebe/deployment-guide/getting-started/tutorial-setup.md new file mode 100644 index 00000000000..73d42c6ae28 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/getting-started/tutorial-setup.md @@ -0,0 +1,36 @@ +--- +id: tutorial-setup +title: "Tutorial setup" +--- + +Welcome to the Getting Started tutorial for Zeebe and Operate. In this tutorial, we'll walk you through how to: + +- Model a workflow using Zeebe Modeler +- Deploy the workflow to Zeebe +- Create workflow instances +- Use workers to complete jobs created by those workflow instances +- Correlate messages to workflow instances +- Monitor what's happening and get detail about running workflow instances in Operate + +If this is your first time working with Zeebe, we expect this entire guide to take you 30-45 minutes to complete. + +If you're looking for a very fast (but less comprehensive) "first contact" experience, you might prefer the [Quickstart](../local/quickstart.md). + +The tutorial assumes you have some basic knowledge of what Zeebe is and what it's used for. If you're completely new to Zeebe, you might find it helpful to read through the ["What is Camunda Cloud?"](/product-manuals/concepts/what-is-camunda-cloud.md) docs article first. + +Below are the components you'll use in the tutorial. The easiest way to run them is to download the [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) and use the `operate` docker-compose profile in the [zeebe-docker-compose](https://github.com/zeebe-io/zeebe-docker-compose) repository. Further instructions for using Zeebe with Docker can be found in the README.md file in that repository. + +You can also download the full distributions for these components, instead of running them with Docker. + +1. [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases): A desktop modeling tool that we'll use to create and configure our workflow before we deploy it to Zeebe. +1. [Zeebe Distribution](https://github.com/zeebe-io/zeebe/releases/tag/0.20.0): The Zeebe distribution contains the workflow engine where we'll deploy our workflow model; the engine is also responsible for managing the state of active workflow instances. Included in the distro is the Zeebe CLI, which we'll use throughout the tutorial. Please use Zeebe 0.20.0. +1. [Camunda Operate](https://github.com/zeebe-io/zeebe/releases/tag/0.20.0): An operations tool for monitoring and troubleshooting live workflow instances in Zeebe. Operate is currently available for free and unrestricted _non-production use_. +1. [Elasticsearch 6.8.0](https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-0): An open-source distributed datastore that can connect to Zeebe to store workflow data for auditing, visualization, analysis, etc. Camunda Operate uses Elasticsearch as its underlying datastore, which is why you need to download Elasticsearch to complete this tutorial. Operate and Zeebe are compatible with Elasticsearch 6.8.0. + +In case you're already familiar with BPMN and how to create a BPMN model in Zeebe Modeler, you can find the finished model that we create during the tutorial here: [Zeebe Getting Started Tutorial Workflow Model](assets/order-process.bpmn). + +If you're using the finished model we provide rather than building your own, you can also move ahead to [section 3.3: Deploy a Workflow](deploy-a-workflow.md). + +And if you have questions or feedback about the tutorial, we encourage you to visit the [Zeebe user forum](https://forum.zeebe.io) and ask a question. + +There's a "Getting Started" category for topics that you can use when you ask your question or give feedback. diff --git a/docs/product-manuals/zeebe/deployment-guide/index.md b/docs/product-manuals/zeebe/deployment-guide/index.md new file mode 100644 index 00000000000..5d180a60ac8 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/index.md @@ -0,0 +1,23 @@ +--- +id: index +title: "Deployment guide" +sidebar_label: "Overview" +--- + +This chapter contains information for users who want to deploy and run Zeebe in a private cloud or on their own hardware. + +Zeebe can be run as a Docker image or as a Kubernetes deployment. + +We recommend using Docker during development. This gives you a consistent, repeatable development environment. + +We recommend using either Camunda Cloud or Kubernetes and container images in production. This provides you with predictable and consistent configuration, and the ability to manage deployment using automation tools. + +The deployment guide covers the following topics: + +- [Local installation](local/install.md) - contains instructions and a quick start guide to install Zeebe locally +- [Docker container](docker/install.md) - covers running Zeebe in a Docker environment +- [Kubernetes deployment](kubernetes/index.md) - gives information on running Zeebe in a Kubernetes environment +- [Getting started guide](getting-started/index.md) - shows you how to work with Zeebe. +- [Configuration](configuration/configuration.md) - explains the configuration options. These configuration options apply to both environments, but not to Camunda Cloud. In Camunda Cloud the configuration is provided for you. +- [Security](security/security.md) - discusses the security aspects of running Zeebe and how to use them +- [Operation](operations/index.md) - outlines topics that become relevant when you want to operate Zeebe in production diff --git a/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/accessing-operate.md b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/accessing-operate.md new file mode 100644 index 00000000000..7d9d61569f0 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/accessing-operate.md @@ -0,0 +1,41 @@ +--- +id: accessing-operate +title: "Accessing Operate from outside the cluster" +--- + +The **Zeebe Full Helm charts** install an ingress controller. If this is deployed in a cloud provider (GKE, EKS, AKS, etc.), it should provision a `LoadBalancer` which will expose an external IP that can be used as the main entry point to access all the services/applications that are configured to have Ingress Routes. + +> If you have your own ingress controller, you can use the child chart for installing a Zeebe cluster, instead of using the parent chart. + +You can find the external IP by running: + +``` +> kubectl get svc +``` + +You should see something like: + +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +-nginx-ingress-controller LoadBalancer 10.109.108.4 80:30497/TCP,443:32232/TCP 63m +``` + +Where the `` under the `EXTERNAL-IP` column should change to a public IP that you (and other users) should be able to access from outside the cluster. You might need to check your cloud provider specific configuration if that doesn't work. + +Then you should be able to access Operate pointing your browser at `http://` + +If you are running in Kubernetes KIND, you will need to `port-forward` to the ingress controller main entry point due KIND doesn't support LoadBalancers. You can do that by running in a different terminal: + +``` +> kubectl port-forward svc/-nginx-ingress-controller 8080:80 +``` + +Then you should be able to access Operate pointing your browser at [http://localhost:8080](http://localhost:8080/) + +![Operate Login](assets/operate-login.png) + +Using `demo`/`demo` for credentials. + +![Operate Login](assets/operate-dashboard.png) + +If you deploy process definitions, they will appear in the dashboard and then you can drill down to see your active instances. You can deploy and create new instances using the Zeebe clients or `zbctl`. diff --git a/docs/product-manuals/zeebe/kubernetes/assets/helm-service-account-role.yaml b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/helm-service-account-role.yaml similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/helm-service-account-role.yaml rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/helm-service-account-role.yaml diff --git a/docs/product-manuals/zeebe/kubernetes/assets/kind-values.yaml b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/kind-values.yaml similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/kind-values.yaml rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/kind-values.yaml diff --git a/docs/product-manuals/zeebe/kubernetes/assets/operate-dashboard.png b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/operate-dashboard.png similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/operate-dashboard.png rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/operate-dashboard.png diff --git a/docs/product-manuals/zeebe/kubernetes/assets/operate-login.png b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/operate-login.png similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/operate-login.png rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/operate-login.png diff --git a/docs/product-manuals/zeebe/kubernetes/assets/zeebe-helm-charts.png b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/zeebe-helm-charts.png similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/zeebe-helm-charts.png rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/zeebe-helm-charts.png diff --git a/docs/product-manuals/zeebe/kubernetes/assets/zeebe-k8s-helm.png b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/zeebe-k8s-helm.png similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/zeebe-k8s-helm.png rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/assets/zeebe-k8s-helm.png diff --git a/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/index.md b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/index.md new file mode 100644 index 00000000000..f7a8771a39e --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/index.md @@ -0,0 +1,21 @@ +--- +id: index +title: "Helm charts" +sidebar_label: "Overview" +--- + +![Zeebe on K8s](assets/zeebe-k8s-helm.png) + +This section covers the fundamentals of how to run Zeebe in Kubernetes. There are several alternatives on how to deploy applications to a Kubernetes cluster, but the following sections are using Helm charts to deploy a set of components into your cluster. + +Helm allows you to choose exactly what chart (set of components) do you want to install and how these components needs to be configured. These Helm charts are continuously being improved and released to the [Zeebe Helm Chart Repository](http://helm.zeebe.io) + +You are free to choose your Kubernetes provider, our Helm charts are not cloud provider specific and we encourage [reporting issues](http://github.com/zeebe-io/zeebe-full-helm/issues) if you find them. + +You can also join us on [Slack](https://zeebe-slack-invite.herokuapp.com/). + +This chapter is divided in the following sections: + +- [Prerequisites](prerequisites.md) +- [Getting to know and installing Zeebe Helm charts](installing-helm.md) +- [Accessing Operate from outside our Kubernetes cluster](accessing-operate.md) diff --git a/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/installing-helm.md b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/installing-helm.md new file mode 100644 index 00000000000..8a6d9b23e0a --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/installing-helm.md @@ -0,0 +1,99 @@ +--- +id: installing-helm +title: "Zeebe Helm Charts" +--- + + +[Helm](https://github.com/helm/helm) is a package manager for Kubernetes resources. Helm allows us to install a set of components by just referencing a package name and it allows us to override configurations to accommodate these packages to different scenarios. Helm also provides dependency management between charts, meaning that charts can depend on other charts allowing us to aggregate a set of components together that can be installed with a single command. + + +As part of the Zeebe project, we provide 3 Zeebe Helm charts: +- **Zeebe cluster**: Deploys a Zeebe cluster with 3 brokers using the `camunda/zeebe` docker image. This chart depends on ElasticSearch Helm chart and optionally on Kibana Helm chart. For more information about this chart and its configuration, checkout the [repository](http://github.com/zeebe-io/zeebe-cluster-helm/). +- **Zeebe Operate**: Deploys Zeebe Operate which connects to an existing ElasticSearch. This chart source code can be located [here](http://github.com/zeebe-io/zeebe-operate-helm/). +- **Zeebe Full** (Parent): Deploys a Zeebe Cluster + Operate + Ingress Controller. This parent chart can be located [here](http://github.com/zeebe-io/zeebe-full-helm/). + +![Charts](assets/zeebe-helm-charts.png) + +### Initializing Helm in your cluster + +You need to have `kubectl` already configured against a Kubernetes cluster to install Helm (server side/tiller) into your cluster. +> Here you can download the [helm-service-account-role.yaml](assets/helm-service-account-role.yaml) file + +You also need to have the `helm` CLI tool installed as listed in the prerequisites section. + +``` +> kubectl apply -f helm-service-account-role.yaml +> helm init --service-account helm --upgrade +``` + +This install Helm server side components in your cluster and it will enable the `helm` cli tool to install Helm charts into your environment. + + +### Add Zeebe Helm repository + +The next step is to add the Zeebe official Helm chart repository to your installation. Once this is done, Helm will be able to fetch and install charts hosted in [http://helm.zeebe.io](http://helm.zeebe.io). +``` +> helm repo add zeebe https://helm.zeebe.io +> helm repo update +``` + +We are ready to install any of the Helm charts hosted in the official Zeebe Helm chart repo. + + +### Install Zeebe Full Helm chart (Zeebe cluster + Operate + ingress controller) + +In this section we are going to install all the available Zeebe components inside a Kubernetes cluster. Notice that this Kubernetes cluster can have already running services and Zeebe is going to installed just as another set of services. + +``` +> helm install zeebe/zeebe-full +``` + +> Note: change >RELEASE NAME< with a name of your choice or use `--generate-name` option instead + +> Notice that you can add the `-n` flag to specify in which Kubernetes namespace the components should be installed. + +Installing all the components in a cluster requires all the Docker images to be downloaded to the remote cluster, depending on which cloud provider you are using, the amount of time that it will take to fetch all the images will vary. + +If you are using [Kubernetes KIND](https://github.com/kubernetes-sigs/kind) add `-f kind-values.yaml` +> The `kind-values.yaml` file can be [downloaded here](assets/kind-values.yaml). +``` +helm install --name zeebe/zeebe-full -f kind-values.yaml +``` + +This will deploy the same components but with a set of parameters tailored to a local environment setup. +> Note that all the Docker images will be downloaded to your local KIND cluster, so it might take some time for the services to get started. + +You can check the progress of your deployment by checking if the Kubernetes Pods are up and running with: +``` +> kubectl get pods +``` + +which returns something like: +``` +NAME READY STATUS RESTARTS AGE +elasticsearch-master-0 1/1 Running 0 4m6s +elasticsearch-master-1 1/1 Running 0 4m6s +elasticsearch-master-2 1/1 Running 0 4m6s +-nginx-ingress-controller-5cf6dd7894-kc25s 1/1 Running 0 4m6s +-nginx-ingress-default-backend-f5454db5-j9vh6 1/1 Running 0 4m6s +-operate-5d4867d6d-h9zqw 1/1 Running 0 4m6s +-zeebe-0 1/1 Running 0 4m6s +-zeebe-1 1/1 Running 0 4m6s +-zeebe-2 1/1 Running 0 4m6s +``` + +Check that each Pod has at least 1/1 running instances. You can always tail the logs of these pods by running: +``` +> kubectl logs -f +``` + +In order to interact with the services inside the cluster you need to use `port-forward` to route traffic from your environment to the cluster. +``` +> kubectl port-forward svc/-zeebe-gateway 26500:26500 +``` + +Now you can connect and execute operations against your newly created Zeebe cluster. + +> Notice that you need to keep `port-forward` running to be able to communicate with the remote cluster. + +> Notice that accessing directly to the Zeebe cluster using `kubectl port-forward` is recommended for development purposes. By default the Zeebe Helm charts are not exposing the Zeebe cluster via Ingress. If you want to uze `zbctl` or a local client/worker from outside the Kubernetes cluster, you rely on `kubectl port-forward` to the Zeebe cluster to communicate. diff --git a/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/prerequisites.md b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/prerequisites.md new file mode 100644 index 00000000000..82b3e197e07 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/kubernetes/helm/prerequisites.md @@ -0,0 +1,20 @@ +--- +id: prerequisites +title: "Prerequisites" +--- + +In order to use Kubernetes you need to have the following tools installed in your local environment: +- `kubectl`: Kubernetes Control CLI tool: installed and connected to your cluster +- `helm`: Kubernetes Helm CLI tool + +You also need a Kubernetes Cluster, here you have several options: + - Local for development you can use: [Kubernetes KIND](https://github.com/kubernetes-sigs/kind), Minikube, MicroK8s + - Remote: Google GKE, Azure AKS, Amazon EKS, etc. + +> Notice that you can use free trials from different cloud providers to create Kubernetes cluster to test Zeebe in the cloud. + +Optional tools related to [Zeebe](http://zeebe.io) +- Zeebe Modeler: to model/modify business processes [Zeebe Modeler releases](https://github.com/zeebe-io/zeebe-modeler/releases) +- Zeebe CTL(`zbctl`): command line tool to interact with a Zeebe cluster (local/remote). You can get the `zbctl` tool from the official [Zeebe release page](https://github.com/zeebe-io/zeebe/releases) + + diff --git a/docs/product-manuals/zeebe/deployment-guide/kubernetes/index.md b/docs/product-manuals/zeebe/deployment-guide/kubernetes/index.md new file mode 100644 index 00000000000..c462d26b1c7 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/kubernetes/index.md @@ -0,0 +1,32 @@ +--- +id: index +title: "Kubernetes deployment" +sidebar_label: "Overview" +--- + +We recommend that you use Kubernetes when deploying Zeebe to production. + +## Deployment options + +| Option | Comment | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Helm](helm/index.md) | Helm allows you to choose exactly what chart (set of components) do you want to install and how these components needs to be configured. | +| [Zeebe Operator (experimental)](operator/zeebe-operator.md) | The objective of the Zeebe k8s Operator is to simplify and natively integrate Zeebe with k8s, to solve operational burden and facilitate the creation and maintenance of a set of clusters. | + +## General information + +### Broker + +Zeebe broker nodes need to be deployed as a [StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/), in order to preserve the identity of cluster nodes. StatefulSets require persistent storage, which needs to be allocated in advance. Depending on your cloud provider, the persistent storage will differ, as it is provider-specific. + +In the [zeebe-kubernetes](https://github.com/zeebe-io/zeebe-kubernetes) repository you will find example Kubernetes manifests to configure a three broker cluster with the Elastic Search exporter and the Operate preview. Examples are provided for provisioning storage on Google Cloud Platform, and Microsoft Azure. + +There are many ways that you can provision and configure a Kubernetes cluster. And there are a number of architectural choices you need to make: will your workers run in the Kubernetes cluster or external to it? + +You will need to configure your Kubernetes cluster and modify this to suit the architecture you are building. + +### Gateway + +Zeebe gateway is deployed as a stateless service. + +We support [Kubernetes startup and liveness probes](../operations/health.md#gateway) for Zeebe gateway. diff --git a/docs/product-manuals/zeebe/kubernetes/assets/zeebe-operator-flow.png b/docs/product-manuals/zeebe/deployment-guide/kubernetes/operator/assets/zeebe-operator-flow.png similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/assets/zeebe-operator-flow.png rename to docs/product-manuals/zeebe/deployment-guide/kubernetes/operator/assets/zeebe-operator-flow.png diff --git a/docs/product-manuals/zeebe/deployment-guide/kubernetes/operator/zeebe-operator.md b/docs/product-manuals/zeebe/deployment-guide/kubernetes/operator/zeebe-operator.md new file mode 100644 index 00000000000..d788489f856 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/kubernetes/operator/zeebe-operator.md @@ -0,0 +1,106 @@ +--- +id: zeebe-operator +title: "Zeebe Operator (Experimental)" +--- + +The Zeebe Kubernetes Operator was born out of the need to manage more than one single Zeebe cluster running inside Kubernetes clusters. Zeebe clusters have their own lifecycle and in real implementations, the need to update, monitor, and manage some of these cluster components while applications are running becomes challenging. The objective of the Zeebe Kubernetes Operator is to simplify and natively integrate Zeebe with Kubernetes, to solve operational burden and facilitate the creation and maintenance of a set of clusters. + +This operator has been built with Kubernetes Helm in mind, meaning that at the end of the day, this operator will be in charge of managing [Helm charts](https://github.com/helm/helm). If you are not familiar with Helm, Helm is a package manager for Kubernetes, which help us to package and distribute Kubernetes manifest. Helm also deals with installing, labeling and dependency management between packages (charts). Because we have Zeebe Helm packages already here: [http://helm.zeebe.io](http://helm.zeebe.io) which are automatically versioned and released, the Zeebe Kubernetes Operator will use these charts to create and manage new clusters and other related components. + + +Because we are in Kubernetes realms we need to provide a declarative way of stating that we want a new Zeebe cluster to be provisioned. For this reason, the ZeebeCluster Custom Resource Definition (CRD) is introduced. This resource contains all the information needed to provision a cluster and it will also reflect the current cluster status. The Zeebe Kubernetes Operator is built to monitor ZeebeCluster resources and interact with the Kubernetes APIs under the hood to make sure that the Zeebe cluster is provisioned, upgraded or deleted correctly. + +## Getting started + +The Zeebe Kubernetes Operator can be installed using Helm, as it is provided as a Helm chart as well. In contrast with `zeebe-cluster`, `zeebe-operate` and `zeebe-full` charts, the operator chart installation by itself doesn’t install any Zeebe cluster, but allows you to do that by creating ZeebeCluster CRD resources. + +The following steps will guide you to install the Operator with Helm3 (which is the default version now) + +This will also work if you have correctly installed Helm2 in your cluster with tiller. +Add the Zeebe Helm repository: + +``` +helm repo add zeebe https://helm.zeebe.io +helm repo update +``` + +Now you are ready to install the Zeebe Kubernetes Operator: + +``` +helm install zeebe-operator zeebe/zeebe-operator +``` + +Create my-zeebe-cluster.yaml + +``` +apiVersion: zeebe.zeebe.io/v1 +kind: ZeebeCluster +metadata: + name: my-zeebe-cluster +``` + +Create the resource within the Kubernetes cluster with: + +``` +kubectl apply -f my-zeebe-cluster.yaml +``` + + +This will create a new namespace with the name stated in the ZeebeCluster resource ( `ZeebeCluster.metadata.name` ) and provision a new Zeebe Cluster plus ElasticSearch by default. + +Future versions will allow you to specify in the ZeebeCluster resource which ElasticSearch instance to use. + +Notice that the first time provisioning a cluster, docker images will be downloaded to the Kubernetes Docker registry so the first cluster might take more time to be provisioned. + +You can now query for your Zeebe clusters using the `kubectl` CLI: + +``` +kubectl get zb +``` + +If you delete the ZeebeCluster resource the actual ZeebeCluster will be automatically removed from your cluster. +Now you can check that there is a new “Namespace” created with: + +``` +kubectl get ns +``` + +And also check that the cluster is correctly provisioned by looking at the Pods created inside the newly created namespace with + +``` +kubectl get pods -n -w +``` + +The next video show these commands in action along with the installation of the Zeebe Kubernetes Operator: + +![Intro video](https://www.youtube.com/watch?v=U-crhMfuJgY) + + +## Technical details and dependencies + +This Kubernetes Operator was built using KubeBuilder V2.1+, Tekton 0.8.0+ and Helm 3. + +The Operator Defines currently 1 CRD (Custom Resource Definition): `ZeebeCluster`, but in future versions, new types will be defined for other components such as Zeebe Operate and workers. The ZeebeCluster resource represent a low-level resource which will instantiate a Zeebe cluster based on predefined parameters. This low-level resource definition can be used to define the cluster topology and HA configurations. + +The Zeebe Kubernetes Operator was built using the [kubebuilder framework](https://github.com/kubernetes-sigs/kubebuilder) for writing the controller’s logic and scaffolding the CRD type. Internally it does interact with [Tekton Pipelines](https://github.com/tektoncd/pipeline) in order to install and manage Zeebe Helm charts. The project itself is being built, released and tested using [Jenkins X](https://jenkins-x.io/). This leads to some changes in how KubeBuilder’s project is structured, as in its current shape the project is not organised in a way that is easy to create a Helm chart out of it. + +The main flow of the Operator works like this: +![Flow](assets/zeebe-operator-flow.png) + + +First, the Operator will be constantly looking for ZeebeCluster resources. When one is found a new Namespace is created and a Tekton Task and TaskRun are created to “upgrade” the Helm charts defined inside the Version Stream repository (hosted here: https://github.com/zeebe-io/zeebe-version-stream-helm ). + +This repository (referred as Version Stream Repository) contains a list of blessed versions that will be installed when a new ZeebeCluster resource is detected by the operator. Using a Version Stream repository provides us with the flexibility to evolve the operator code and the charts that define what needs to be provisioned independently. This allows for a simple upgrade path to future versions by using a Git repository as central reference to a stable version. + +In future versions, the option to choose a version stream repository will be provided, allowing different streams. + +The Task created in Tekton Pipelines execute two basic operations: + +- First, clone Version Stream repository (using simple git clone) +Run Helm Upgrade of the chart defined in the Version Stream Repository (it will automatically upgrade/install if it doesn’t exist) + +- Then, running Helm upgrade/install will create a Helm release which can be upgraded if new versions of the charts are available. These releases can be queried using the Helm cli tool: ` helm list --all-namespaces`. + +Once the task is created an execution is triggered by the creation of a TaskRun (an actual instance of the task) and the operator will monitor for this task to be completed. Once the task is completed, the Operator watches for the Zeebe Cluster to be provisioned. In a more detailed look, the Operator will look for a StatefulSet (Zeebe broker nodes) with a set of labels matching the ZeebeCluster name, inside the created namespace. + +Once the StatefulSet is located, the Operator assigns the ZeebeCluster resource as the Owner of this StatefulSet, hence it will be notified about the changes emitted by the resources associated to the StatefulSet. This allows the Operator to externalise a health status of the Zeebe cluster at any given point, understanding the actual state of the cluster itself. diff --git a/docs/product-manuals/zeebe/introduction/assets/order-process.bpmn b/docs/product-manuals/zeebe/deployment-guide/local/assets/order-process.bpmn similarity index 100% rename from docs/product-manuals/zeebe/introduction/assets/order-process.bpmn rename to docs/product-manuals/zeebe/deployment-guide/local/assets/order-process.bpmn diff --git a/docs/product-manuals/zeebe/deployment-guide/local/assets/order-process.png b/docs/product-manuals/zeebe/deployment-guide/local/assets/order-process.png new file mode 100644 index 00000000000..07e87b95d02 Binary files /dev/null and b/docs/product-manuals/zeebe/deployment-guide/local/assets/order-process.png differ diff --git a/docs/product-manuals/zeebe/deployment-guide/local/install.md b/docs/product-manuals/zeebe/deployment-guide/local/install.md new file mode 100644 index 00000000000..488571d8c85 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/local/install.md @@ -0,0 +1,44 @@ +--- +id: install +title: "Local installation" +sidebar_label: "Install" +--- + +This page guides you through the initial installation of the Zeebe broker and Zeebe Modeler for development purposes. + +## Prerequisites + +- Operating System: + - Linux + - Windows/MacOS (development only, not supported for production) +- Java Virtual Machine: + - Oracle Hotspot 11, or + - Open JDK 11 + +## Download a distribution + +You can always download the latest Zeebe release from the [Github release page](https://github.com/zeebe-io/zeebe/releases). + +Once you have downloaded a distribution, extract it into a folder of your choice. To extract the Zeebe distribution and start the broker, **Linux users** can type: + +```bash +tar -xzf zeebe-distribution-X.Y.Z.tar.gz -C zeebe/ +./bin/broker +``` + +**Windows users** can download the `.zip` package and extract it using their favorite unzip tool. They can then open the extracted folder, navigate to the `bin` folder and start the broker by double-clicking on the `broker.bat` file. + +Once the Zeebe broker has started, it should produce the following output: + +``` +bash +23:39:13.246 [] [main] INFO io.zeebe.broker.system - Scheduler configuration: Threads{cpu-bound: 2, io-bound: 2}. +23:39:13.270 [] [main] INFO io.zeebe.broker.system - Version: X.Y.Z +23:39:13.273 [] [main] INFO io.zeebe.broker.system - Starting broker with configuration { +``` + +## Install the Zeebe Modeler + +The Zeebe Modeler is an open-source desktop BPMN modeling application created specifically for Zeebe. + +[You can download the most recent Zeebe Modeler release here.](https://github.com/zeebe-io/zeebe-modeler/releases) diff --git a/docs/product-manuals/zeebe/deployment-guide/local/quickstart.md b/docs/product-manuals/zeebe/deployment-guide/local/quickstart.md new file mode 100644 index 00000000000..68209e841a0 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/local/quickstart.md @@ -0,0 +1,224 @@ +--- +id: quickstart +title: "Quickstart" +--- + +This quickstart guide introduces you the main concepts of Zeebe without +the need to write a single line of code in 5 steps. + +## Step 1: Download the Zeebe distribution + +You can download the latest distribution from the [Zeebe release page](https://github.com/zeebe-io/zeebe/releases). + +Extract the archive and enter the Zeebe directory. + +``` +tar -xzvf zeebe-distribution-X.Y.Z.tar.gz +cd zeebe-broker-X.Y.Z/ +``` + +**Note:** Some command examples might not work on Windows if you use cmd or +Powershell. For Windows users we recommend to use a bash-like shell, i.e. Git +Bash, Cygwin or MinGW for this guide. + +Inside the Zeebe directory you will find multiple directories. + +``` +tree -d +``` + +``` +. +├── bin - Binaries and start scripts of the distribution +├── conf - Zeebe and logging configuration +└── lib - Shared java libraries +``` + +## Step 2: Start the Zeebe broker + +To start a Zeebe broker use the `broker` or `broker.bat` file located in the +`bin/` folder. + +``` +./bin/broker +``` + +``` +23:39:13.246 [] [main] INFO io.zeebe.broker.system - Scheduler configuration: Threads{cpu-bound: 2, io-bound: 2}. +23:39:13.270 [] [main] INFO io.zeebe.broker.system - Version: X.Y.Z +23:39:13.273 [] [main] INFO io.zeebe.broker.system - Starting broker with configuration { +``` + +You will see some output which contains the version of the broker and +configuration parameters like directory locations and API socket addresses. + +To continue this guide open another terminal to execute commands using the +Zeebe CLI `zbctl`. + +We can now check the status of the Zeebe broker. + +> **Note:** By default, the embedded gateway listens to a plaintext connection but the clients are configured to use TLS. Therefore, all `zbctl` commands in the quickstart will specify the `--insecure` flag. + +``` +./bin/zbctl --insecure status +``` + +``` +Cluster size: 1 +Partitions count: 1 +Replication factor: 1 +Brokers: + Broker 0 - 0.0.0.0:26501 + Partition 1 : Leader +``` + +## Step 3: Deploy a workflow + +A [workflow](/product-manuals/concepts/workflows.md) is used to orchestrate loosely coupled job +workers and the flow of data between them. + +In this guide we will use an example process `order-process.bpmn`. You can +download it with the following link: +[order-process.bpmn](assets/order-process.bpmn). + +![order-process](assets/order-process.png) + +The process describes a sequential flow of three tasks _Collect Money_, _Fetch +Items_ and _Ship Parcel_. If you open the `order-process.bpmn` file in a text +editor you will see that every task has an attribute `type` defined in the XML +which is later used as job type. + +``` + + + + + + + + + + + + + + + + + + + +``` + +To complete an instance of this workflow we would need to activate and complete one job for each of +the types `payment-service`, `inventory-service` and `shipment-service`. + +But first let's deploy the workflow to the Zeebe broker. + +``` +./bin/zbctl --insecure deploy order-process.bpmn +``` + +``` +{ + "key": 2251799813685250, + "workflows": [ + { + "bpmnProcessId": "order-process", + "version": 1, + "workflowKey": 2251799813685249, + "resourceName": "order-process.bpmn" + } + ] +} +``` + +## Step 4: Create a workflow instance + +After the workflow is deployed we can create new instances of it. Every +instance of a workflow is a single execution of the workflow. To create a new +instance we have to specify the process ID from the BPMN file, in +our case the ID is `order-process` as defined in the `order-process.bpmn`: + +``` + +``` + +Every instance of a workflow normally processes some kind of data. We can +specify the initial data of the instance as variables when we start the instance. + +> **Note:** Windows users who want to execute this command using cmd or Powershell +> have to escape the variables differently. +> +> - cmd: `"{\"orderId\": 1234}"` +> - Powershell: `'{"\"orderId"\": 1234}'` + +``` +./bin/zbctl --insecure create instance order-process --variables '{"orderId": 1234}' +``` + +``` +{ + "workflowKey": 2251799813685249, + "bpmnProcessId": "order-process", + "version": 1, + "workflowInstanceKey": 2251799813685251 +} +``` + +## Step 5: Complete a workflow instance + +To complete the instance all three tasks have to be executed. In Zeebe a job is +created for every task which is reached during workflow instance execution. In +order to finish a job and thereby the corresponding task it has to be activated +and completed by a [job worker](/product-manuals/concepts/job-workers.md). A job worker is a +long living process which repeatedly tries to activate jobs for a given job +type and completes them after executing its business logic. The `zbctl` also +provides a command to spawn simple job workers using an external command or +script. The job worker will receive for every job the workflow instance variables as JSON object on +`stdin` and has to return its result also as JSON object on `stdout` if it +handled the job successfully. + +In this example we use the unix command `cat` which just outputs what it receives +on `stdin`. To complete a workflow instance we now have to create a job worker for +each of the three task types from the workflow definition: `payment-service`, +`inventory-service` and `shipment-service`. + +> **Note:** For Windows users this command does not work with cmd as the `cat` +> command does not exist. We recommend to use Powershell or a bash-like shell +> to execute this command. + +``` +./bin/zbctl --insecure create worker payment-service --handler cat & +./bin/zbctl --insecure create worker inventory-service --handler cat & +./bin/zbctl --insecure create worker shipment-service --handler cat & +``` + +``` +2019/06/06 20:54:36 Handler completed job 2251799813685257 with variables +{"orderId":1234} +2019/06/06 20:54:36 Activated job 2251799813685264 with variables +{"orderId":1234} +2019/06/06 20:54:36 Handler completed job 2251799813685264 with variables +{"orderId":1234} +2019/06/06 20:54:36 Activated job 2251799813685271 with variables +{"orderId":1234} +2019/06/06 20:54:36 Handler completed job 2251799813685271 with variables +{"orderId":1234} +``` + +After the job workers are running in the background we can create more instances +of our workflow to observe how the workers will complete them. + +``` +./bin/zbctl --insecure create instance order-process --variables '{"orderId": 12345}' +``` + +To close all job workers use the `kill` command to stop the background processes. + +``` +kill %1 %2 %3 +``` + +If you want to visualize the state of the workflow instances you can start the +[Zeebe simple monitor](https://github.com/zeebe-io/zeebe-simple-monitor). diff --git a/docs/product-manuals/zeebe/operations/assets/example-setup-cluster.png b/docs/product-manuals/zeebe/deployment-guide/operations/assets/example-setup-cluster.png similarity index 100% rename from docs/product-manuals/zeebe/operations/assets/example-setup-cluster.png rename to docs/product-manuals/zeebe/deployment-guide/operations/assets/example-setup-cluster.png diff --git a/docs/product-manuals/zeebe/operations/assets/grafana-preview.png b/docs/product-manuals/zeebe/deployment-guide/operations/assets/grafana-preview.png similarity index 100% rename from docs/product-manuals/zeebe/operations/assets/grafana-preview.png rename to docs/product-manuals/zeebe/deployment-guide/operations/assets/grafana-preview.png diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/backpressure.md b/docs/product-manuals/zeebe/deployment-guide/operations/backpressure.md new file mode 100644 index 00000000000..affdc66db38 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/backpressure.md @@ -0,0 +1,95 @@ +--- +id: backpressure +title: "Backpressure" +--- + +When a broker receives a client request, it is written to the _event stream_ first (see section [Internal processing](../../technical-concepts/internal-processing.md) for details), and processed later by the stream processor. +If the processing is slow or if there are many client requests in the stream, it might take too long for the processor to start processing the command. +If the broker keeps accepting new requests from the client, the back log increases and the processing latency can grow beyond an acceptable time. +To avoid such problems, Zeebe employs a backpressure mechanism. +When the broker receives more requests than it can process with an acceptable latency, it rejects some requests (see [Technical error handling](/reference/grpc.md#technical-error-handling)). + +### Terminology + +- _RTT_ - The time between the request is accepted by the broker and the response to the request is sent back to the gateway. +- _inflight count_ - The number of requests accepted by the broker but the response is not yet sent. +- _limit_ - maximum number of flight requests. When the inflight count is above the limit, any new incoming request will be rejected. + +Note that the limit and inflight count are calculated per partition. + +### Backpressure algorithms + +Zeebe uses adaptive algorithms from [concurrency-limits](https://github.com/Netflix/concurrency-limits) to dynamically calculate the limit. +Zeebe can be configured with one of the following backpressure algorithms. + +#### Fixed Limit + +With “fixed limit” one can configure a fixed value of the limit. +Zeebe operators are recommended to evaluate the latencies observed with different values for limit. +Note that with different cluster configurations, you may have to choose different limit values. + +#### AIMD + +AIMD calculates the limit based on the configured _requestTimeout_. +When the RTT for a request _requestTimeout_, the limit is increased by 1. +When the RTT is longer than _requestTimeout_, +the limit will be reduced according to the configured _backoffRatio_. + +#### Vegas + +Vegas is an adaptive limit algorithm based on TCP Vegas congestion control algorithm. +Vegas estimates a base latency as the minimum observed latency. +This base RTT is the expected latency when there is no load. +Whenever the RTT deviates from the base RTT, a new limit is calculated based on the vegas algorithm. +Vegas allows to configure two parameters - _alpha_ and _beta_. +The values correspond to a queue size that is estimated by the Vegas algorithm based on the observed RTT, base RTT, and current limit. +When the queue size is below _alpha_, the limit is increased. +When the queue size is above _beta_, the limit is decreased. + +### Gradient + +Gradient is an adaptive limit algorithm that dynamically calculates the limit based on observed RTT. +In the gradient algorithm, the limit is adjusted based on the gradient of observed RTT and an observed minimum RTT. +If gradient is less than 1, the limit is decreased otherwise the limit is increased. + +### Gradient2 + +Gradient2 is similar to Gradient, but instead of using observed minimum RTT as the base, it uses and exponentially smoothed average RTT. + +## Backpressure tuning + +The goal of backpressure is to keep the processing latency low. +The processing latency is calculated as the time between the command is written to the event stream until it is processed. +Hence to see how backpressure behaves you can run a benchmark on your cluster and observe +the following metrics. + +- `zeebe_stream_processor_latency_bucket` +- `zeebe_dropped_request_count_total` +- `zeebe_received_request_count_total` +- `zeebe_backpressure_requests_limit` + +You may want to run the benchmark with different load + +1. With low load - where the number of requests send per second is low. +2. With high load - where the number of requests sent per second is above what zeebe can process within a reasonable latency. + +If the value of the limit is small, the processing latency will be small but the number of rejected requests may be high. +If the value of the limit is large, less requests may be rejected (depending on the request rate), +but the processing latency may increase. + +When using "fixed limit", you can run the benchmark with different values for the limit. +You can then determine a suitable value for a limit for which the processing latency (`zeebe_stream_processor_latency_bucket`) is within the desired latency. + +When using "AIMD", you can configure a `requestTimeout` which corresponds to a desired latency. +Note that during high load "AIMD" can lead to a processing latency two times more than the configured `requestTimeout`. +It is also recommended to configure a `minLimit` to prevent the limit from aggressively dropping during constant high load. + +When using Vegas, you cannot configure the backpressure to a desired latency. +Instead Vegas tries to keep the RTT as low as possible based on the observed minimum RTT. + +Similar to Vegas, you cannot configure the desired latency in Gradient and Gradient2. +They calculated the limit based on the gradient of observed RTT from the expected RTT. +Higher the value of _rttTolerance_, higher deviations are tolerated that results in higher values for limit. + +If a lot of requests are rejected due to backpressure, it might indicate that the processing capacity of the cluster is not enough to handle the expected throughput. +If this is the expected workload, then you might consider a different configuration for the cluster such as provisioning more resources and, increasing the number of nodes and partitions. diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/disk-space.md b/docs/product-manuals/zeebe/deployment-guide/operations/disk-space.md new file mode 100644 index 00000000000..8041081430a --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/disk-space.md @@ -0,0 +1,19 @@ +--- +id: disk-space +title: "Disk space" +--- + +Zeebe uses the local disk for storage of it's persistent data. Therefore if the Zeebe broker runs out of disk space the system is in an invalid state, as the broker cannot +update it's state. + +To prevent the system to end in an unrecoverable state Zeebe expects a minimum size of free disk space available. If this limit is violated the broker will reject new +requests, to allow the operations team to free more disk space and the broker to continue to update it's state. + +Zeebe can be configured with the following settings for the disk usage watermarks: + +- **zeebe.broker.data.diskUsageMonitoringEnabled**: configure if disk usage should be monitored (default: true) +- **zeebe.broker.data.diskUsageReplicationWatermark**: the fraction of used disk space before the replication is paused (default: 0.99) +- **zeebe.broker.data.diskUsageCommandWatermark**: the fraction of used disk space before new user commands are rejected (default: 0.97), this has to be less then `diskUsageReplicationWatermark` +- **zeebe.broker.data.diskUsageMonitoringInterval**: the interval in which the disk space usage is checked (default 1 second) + +For **production** use cases we recommend to set the values for `diskUsageReplicationWatermark` and `diskUsageCommandWatermark` to smaller values, for example `diskUsageReplicationWatermark=0.9` and `diskUsageCommandWatermark=0.8`. diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/health.md b/docs/product-manuals/zeebe/deployment-guide/operations/health.md new file mode 100644 index 00000000000..b3ee75127ac --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/health.md @@ -0,0 +1,96 @@ +--- +id: health +title: "Health status" +--- + +## Broker + +Zeebe broker exposes two http endpoints to query its health status: + +- Ready check +- Health check + +### Ready check + +Ready check endpoint is exposed via `http://{zeebe-broker}:{zeebe.broker.network.monitoringApi.port}/ready` (by default port 9600). +This endpoint return an empty 204 response. If it is not ready, it will return a 503 error. + +A broker is ready when it has installed all necessary services to start processing in all partitions. +A broker is ready doesn't mean that it is the leader for the partitions. +It only means that it is participating in the replication and can be either a leader or a follower of all the partitions that is assigned to it. +Once it is ready it will never become unready again. + +A ready check is useful, for example, to use as a `readinessProbe` in a kubernetes configuration to control when a pod can be restarted for rolling upgrade. +Depending on the cluster configuration, restarting one pod before the previous one is ready might make the system unavailable because the quorum of replicas is not available. +By configuring a `readinessProbe` that uses the ready check endpoint we can inform Kubernetes when it is safe to proceed with rolling update. + +### Health check + +Health check endpoint is exposed via `http://{zeebe-broker}:{zeebe.broker.network.monitoringApi.port}/health` (by default port 9600). +This endpoint return an empty 204 response if the broker is healthy. If it is not healthy, it will return a 503 error. +A broker is never healthy before it is ready. +Unlike ready check, a broker can become unhealthy after it is healthy. +Hence it gives a better status of a running broker. + +A broker is healthy, when it can process workflows, accepts commands, and perform all its expected tasks. +If it is unhealthy, then it can mean three things: + +- **it is only temporarily unhealthy**, e.g. due to environmental circumstances such as temporary I/O issues +- **it is partially unhealthy**, could mean that one or more partitions is unhealthy, while the rest of them are able to process workflows +- **it is completely dead** + +[Metrics](metrics.md) give more insight into which partition is healthy or unhealthy. +When a broker becomes unhealthy, it is recommended to check the logs to see what went wrong. + +## Gateway + +Zeebe gateway exposes three HTTP endpoints to query its health status: + +- Health status - `http://{zeebe-gateway}:9600/health` +- Startup probe - `http://{zeebe-gateway}:9600/actuator/health/startup` +- Liveness probe - `http://{zeebe-gateway}:9600/actuator/health/liveness` + +(The default port can be changed in the configuration: `{zeebe.gateway.monitoring.port}`) + +### Health status + +The gateway is healthy if it: + +- Started successfully +- Has sufficient free memory and disk space to work with +- Is able to respond to requests within a defined timeout +- Is aware of other nodes in the cluster +- Is aware of leaders for partitions + +### Startup probe + +The gateway is started if it finished its boot sequence successfully and is ready to receive requests. It is no longer started when it initiated the shutdown sequence. + +The started probe can be used as Kubernetes startup probe. + +### Liveness probe + +The gateway is live if it: + +- Started successfully +- Has a minimal amount of free memory and disk space to work with +- Is able to respond to requests within a defined timeout, or misses the timeout for less than 10 minutes +- Is aware of other nodes in the cluster, or lost awareness of other nodes for less than 5 minutes +- Is aware of leaders for partitions, or lost awareness of partition leaders for less than 5 minutes + +The liveness probe can be used as Kubernetes liveness probe. + +### Status responses + +Each endpoint returns a status which can be one of + +- `UNKNWON` (HTTP status code 200) +- `UP` (HTTP status code 200) +- `DOWN` (HTTP status code 503) +- `OUT_OF_SERVICE` (HTTP status code 503) + +If details are enabled (default) the response will also contain additional details. + +### Customization + +Health indicators are set to sensible defaults. For specific use cases, it might be necessary to [customize health indicators](../configuration/gateway-health-probes.md). diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/index.md b/docs/product-manuals/zeebe/deployment-guide/operations/index.md new file mode 100644 index 00000000000..240d36ffd8a --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/index.md @@ -0,0 +1,16 @@ +--- +id: index +title: "Operating Zeebe in Production" +sidebar_label: "Overview" +--- + +This chapter covers topics relevant for anyone who wants to operate Zeebe in production. + +- [Resource planning](resource-planning.md) - Gives an introduction for calculating how many resources need to be provisioned. +- [Network ports](network-ports.md) - Discusses which ports are needed to run Zeebe +- [Setting up a Zeebe cluster](setting-up-a-cluster.md) - Quick guide on how to set up a cluster with multiple brokers. +- [Metrics](metrics.md) - Lists options to monitor Zeebe. +- [Health status](health.md) - Lists available high level health and liveness probes. +- [Backpressure](backpressure.md) - Discusses the backpressure mechanism used by Zeebe brokers. +- [Disk space](disk-space.md) - Explains how to set limits for the amount of free disk space. Once these limits are undercut, Zeebe will degrade gracefully to allow the operations team to provide more disk space. +- [Upgrade zeebe](upgrade-zeebe.md) - Contains information on how to perform a rolling upgrade. diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/metrics.md b/docs/product-manuals/zeebe/deployment-guide/operations/metrics.md new file mode 100644 index 00000000000..b2d0ba05b4b --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/metrics.md @@ -0,0 +1,101 @@ +--- +id: metrics +title: "Metrics" +--- + +When operating a distributed system like Zeebe, it is important to put proper monitoring in place. +To facilitate this, Zeebe exposes an extensive set of metrics. + +Zeebe exposes metrics over an embedded HTTP server. + +## Types of metrics + +- **Counters**: a time series that records a growing count of some unit. Examples: number of bytes transmitted over the network, number of workflow instances started +- **Gauges**: a time series that records the current size of some unit. Examples: number of currently open client connections, current number of partitions + +## Metrics format + +Zeebe exposes metrics directly in Prometheus text format. +The details of the format can be read in the [Prometheus documentation][prom-format]. + +**Example:** + +``` +# HELP zeebe_stream_processor_events_total Number of events processed by stream processor +# TYPE zeebe_stream_processor_events_total counter +zeebe_stream_processor_events_total{action="written",partition="1",} 20320.0 +zeebe_stream_processor_events_total{action="processed",partition="1",} 20320.0 +zeebe_stream_processor_events_total{action="skipped",partition="1",} 2153.0 +``` + +## Configuring metrics + +The HTTP server to export the metrics can be configured in the [configuration file](../configuration/configuration.md). + +## Connecting Prometheus + +As explained, Zeebe exposes the metrics over a HTTP server. The default port is `9600`. + +Add the following entry to your `prometheus.yml`: + +``` +- job_name: zeebe + scrape_interval: 15s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - localhost: 9600 +``` + +## Available metrics + +All Zeebe related metrics have a `zeebe_`-prefix. + +Most metrics have the following common label: + +- `partition`: cluster-unique id of the partition + +**Metrics related to workflow processing:** + +- `zeebe_stream_processor_events_total`: The number of events processed by the stream processor. + The `action` label separates processed, skipped and written events. +- `zeebe_exporter_events_total`: The number of events processed by the exporter processor. + The `action` label separates exported and skipped events. +- `zeebe_element_instance_events_total`: The number of occurred workflow element instance events. + The `action` label separates the number of activated, completed and terminated elements. + The `type` label separates different BPMN element types. +- `zeebe_running_workflow_instances_total`: The number of currently running workflow instances, i.e. + not completed or terminated. +- `zeebe_job_events_total`: The number of job events. The `action` label separates the number of + created, activated, timed out, completed, failed and canceled jobs. +- `zeebe_pending_jobs_total`: The number of currently pending jobs, i.e. not completed or terminated. +- `zeebe_incident_events_total`: The number of incident events. The `action` label separates the number + of created and resolved incident events. +- `zeebe_pending_incidents_total`: The number of currently pending incident, i.e. not resolved. + +**Metrics related to performance:** + +Zeebe has a back-pressure mechanism by which it rejects requests, when it receives more requests than it can handle with out incurring high processing latency. +The following metrics can be used to monitor back-pressure and processing latency of the commands. + +- `zeebe_dropped_request_count_total`: The number of user requests rejected by the broker due to backpressure. +- `zeebe_backpressure_requests_limit`: The limit for the number of inflight requests used for backpressure. +- `zeebe_stream_processor_latency_bucket`: The processing latency for commands and event. + +**Metrics related to health:** + +The health of partitions in a broker can be monitored by the metric `zeebe_health`. + +[prom-format]: https://prometheus.io/docs/instrumenting/exposition_formats/#text-format-details + +## Grafana + +Zeebe comes with a pre-built dashboard, available in the repository: +[monitor/grafana/zeebe.json](https://github.com/zeebe-io/zeebe/tree/develop/monitor/grafana/zeebe.json) + +[Import](https://grafana.com/docs/grafana/latest/reference/export_import/#importing-a-dashboard) +it into your Grafana instance, then select the correct Prometheus data source (important if you have more than one), and +you should be greeted with the following dashboard: + +![cluster](assets/grafana-preview.png) diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/network-ports.md b/docs/product-manuals/zeebe/deployment-guide/operations/network-ports.md new file mode 100644 index 00000000000..d8a17451fbc --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/network-ports.md @@ -0,0 +1,58 @@ +--- +id: network-ports +title: "Network ports" +--- + +The broker cluster sits behind the gRPC Gateway, which handles all requests from clients/workers and forwards events to brokers. + +## Gateway + +The gateway needs to receive communication on + +- `zeebe.gateway.network.port: 26500` from clients/workers, and +- `zeebe.gateway.cluster.contactPoint: 127.0.0.1:26502` from brokers + +The relevant [configuration](../configuration/configuration.md) settings are: + +``` +Config file + zeebe: + gateway: + network: + port: 26500 + cluster: + contactPoint: 127.0.0.1:26502 + + +Environment Variables + ZEEBE_GATEWAY_CLUSTER_NETWORK_PORT = 26500 + ZEEBE_GATEWAY_CLUSTER_CONTACTPOINT = 127.0.0.1:26502 +``` + +## Broker + +The broker needs to receive communication from the gateway and from other brokers. It also exposes a port for monitoring. + +- `zeebe.broker.network.commandApi.port: 26501`: Gateway-to-broker communication, using an internal SBE (Simple Binary Encoding) protocol. This is the Command API port. This should be exposed to the gateway. +- `zeebe.broker.network.internalApi.port: 26502`: Inter-broker clustering using the Gossip and Raft protocols for partition replication, broker elections, topology sharing, and message subscriptions. This should be exposed to other brokers and the gateway. +- `zeebe.broker.network.monitoringApi.port: 9600`: Metrics and Readiness Probe. Prometheus metrics are exported on the route `/metrics`. There is a readiness probe on `/ready`. + +The relevant [configuration](../configuration/configuration.md) settings are: + +``` +Config file + zeebe: + broker: + network: + commandAPI: + port: 26501 + internalAPI: + port: 26502 + monitoringApi + port: 9600 + +Environment Variables + ZEEBE_BROKER_NETWORK_COMMANDAPI_PORT = 26501 + ZEEBE_BROKER_NETWORK_INTERNALAPI_PORT = 26501 + ZEEBE_BROKER_NETWORK_MONITOIRNGAPI_PORT = 26501 +``` diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/resource-planning.md b/docs/product-manuals/zeebe/deployment-guide/operations/resource-planning.md new file mode 100644 index 00000000000..4675cd7d947 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/resource-planning.md @@ -0,0 +1,146 @@ +--- +id: resource-planning +title: "Resource planning" +--- + +The short answer to “_what resources and configuration will I need to take Zeebe to production?_” is: it depends. + +While we cannot tell you exactly what you need - beyond _it depends_ - we can explain what depends, what it depends on, and how it depends on it. + +## Disk space + +All brokers in a partition use disk space to store: + +- The event log for each partition they participate in. By default, this is a minimum of _512MB_ for each partition, incrementing in 512MB segments. The event log is truncated on a given broker when data has been processed and successfully exported by all loaded exporters. +- One periodic snapshots of the running state (in-flight data) of each partition (unbounded, based on in-flight work). + +Additionally, the leader of a partition also uses disk space to store: + +- A projection of the running state of the partition in RocksDB. (unbounded, based on in-flight work) + +To calculate the required amount of disk space, the following "back of the envelope" formula can be used as a starting point: + +``` +neededDiskSpace = replicatedState + localState + +replicatedState = totalEventLogSize + totalSnapshotSize + +totalEventLogSize = followerPartitionsPerNode * eventLogSize * reserveForPartialSystemFailure + +totalSnapshotSize = partitionsPerNode * singleSnapshotSize * 2 +// singleSnapshotSize * 2: +// the last snapshot (already replicated) + +// the next snapshot (in transit, while it is being replicated) + +partitionsPerNode = leaderPartitionsPerNde + followerPartitionsPerNode + +leaderPartitionsPerNode = partitionsCount / numberOfNodes +followerPartitionsPerNode = partitionsCount * replicationFactor / numberOfNodes + +clusterSize = [number of broker nodes] +partitionsCount = [number of partitions] +replicationFactor = [number of replicas per partition] +reserveForPartialSystemFailure = [factor to account for partial system failure] +singleSnapshotSize = [size of a single rocks DB snapshot] +eventLogSize = [event log size for duration of snapshotPeriod] +``` + +Some observations on the scaling of the factors above: + +- `eventLogSize`: This factor scales with the throughput of your system +- `totalSnapshotSize`: This factor scales with the number of in-flight workflows +- `reserveForPartialSystemFailure`: This factor is supposed to be a reserve to account for partial system failure (e.g. loss of quorum inside Zeebe cluster, or loss of connection to external system). See the remainder of this document for a further discussion on the effects of partial system failure on Zeebe cluster and disk space provisioning. + +Many of the factors influencing above formula can be fine-tuned in the [configuration](../configuration/configuration.md). The relevant configuration settings are: + +```yaml +Config file + zeebe: + broker: + data: + logSegmentSize: 512MB + snapshotPeriod: 15m + cluster: + partitionsCount: 1 + replicationFactor: 1 + clusterSize: 1 + +Environment Variables + ZEEBE_BROKER_DATA_LOGSEGMENTSIZE = 512MB + ZEEBE_BROKER_DATA_SNAPSHOTPERIOD = 15m + ZEEBE_BROKER_CLUSTER_PARTITIONSCOUNT = 1 + ZEEBE_BROKER_CLUSTER_REPLICATIONFACTOR = 1 + ZEEBE_BROKER_CLUSTER_CLUSTERSIZE = 1 +``` + +Other factors can be observed in a production-like system with representative throughput. + +If you want to know where to look, by default this data is stored in + +- `segments` - the data of the log split into segments. The log is only appended - its data can be deleted when it becomes part of a new snapshot. +- `state` - the active state. Deployed workflows, active workflow instances, etc. Completed workflow instances or jobs are removed. +- `snapshot` - a state at a certain point in time + +> **Pitfalls** +> +> If you want to avoid exploding your disk space usage, here are a few pitfalls to avoid: +> +> - Do not create a high number of snapshots with a long period between them. +> - Do not configure an exporter which does not not advance its record position (such as the Debug Exporter) + +If you do configure an exporter, make sure to monitor its availability and health, as well as the availability and health the exporter depends on. +This is the Achilles' heel of the cluster. If data cannot be exported, it cannot be removed from the cluster and will accumulate on disk. See _Effect of exporters and external system failure_ further on in this document for an explanation and possible buffering strategies. + +### Event log + +The event log for each partition is segmented. By default, the segment size is 512MB. + +The event log will grow over time, unless and until individual event log segments are deleted. + +An event log segment can be deleted once: + +- all the events it contains have been processed by exporters, +- all the events it contains have been replicated to other brokers, +- all the events it contains have been processed, and +- the maximum number of snapshots has been reached. + +The following conditions inhibit the automatic deletion of event log segments: + +- A cluster loses its quorum. In this case events are queued but not processed. Once a quorum is reestablished, events will be replicated and eventually event log segments will be deleted. +- The max number of snapshots has not been written. Log segment deletion will begin as soon as the max number of snapshots has been reached +- An exporter does not advance its read position in the event log. In this case the event log will grow ad infinitum. + +An event log segment is not deleted until all the events in it have been exported by all configured exporters. This means that exporters that rely on side-effects, perform intensive computation, or experience back pressure from external storage will cause disk usage to grow, as they delay the deletion of event log segments. + +Exporting is only performed on the partition leader, but the followers of the partition do not delete segments in their replica of the partition until the leader marks all events in it as unneeded by exporters. + +We make sure that event log segments are not deleted too early. No event log segment is deleted until a snapshot has been taken that includes that segment. When a snapshot has been taken, the event log is only deleted up to that point. + +### Snapshots + +The running state of the partition is captured periodically on the leader in a snapshot. By default, this period is every 15 minutes. This can be changed in the [configuration](../configuration/configuration.md). + +A snapshot is a projection of all events that represent the current running state of the workflows running on the partition. It contains all active data, for example, deployed workflows, active workflow instances, and not yet completed jobs. + +When the broker has written a new snapshot, it deletes all data on the log which was written before the latest snapshot. + +### RocksDB + +On the lead broker of a partition, the current running state is kept in memory, and on disk in RocksDB. In our experience this grows to 2GB under a heavy load of long-running processes. The snapshots that are replicated to followers are snapshots of RocksDB. + +### Effect of exporters and external system failure + +If an external system relied on by an exporter fails - for example, if you are exporting data to ElasticSearch and the connection to the ElasticSearch cluster fails - then the exporter will not advance its position in the event log, and brokers cannot truncate their logs. The broker event log will grow until the exporter is able to re-establish the connection and export the data. +To ensure that your brokers are resilient in the event of external system failure, give them sufficient disk space to continue operating without truncating the event log until the connection to the external system is restored. + +### Effect on exporters of node failure + +Only the leader of a partition exports events. Only committed events (events that have been replicated) are passed to exporters. The exporter will then update its read position. The exporter read position is only replicated between brokers in the snapshot. It is not itself written to the event log. This means that _an exporter’s current position cannot be reconstructed from the replicated event log, only from a snapshot_. + +When a partition fails over to a new leader, the new leader is able to construct the current partition state by projecting the event log from the point of the last snapshot. The position of exporters cannot be reconstructed from the event log, so it is set to the last snapshot. This means that an exporter can see the same events twice in the event of a fail-over. + +You should assign idempotent ids to events in your exporter if this is an issue for your system. The combination of record position and partition id is reliable as a unique id for an event. + +### Effect of quorum loss + +If a partition goes under quorum (for example: if two nodes in a three node cluster go down), then the leader of the partition will continue to accept requests, but these requests will not be replicated and will not be marked as committed. In this case, they cannot be truncated. This causes the event log to grow. The amount of disk space needed to continue operating in this scenario is a function of the broker throughput and the amount of time to quorum being restored. You should ensure that your nodes have sufficient disk space to handle this failure mode. diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/setting-up-a-cluster.md b/docs/product-manuals/zeebe/deployment-guide/operations/setting-up-a-cluster.md new file mode 100644 index 00000000000..14d3c695bf4 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/setting-up-a-cluster.md @@ -0,0 +1,207 @@ +--- +id: setting-up-a-cluster +title: "Setting up a Zeebe cluster" +--- + +To set up a cluster you need to adjust the `cluster` section +in the Zeebe configuration file. Below is a snippet +of the default Zeebe configuration file: + +```yaml +--- +cluster: + # This section contains all cluster related configurations, to setup a zeebe cluster + + # Specifies the unique id of this broker node in a cluster. + # The id should be between 0 and number of nodes in the cluster (exclusive). + # + # This setting can also be overridden using the environment variable ZEEBE_BROKER_CLUSTER_NODEID. + nodeId: 0 + + # Controls the number of partitions, which should exist in the cluster. + # + # This can also be overridden using the environment variable ZEEBE_BROKER_CLUSTER_PARTITIONSCOUNT. + partitionsCount: 1 + + # Controls the replication factor, which defines the count of replicas per partition. + # The replication factor cannot be greater than the number of nodes in the cluster. + # + # This can also be overridden using the environment variable ZEEBE_BROKER_CLUSTER_REPLICATIONFACTOR. + replicationFactor: 1 + + # Specifies the zeebe cluster size. This value is used to determine which broker + # is responsible for which partition. + # + # This can also be overridden using the environment variable ZEEBE_BROKER_CLUSTER_CLUSTERSIZE. + clusterSize: 1 + + # Allows to specify a list of known other nodes to connect to on startup + # The contact points of the internal network configuration must be specified. + # The format is [HOST:PORT] + # Example: + # initialContactPoints : [ 192.168.1.22:26502, 192.168.1.32:26502 ] + # + # To guarantee the cluster can survive network partitions, all nodes must be specified + # as initial contact points. + # + # This setting can also be overridden using the environment variable ZEEBE_BROKER_CLUSTER_INITIALCONTACTPOINTS + # specifying a comma-separated list of contact points. + # Default is empty list: + initialContactPoints: [] + + # Allows to specify a name for the cluster + # This setting can also be overridden using the environment variable ZEEBE_BROKER_CLUSTER_CLUSTERNAME. + # Example: + clusterName: zeebe-cluster +``` + +## Example + +In this example, we will set up a Zeebe cluster with +five brokers. Each broker needs to get a unique node id. +To scale well, we will bootstrap five partitions +with a replication factor of three. For more information about this, +please take a look into the [clustering](/product-manuals/zeebe/technical-concepts/clustering.md) section. + +The clustering setup will look like this: + +![cluster](assets/example-setup-cluster.png) + +## Configuration + +The configuration of the first broker could look like this: + +```yaml +--- +cluster: + nodeId: 0 + partitionsCount: 5 + replicationFactor: 3 + clusterSize: 5 + initialContactPoints: + [ + ADDRESS_AND_PORT_OF_NODE_0, + ADDRESS_AND_PORT_OF_NODE_1, + ADDRESS_AND_PORT_OF_NODE_2, + ADDRESS_AND_PORT_OF_NODE_3, + ADDRESS_AND_PORT_OF_NODE_4, + ] +``` + +For the other brokers the configuration will slightly change. + +```yaml +--- +cluster: + nodeId: NODE_ID + partitionsCount: 5 + replicationFactor: 3 + clusterSize: 5 + initialContactPoints: + [ + ADDRESS_AND_PORT_OF_NODE_0, + ADDRESS_AND_PORT_OF_NODE_1, + ADDRESS_AND_PORT_OF_NODE_2, + ADDRESS_AND_PORT_OF_NODE_3, + ADDRESS_AND_PORT_OF_NODE_4, + ] +``` + +Each broker needs a unique node id. The ids should be in the range of +zero and `clusterSize - 1`. You need to replace the `NODE_ID` placeholder with an +appropriate value. Furthermore, the +brokers need an initial contact point to start their gossip +conversation. Make sure that you use the address and +**management port** of another broker. You need to replace the +`ADDRESS_AND_PORT_OF_NODE_0` placeholder. + +To guarantee that a cluster can properly recover from network partitions, +it is currently required that all nodes be specified as initial contact points. It is not necessary +for a broker to list itself as initial contact point, but it is safe to do so, and probably simpler +to maintain. + +## Partitions bootstrapping + +On bootstrap, each node will create a partition matrix. + +This matrix depends on the partitions count, replication factor and +the cluster size. If you did the configuration right and +used the same values for `partitionsCount`, `replicationFactor` +and `clusterSize` on each node, then all nodes will generate +the same partition matrix. + +For the current example the matrix will look like the following: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Node 0Node 1Node 2Node 3Node 4
    Partition 0LeaderFollowerFollower--
    Partition 1-LeaderFollowerFollower-
    Partition 2--LeaderFollowerFollower
    Partition 3Follower--LeaderFollower
    Partition 4FollowerFollower--Leader
    + +The matrix ensures that the partitions are well distributed +between the different nodes. Furthermore, it guarantees that +each node knows exactly, which partitions it has +to bootstrap and for which it will become the leader at first (this +could change later, if the node needs to step down for example). + +## Keep alive intervals + +It's possible to specify how often Zeebe clients should send keep alive pings. By default, the official Zeebe clients (Java and Go) send keep alive pings every 45 seconds. This interval can be configured through the clients' APIs and through the `ZEEBE_KEEP_ALIVE` environment variable. When configuring the clients with the environment variable, the time interval must be expressed a positive amount of milliseconds (e.g., 45000). + +It's also possible to specify what is the minimum interval allowed by the gateway before it terminates the connection. By default, gateways terminate connections if they receive more than two pings with an interval less than 30 seconds. This minimum interval can be modified by editing the network section in the respective configuration file or by setting the `ZEEBE_GATEWAY_NETWORK_MINKEEPALIVEINTERVAL` environment variable. diff --git a/docs/product-manuals/zeebe/deployment-guide/operations/upgrade-zeebe.md b/docs/product-manuals/zeebe/deployment-guide/operations/upgrade-zeebe.md new file mode 100644 index 00000000000..f9e6ec05a5c --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/operations/upgrade-zeebe.md @@ -0,0 +1,179 @@ +--- +id: upgrade-zeebe +title: "Upgrade Zeebe" +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +This section describes how to upgrade Zeebe to a new version. + +:::caution +Currently, we are facing an [issue](https://github.com/zeebe-io/zeebe/issues/5581) that can corrupt the data when upgrading to a new version. The issue affects the reprocessing (i.e. rehydrating the data from the records on the log stream) and can be omitted by restoring the data from a snapshot. Please follow the recommended procedure to minimize the risk of losing data. **This issue affects only users upgrading from a version lower than 0.24.4 to 0.24.4 or newer.** +::: + +## Rolling upgrade + +Zeebe is designed to allow a rolling upgrade of a cluster. The brokers can be upgrade one after the other. The other brokers in the cluster continue processing until the whole upgrade is done. + +1. Upgrade the first broker and wait until it is ready again +1. Continue with the next broker until all brokers are upgraded +1. Upgrade the standalone gateways + +:::tip Helm Charts +If you are using the Helm charts, simply update your values file and change the image tag to the new version you wish to upgrade to, then follow the [Helm upgrade guide](https://helm.sh/docs/helm/helm_upgrade/). +::: + +:::caution +If you are upgrading from a Zeebe version lower than 0.24.4, it is not recommended to perform a rolling upgrade. Please follow the recommended upgrade procedure instead. +::: + +## Upgrade procedure for Zeebe < 0.24.4 + +The following procedure describes how to upgrade a Zeebe broker pre 0.24.4. If the cluster contains multiple brokers then these steps can be done for all brokers in parallel. Standalone gateways should be upgraded after all brokers in the cluster are upgraded to avoid mismatches in the protocol version. + +:::caution +This procedure results in a downtime of the whole cluster. +::: + +### Experimental: Detect reprocessing inconsistency + +With Zeebe 0.24.5 and 0.25.1 a new exterimental feature was introduced which detects inconsistency of the logstream on upgrade to mitigate the following issue. + +We recommend to enable it after upgrading Zeebe from a version lower than 0.24.4 to a version greater than or equal to 0.24.4 on the first run after the upgrade, as described in the update proceedure. You can enable it using the following environment variable: + +`ZEEBE_BROKER_EXPERIMENTAL_DETECTREPROCESSINGINCONSISTENCY="true"` + +After you verified that the upgrade was successful, we recommend to disable it again by removing the environment variable and restarting your brokers. + +### Preparing the upgrade + +1. Stop the workflow processing + * Close all job workers + * Interrupt the incoming connections to avoid user commands +1. Wait until a snapshot is created for all partitions + * By default, a snapshot is created every 15 minutes + * Verify that a snapshot is created by looking at the [Metric](metrics.md) `zeebe_snapshot_count` on the leader and the followers + * Note that no snapshot is created if no processing happened since the last snapshot +1. Make a backup of the `data` folder + +### Performing the upgrade + + + + + +1. Shut down the broker +1. Replace the `/bin` and `/lib` folders with the versions of the new distribution +1. Start up the broker with the experimental inconsistency detection enabled +1. [Verify the upgrade](#verifying-the-upgrade) +1. Restart the broker with experimental inconsistency detection disabled + + + + + +1. Shut down the broker +1. Replace the `/bin` and `/lib` folders with the versions of the new distribution +1. Start up the broker +1. [Verify the upgrade](#verifying-the-upgrade) + + + + +### Verifying the upgrade + +The upgrade is successful if the following conditions are met: + +* the broker is ready (see [Ready Check](health.md#ready-check)) +* the broker is healthy (see [Health Check](health.md#health-check)) +* all partitions are healthy (see the [Metric](metrics.md#metrics-related-to-health) `zeebe_health`) +* the stream processors of the partition leaders are in the phase `PROCESSING` (see [Partitions Admin Endpoint](#partitions-admin-endpoint)) + +If the upgrade failed because of a known issue then a partition change its status to unhealthy, and the log output may contain the following error message: + +
    + Sample Upgrade Error Message +

    + +``` +Unexpected error on recovery happens. +io.zeebe.engine.processor.InconsistentReprocessingException: Reprocessing issue detected! + Restore the data from a backup and follow the recommended upgrade procedure. [cause: + "The key of the record on the log stream doesn't match to the record from reprocessing.", + log-stream-record: {"partitionId":1,"value":{"version":1,"bpmnProcessId":"parallel-tasks", + "workflowKey":2251799813685249,"parentElementInstanceKey":-1,"parentWorkflowInstanceKey":-1, + "bpmnElementType":"PARALLEL_GATEWAY","flowScopeKey":2251799813685251, + "elementId":"ExclusiveGateway_0tkgnd5","workflowInstanceKey":2251799813685251}, + "key":2251799813685256,"sourceRecordPosition":4294997784,"valueType":"WORKFLOW_INSTANCE", + "timestamp":1601025180728,"recordType":"EVENT","intent":"ELEMENT_ACTIVATING", + "rejectionType":"NULL_VAL","rejectionReason":"","position":4294998112}, + reprocessing-record: {key=2251799813685255, sourceRecordPosition=4294997784, + intent=WorkflowInstanceIntent:ELEMENT_ACTIVATING, recordType=EVENT}] +``` + +

    +
    + +In this case, the broker should be rolled back to the previous version and the backup should be restored. Ensure that the upgrade was prepared correctly. If it is still unclear why it was not successful then please contact the Zeebe team and ask for guidance. + +## Partitions admin endpoint + +This endpoint allows querying the status of the partitions and performing operations to prepare an upgrade. + += 0.24', value: 'since-0.24', }, +] }> + + + +The endpoint is available under `http://{zeebe-broker}:{zeebe.broker.network.monitoringApi.port}/partitions` (default port: `9600`). + +It is enabled by default and cannot be disabled. + + + + + +The endpoint is available under `http://{zeebe-broker}:{zeebe.broker.network.monitoringApi.port}/actuator/partitions` (default port: `9600`). + +It is enabled by default. It can be disabled in the configuration by setting: + +``` +management.endpoint.partitions.enabled=false +``` + + + + +### Query the partition status + +The status of the partitions can be queried by a `GET` request: +``` +/actuator/partitions +``` + +The response contains all partitions of the broker mapped to the partition-id. + +
    + Full Response +

    + +``` +{ + "1":{ + "role":"LEADER", + "snapshotId":"399-1-1601275126554-490-490", + "processedPosition":490, + "processedPositionInSnapshot":490, + "streamProcessorPhase":"PROCESSING" + } +} +``` + +

    +
    diff --git a/docs/product-manuals/zeebe/deployment-guide/security/authentication.md b/docs/product-manuals/zeebe/deployment-guide/security/authentication.md new file mode 100644 index 00000000000..d73ee891660 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/security/authentication.md @@ -0,0 +1,183 @@ +--- +id: authentication +title: "Authentication" +--- + +Zeebe supports transport layer security between the gateway and all of the officially supported clients. In this section, we will go through how to configure these components. + +## Gateway + +Transport layer security in the gateway is disabled by default. This means that if you are just experimenting with Zeebe or in development, there is no configuration needed. However, if you want to enable authentication you can configure Zeebe in the `security` section of the configuration files. The following configurations are present in both `gateway.yaml.template` and `broker.standalone.yaml.template`, the file you should edit depends on whether you are using a standalone gateway or an embedded gateway. + +```yaml +... + security: + # Enables TLS authentication between clients and the gateway + enabled: false + + # Sets the path to the certificate chain file + certificateChainPath: + + # Sets the path to the private key file location + privateKeyPath: +``` + +`enabled` should be either `true` or `false`, where true will enable TLS authentication between client and gateway, and false will disable it. `certificateChainPath` and `privateKeyPath` are used to configure the certificate with which the server will authenticate itself. `certificateChainPath` should be a file path pointing to a certificate chain in PEM format representing the server's certificate, and `privateKeyPath` a file path pointing to the certificate's PKCS8 private key, also in PEM format. + +Additionally, as you can see in the configuration file, each value can also be configured through an environment variable. The environment variable to use again depends on whether you are using a standalone gateway or an embedded gateway. + +## Clients + +Unlike the gateway, TLS is enabled by default in all of Zeebe's supported clients. The following sections will show how to disable or properly configure each client. + +> **Note:** Disabling TLS should only be done for testing or development. During production deployments, clients and gateways should be properly configured to establish secure connections. + +### Java + +Without any configuration, the client will look in system's certificate store for a CA certificate with which to validate the gateway's certificate chain. If you wish to use TLS without having to install a certificate in client's system, you can specify a CA certificate: + + +```java +public class SecureClient { + public static void main(final String[] args) { + final ZeebeClient client = ZeebeClient.newClientBuilder().caCertificatePath("path/to/certificate").build(); + + // ... + } +} +``` +Alternatively, you can use the `ZEEBE_CA_CERTIFICATE_PATH` environment variable to override the code configuration. + +In order to disable TLS in a Java client, you can use the `.usePlaintext()` option: + +```java +public class InsecureClient { + public static void main(final String[] args) { + final ZeebeClient client = ZeebeClient.newClientBuilder().usePlaintext().build(); + + // ... + } +} +``` + +Alternatively, you can use the `ZEEBE_INSECURE_CONNECTION` environment variable to override the code configuration. To enable an insecure connection, you can it to "true". To use a secure connection, you can set it any non-empty value other than "true". Setting the environment variable to an empty string is equivalent to unsetting it. + +### Go + +Similarly to the Java client, if no CA certificate is specified then the client will look in the default location for a CA certificate with which to validate the gateway's certificate chain. It's also possible to specify a path to a CA certificate in the Go client: + +```go +package test + +import ( + "github.com/zeebe-io/zeebe/clients/go/zbc" +) + + +func main() { + client, err := zbc.NewClient(&zbc.ClientConfig{ + CaCertificatePath: "path/to/certificate", + }) + + // ... +} +``` +To disable TLS, you can simply do: + +```go +package test + +import ( + "github.com/zeebe-io/zeebe/clients/go/zbc" +) + + +func main() { + client, err := zbc.NewClient(&zbc.ClientConfig{ + UsePlaintextConnection: true, + }) + + // ... +} +``` + +As in the Java client, you can use the `ZEEBE_INSECURE_CONNECTION` and `ZEEBE_CA_CERTIFICATE_PATH` to override these configurations. + +### zbctl + +To configure `zbctl` to use a path to a CA certificate: + +``` +./zbctl --certPath /my/certificate/location [arguments] +``` + +To configure `zbctl` to disable TLS: + +``` +./zbctl --insecure [arguments] +``` + +Since `zbctl` is based on the Go client, setting the appropriate environment variables will override these parameters. + +## Troubleshooting authentication issues + +Here we will describe a few ways that the clients and gateway could be misconfigured and what those errors look like. Hopefully, this will help you recognize these situations and provide you with an easy fix. + +### TLS is enabled in `zbctl` but disabled in the gateway + +The client will fail with the following error: + +``` +Error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: authentication handshake failed: tls: first record does not look like a TLS handshake" +``` + +And the following error will be logged by Netty in the gateway: + +``` +Aug 06, 2019 4:23:22 PM io.grpc.netty.NettyServerTransport notifyTerminated +INFO: Transport failed +io.netty.handler.codec.http2.Http2Exception: HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 1603010096010000920303d06091559c43ec48a18b50c028 + at io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:103) + at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.readClientPrefaceString(Http2ConnectionHandler.java:306) + at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:239) + at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:438) + at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505) + at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444) + at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283) + at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) + at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) + at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) + at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1421) + at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) + at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) + at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930) + at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:794) + at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:424) + at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:326) + at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918) + at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) + at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) + at java.lang.Thread.run(Thread.java:748) +``` + +__Solution:__ Either enable TLS in the gateway as well or specify the `--insecure` flag when using `zbctl`. + + +### TLS is disabled in `zbctl` but enabled for the gateway + +`zbctl` will fail with the following error: +``` +Error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection closed +``` + +__Solution:__ Either enable TLS in the client by specifying a path to a certificate or disable it in the gateway by editing the appropriate configuration file. + +### TLS is enabled for both client and gateway but the CA certificate can't be found + +`zbctl` will fail with the following error: + +``` +Error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority +``` + +__Solution:__ Either install the CA certificate in the appropriate location for the system or specify a path to certificate using the methods described above. diff --git a/docs/product-manuals/zeebe/deployment-guide/security/authorization.md b/docs/product-manuals/zeebe/deployment-guide/security/authorization.md new file mode 100644 index 00000000000..266c6f45605 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/security/authorization.md @@ -0,0 +1,221 @@ +--- +id: authorization +title: "Authorization" +--- + +Zeebe clients also provide a way for users to modify gRPC call headers, namely to contain access tokens. Note that the gateway doesn't provide any way of validating these headers, so users must implement a reverse proxy with a gRPC interceptor to validate them. + +Users can modify gRPC headers using Zeebe's built-in `OAuthCredentialsProvider`, which uses user-specified credentials to contact a OAuth authorization server. The authorization server should return an access token that is then appended to each gRPC request. Although, by default `OAuthCredentialsProvider` is configured with to use a Camunda Cloud authorization server, it can be configured to use any user-defined server. Users can also write a custom [CredentialsProvider](https://github.com/zeebe-io/zeebe/blob/develop/clients/java/src/main/java/io/zeebe/client/CredentialsProvider.java). In the following sections we will describe the `CredentialsProvider` interface as well as the built-in implementation. + +## Credentials provider + +As previously mentioned, the `CredentialProvider`'s purpose is to modify the gRPC headers with an authorization method such that a reverse proxy sitting in front of the gateway can validate them. The interface consists of an `applyCredentials` method and a `shouldRetryRequest` method. The first method is called for each gRPC call and takes a map of headers to which it should add credentials. The second method is called whenever a gRPC call fails and takes in the error that caused the failure which is then used to decide whether or not the request should be retried. The following sections implement simple custom provider in Java and Go. + +### Java + +```java +public class MyCredentialsProvider implements CredentialsProvider { + /** + * Adds a token to the Authorization header of a gRPC call. + */ + @Override + public void applyCredentials(final Metadata headers) { + final Key authHeaderkey = Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER); + headers.put(authHeaderKey, "Bearer someToken"); + } + + /** + * Retries request if it failed with a timeout. + */ + @Override + public boolean shouldRetryRequest(final Throwable throwable) { + return ((StatusRuntimeException) throwable).getStatus() == Status.DEADLINE_EXCEEDED; + } +} +``` + +After implementing the `CredentialsProvider`, we can simply provide it when building a client: + +```java +public class SecureClient { + public static void main(final String[] args) { + final ZeebeClient client = ZeebeClient.newClientBuilder().credentialsProvider(new MyCredentialsProvider()).build(); + + // continue... + } +} +``` + +### Go + +```go +package main + +import ( + "context" + "fmt" + "google.golang.org/grpc/status" + "google.golang.org/grpc/codes" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" +) + +type MyCredentialsProvider struct { +} + +// ApplyCredentials adds a token to the Authorization header of a gRPC call. +func (p *MyCredentialsProvider) ApplyCredentials(ctx context.Context, headers map[string]string) error { + headers["Authorization"] = "someToken" + return nil +} + +// ShouldRetryRequest returns true if the call failed with a deadline exceed error. +func (p *MyCredentialsProvider) ShouldRetryRequest(ctx context.Context, err error) bool { + return status.Code(err) == codes.DeadlineExceeded +} + +func main() { + client, err := zbc.NewClient(&zbc.ClientConfig{ + CredentialsProvider: &MyCredentialsProvider{}, + }) + if err != nil { + panic(err) + } + + ctx := context.Background() + response, err := client.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(response.String()) +} +``` + +## OAuthCredentialsProvider + +The `OAuthCredentialsProvider` requires the specification of a client ID and a client secret. These are then used to request an access token from an OAuth 2.0 authorization server through a [client credentials flow](https://tools.ietf.org/html/rfc6749#section-4.4). By default, the authorization server is the one used by Camunda Cloud but any other can be used. Using the access token returned by the authorization server, the `OAuthCredentialsProvider` will add it to the gRPC headers of each request as a bearer token. Requests which fail with an `UNAUTHENTICATED` gRPC code are seamlessly retried if and only if a new access token can be obtained. + +### Java + +To use the Zeebe client with Camunda Cloud, first an `OAuthCredentialsProvider` has to be created and configured with the appropriate client credentials. The `audience` should be equivalent to the cluster endpoint without a port number. + +``` java +public class AuthorizedClient { + public void main(String[] args) { + final OAuthCredentialsProvider provider = + new OAuthCredentialsProviderBuilder() + .clientId("clientId") + .clientSecret("clientSecret") + .audience("cluster.endpoint.com") + .build(); + + final ZeebeClient client = + new ZeebeClientBuilderImpl() + .gatewayAddress("cluster.endpoint.com:443") + .credentialsProvider(provider) + .build(); + + System.out.println(client.newTopologyRequest().send().join().toString()); + } +} +``` + +For security reasons, client secrets should not be hardcoded. Therefore, the recommended way of passing client secrets into Zeebe is to use environment variables. Although several variables are supported, the ones required to set up a minimal client are `ZEEBE_CLIENT_ID` and `ZEEBE_CLIENT_SECRET`. After setting these variables to the correct values, the following would be equivalent to the previous code: + +```java +public class AuthorizedClient { + public void main(final String[] args) { + final ZeebeClient client = + new ZeebeClientBuilderImpl() + .gatewayAddress("cluster.endpoint.com:443") + .build(); + + System.out.println(client.newTopologyRequest().send().join().toString()); + } +} +``` + +The client will create an `OAuthCredentialProvider` with the credentials specified through the environment variables and the audience will be extracted from the address specified through the `ZeebeClientBuilder`. + +> **Note:** Zeebe's Java client will not prevent you from adding credentials to gRPC calls while using an insecure connection but you should be aware that doing so will expose your access token by transmiting it in plaintext. + +### Go +```go +package main + +import ( + "context" + "fmt" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" +) + +func main() { + credsProvider, err := zbc.NewOAuthCredentialsProvider(&zbc.OAuthProviderConfig{ + ClientID: "clientId", + ClientSecret: "clientSecret", + Audience: "cluster.endpoint.com", + }) + if err != nil { + panic(err) + } + + client, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: "cluster.endpoint.com:443", + CredentialsProvider: credsProvider, + }) + if err != nil { + panic(err) + } + + + ctx := context.Background() + response, err := client.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(response.String()) +} +``` + +As was the case with the Java client, it's possible to make use of the `ZEEBE_CLIENT_ID` and `ZEEBE_CLIENT_SECRET` environment variables to simplify the client configuration: + +```go +package main + +import ( + "context" + "fmt" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" +) + +func main() { + client, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: "cluster.endpoint.com:443", + }) + if err != nil { + panic(err) + } + + ctx := context.Background() + response, err := client.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + fmt.Println(response.String()) +} +``` + +> **Note:** Like the Java client, the Go client will not prevent you from adding credentials to gRPC calls while using an insecure connection but doing so will expose your access token. + + +### Environment variables + +Since there are several environment variables that can be used to configure an `OAuthCredentialsProvider`, we list them here along with their uses: + +* `ZEEBE_CLIENT_ID` - the client ID used to request an access token from the authorization server +* `ZEEBE_CLIENT_SECRET` - the client secret used to request an access token from the authorization server +* `ZEEBE_TOKEN_AUDIENCE` - the address for which the token should be valid +* `ZEEBE_AUTHORIZATION_SERVER_URL` - the URL of the authorization server from which the access token will be requested (by default, configured for Camunda Cloud) +* `ZEEBE_CLIENT_CONFIG_PATH` - the path to a cache file where the access tokens will be stored (by default, it's `$HOME/.camunda/credentials`) diff --git a/docs/product-manuals/zeebe/deployment-guide/security/security.md b/docs/product-manuals/zeebe/deployment-guide/security/security.md new file mode 100644 index 00000000000..ef37615b9d6 --- /dev/null +++ b/docs/product-manuals/zeebe/deployment-guide/security/security.md @@ -0,0 +1,10 @@ +--- +id: security +title: "Security" +sidebar_label: "Overview" +--- + +Zeebe supports two security features that you should be aware of: + +- **[Authentication](authentication)** - allows you to secure communication between clients and gateways; +- **[Authorization](authorization)** - allows you to supply access credentials to the client so these can be validated by a reverse proxy placed before the gateway. diff --git a/docs/product-manuals/zeebe/basics/assets/exporters-stream.png b/docs/product-manuals/zeebe/open-source/assets/exporters-stream.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/exporters-stream.png rename to docs/product-manuals/zeebe/open-source/assets/exporters-stream.png diff --git a/docs/product-manuals/zeebe/open-source/community-contributions.md b/docs/product-manuals/zeebe/open-source/community-contributions.md new file mode 100644 index 00000000000..03c5d7d9491 --- /dev/null +++ b/docs/product-manuals/zeebe/open-source/community-contributions.md @@ -0,0 +1,28 @@ +--- +id: community-contributions +title: "Community contributions" +--- + +Zeebe is available as Open Source Software on [GitHub](https://github.com/zeebe-io/zeebe). + +Zeebe welcomes extensions and contributions from the community! + +We use [Awesome Zeebe](https://awesome.zeebe.io/) as a place to keep track of Zeebe ecosystem contributions, such as... + +- clients +- workers +- exporters +- applications + +...along with other integrations such as Spring-Zeebe and the Apache Kafka connector. + +If you built something for the Zeebe ecosystem, we encourage you to [add it to Awesome Zeebe via pull request](https://github.com/zeebe-io/awesome-zeebe/blob/master/CONTRIBUTING.md). + +If you're interested in contributing to the main Zeebe repository (vs. creating an extension that lives in its own repository), be sure to start with the ["Contributing to Zeebe" guide in GitHub](https://github.com/zeebe-io/zeebe/blob/master/CONTRIBUTING.md) + +**Next Steps** + +- [Get help & get involved](get-help-get-involved.md) +- Check out [community extensions](https://awesome.zeebe.io/) +- Learn more about our [release cycle](release-cycle.md) +- Avoid suprises by staying on top of [deprecated features](deprecated-features.md) diff --git a/docs/product-manuals/zeebe/open-source/deprecated-features.md b/docs/product-manuals/zeebe/open-source/deprecated-features.md new file mode 100644 index 00000000000..0019d8b7ee9 --- /dev/null +++ b/docs/product-manuals/zeebe/open-source/deprecated-features.md @@ -0,0 +1,23 @@ +--- +id: deprecated-features +title: "Deprecated features" +--- + +This section lists deprecated features. + +## Deprecated in 0.23.0-alpha2 +- TOML configuration - deprecated and removed in 0.23.0-alpha2 +- Legacy environment variables - deprecated in 0.23.0-alpha2, removed in 0.25.0 + +New configuration: +```yaml +exporters: + elasticsearch: + className: io.zeebe.exporter.ElasticsearchExporter + debughttp: + className: io.zeebe.broker.exporter.debug.DebugHttpExporter +``` + +In terms of specifying values, there were two minor changes: +- Memory sizes are now specified like this: `512MB` (old way: `512M`) +- Durations, e.g. timeouts, can now also be given in ISO-8601 Durations format. However you can still use the established way and specify a timeout of `30s` diff --git a/docs/product-manuals/zeebe/open-source/exporters.md b/docs/product-manuals/zeebe/open-source/exporters.md new file mode 100644 index 00000000000..c1762e6c4df --- /dev/null +++ b/docs/product-manuals/zeebe/open-source/exporters.md @@ -0,0 +1,144 @@ +--- +id: exporters +title: "Exporters" +--- + +As Zeebe processes jobs and workflows, or performs internal maintenance (e.g. +raft failover), it will generate an ordered stream of records: + +![record-stream](assets/exporters-stream.png) + +While the clients provide no way to inspect this stream directly, Zeebe can load +and configure user code that can process each and every one of those records, in the form of an exporter. + +An **exporter** provides a single entry point to process every record that is +written on a stream. + +- Persist historical data by pushing it to an external data warehouse +- Export records to a visualization tool (e.g. [zeebe-simple-monitor](https://github.com/zeebe-io/zeebe-simple-monitor/)) + +Zeebe will only load exporters which are configured through the main Zeebe YAML +configuration file. + +Once an exporter is configured, the next time Zeebe is started, the exporter +will start receiving records. Note that it is only guaranteed to see records +produced from that point on. + +You can find a reference implementation in the form of the Zeebe-maintained +[ElasticSearch exporter](https://github.com/zeebe-io/zeebe/tree/develop/exporters/elasticsearch-exporter). + +The main impact exporters have on a Zeebe cluster is that they remove the burden +of persisting data indefinitely. + +Once data is not needed by Zeebe itself anymore, it will query its exporters to +know if it can be safely deleted, and if so, will permanently erase it, thereby +reducing disk usage. + +> **Note:**, if no exporters are configured at all, then Zeebe will automatically +> erase data when it is not necessary anymore. If you need historical data, +> then you **need** to configure an exporter to stream records into your external +> data warehouse. + +Regardless of how an exporter is loaded (whether through an external JAR or not), +all exporters interact in the same way with the broker, which is defined by the +[Exporter interface](https://github.com/zeebe-io/zeebe/tree/develop/exporter-api/src/main/java/io/zeebe/exporter/api/Exporter.java). + +## Loading + +Once configured, exporters are loaded as part of the broker startup phase, before +any processing is done. + +During the loading phase, the configuration for each exporter is validated, such that +the broker will not start if: + +- An exporter ID is not unique +- An exporter points to a non-existent/non-accessible JAR +- An exporter points to a non-existent/non-instantiable class +- An exporter instance throws an exception in its `Exporter#configure` method. + +The last point is there to provide individual exporters to perform lightweight +validation of their configuration (e.g. fail if missing arguments). + +One of the caveat of the last point is that an instance of an exporter is created and +immediately thrown away; therefore, exporters should not perform any computationally +heavy work during instantiation/configuration. + +> **Note:** Zeebe will create an isolated class loader for every JAR referenced by +> exporter configurations - that is, only once per JAR; if the same JAR is reused to +> define different exporters, then these will share the same class loader. +> +> This has some nice properties, primarily that different exporters can depend on +> the same third party libraries without having to worry about versions, or class +> name collisions. +> +> Additionally, exporters use the system class loader for system classes, or +> classes packaged as part of the Zeebe JAR. + +Exporter specific configuration is handled through the exporter's `[exporters.args]` +nested map. This provides a simple `Map` which is passed directly +in form of a [Configuration](https://github.com/zeebe-io/zeebe/tree/develop/exporter-api/src/main/java/io/zeebe/exporter/api/context/Configuration.java) +object when the broker calls the `Exporter#configure(Configuration)` method. + +Configuration occurs at two different phases: during the broker startup phase, and +once every time a leader is elected for a partition. + +## Processing + +At any given point, there is exactly one leader +node for a given partition. Whenever a node becomes the leader for a partition, one +of the things it will do is run an instance of an +[exporter stream processor](https://github.com/zeebe-io/zeebe/tree/develop/broker/src/main/java/io/zeebe/broker/exporter/stream/ExporterDirector.java). + +This stream processor will create exactly one instance of each configured exporter, +and forward every record written on the stream to each of these in turn. + +> **Note:** this implies that there will be exactly one instance of every exporter for +> every partition: if you have 4 partitions, and at least 4 threads for processing, +> then there are potentially 4 instances of your exporter exporting simultaneously. + +Note that Zeebe only guarantees at-least-once semantics, that is, a record will be +seen at least once by an exporter, and maybe more. Cases where this may happen +include: + +- During reprocessing after raft failover (i.e. new leader election) +- On error if the position has not been updated yet + +To reduce the amount of duplicate records an exporter will process, the stream +processor will keep track of the position of the last successfully exported record +for every single exporter; the position is sufficient since a stream is an ordered +sequence of records whose position is monotonically increasing. This position is +set by the exporter itself once it can guarantee a record has been successfully +updated. + +> **Note:** although Zeebe tries to reduce the amount of duplicate records an +> exporter has to handle, it is likely that it will have to; therefore, it is +> necessary that export operations be idempotent. +> +> This can be implemented either in the exporter itself, but if it exports to an +> external system, it is recommended that you perform deduplication there to reduce +> the load on Zeebe itself. Refer to the exporter specific documentation for how +> this is meant to be achieved. + +### Error handling + +If an error occurs during the `Exporter#open(Context)` phase, the stream +processor will fail and be restarted, potentially fixing the error; worst case +scenario, this means no exporter is running at all until these errors stop. + +If an error occurs during the `Exporter#close` phase, it will be logged, but will +still allow other exporters to gracefully finish their work. + +If an error occurs during processing, we will retry infinitely the same record until +no error is produced. Worst case scenario, this means a failing exporter could bring +all exporters to a halt. Currently, exporter implementations are expected to +implement their own retry/error handling strategies, though this may change in the +future. + +### Performance impact + +Zeebe naturally incurs a performance impact for each loaded exporter. A slow +exporter will slow down all other exporters for a given partition, and, in the +worst case, could completely block a thread. + +It's therefore recommended to keep exporters as simple as possible, and perform +any data enrichment or transformation through the external system. diff --git a/docs/product-manuals/zeebe/open-source/get-help-get-involved.md b/docs/product-manuals/zeebe/open-source/get-help-get-involved.md new file mode 100644 index 00000000000..a2686425ea9 --- /dev/null +++ b/docs/product-manuals/zeebe/open-source/get-help-get-involved.md @@ -0,0 +1,28 @@ +--- +id: get-help-get-involved +title: "Get help & get involved" +--- + +We provide a few different public-facing Zeebe support and feedback channels so that users can ask questions, report problems, and make contributions. + +### Zeebe user forum + +The best place to ask questions about Zeebe and to troubleshoot issues is the Zeebe user forum. + +The Zeebe team monitors the forum closely, and we do our best to respond to all questions in a timely manner. + +[Go to the Zeebe user forum](https://forum.zeebe.io) + +### Public Slack group + +There is a public Zeebe Slack group where you can ask one-off questions, share community contributions, and connect with other Zeebe users. + +[Join the Zeebe Slack group](https://zeebe-slack-invite.herokuapp.com/) + +### Create an issue in GitHub + +Did you find a problem in Zeebe? Or do you have a suggestion for an improvement? + +You can create an issue in the Zeebe GitHub project to let us know. + +[Go to issues in the Zeebe GitHub repository](https://github.com/zeebe-io/zeebe/issues) diff --git a/docs/product-manuals/zeebe/open-source/release-cycle.md b/docs/product-manuals/zeebe/open-source/release-cycle.md new file mode 100644 index 00000000000..bbf405234f6 --- /dev/null +++ b/docs/product-manuals/zeebe/open-source/release-cycle.md @@ -0,0 +1,72 @@ +--- +id: release-cycle +title: "Release cycle" +--- +### Release cycle + +The Zeebe project follows the [semantic version](https://semver.org/) schema, +which defines a version number using the `MAJOR.MINOR.PATCH` pattern. + +- `MAJOR` version can make incompatible API changes +- `MINOR` version can add functionality in a backwards compatible manner +- `PATCH` version can make backwards compatible bug fixes. + +The Zeebe team strives to release: +- A new minor version of Zeebe every three months +- In between minor versions, two alpha releases (to preview the upcoming minor version) + +At the time of writing, Zeebe supports the last two released minor versions with +patch releases. Patch releases are offered on a best effort basis for the +currently supported versions. + + +### Breaking changes before Zeebe 1.0 + +Given how early we are in the Zeebe journey, we're not ready to make it a 1.0 +release, and we want it to be transparent that this was a deliberate decision. +If we do end up having to make breaking API changes, we'd rather do so before +we get to 1.0 and not by moving to 2.0 just a few months after a 1.0 release. + +Of course, even in Zeebe's pre-1.0 state, we'll always make our best effort to +avoid breaking changes, to communicate early and often about planned changes, +and if possible, to provide a migration path if we do need to make such a change. + + +### Supported environments + + +#### Zeebe + +- **Zeebe Broker/Gateway** - the cluster components of Zeebe require OpenJDK 11+ + and optional if the Elasticsearch exporter is used Elasticsearch 6.8.x +- **Zeebe Java Client** - the Java client for Zeebe requires OpenJDK 8+ +- **Zeebe Go Client** - the Go client for Zeebe requires Go 1.13+ +- **zbctl** - the Zeebe CLI supports latest versions of Windows, MacOS and Linux + +#### Camunda Operate + +- **Operate Web App/Importer/Archiver** - the server components of Camunda + Operate require OpenJDK 11+ and Elasticsearch 6.8.x +- **Operate Browser App** - requires the latest version of Chrome, Firefox or + Edge on Windows, MacOS and Linux + +### Camunda Cloud + +Zeebe is built according to [cloud-native +principles](https://github.com/cncf/toc/blob/master/DEFINITION.md), and we want +Zeebe to be the workflow engine for important, emerging use cases running on +modern software architectures. + +But even with a best-in-class architecture, operating a distributed workflow +engine 24x7 can be challenging and time consuming. We've heard from a number of +users who would be happy to have us run Zeebe and Operate on their behalf. + +With that in mind, we have a dedicated team–additional to the Zeebe core +engineering team building the workflow engine–currently working the first +iteration of Camunda Cloud, where we'll offer Zeebe and Operate as a cloud +service. This will be the first-ever cloud workflow service offered by Camunda, +and we're really excited for what's ahead. + +If you'd like to be notified when we open up a beta program for Camunda Cloud, +you can [sign up here](https://camunda.com/products/cloud/). + diff --git a/docs/product-manuals/zeebe/technical-concepts/architecture.md b/docs/product-manuals/zeebe/technical-concepts/architecture.md new file mode 100644 index 00000000000..7883ab3489a --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/architecture.md @@ -0,0 +1,69 @@ +--- +id: architecture +title: "Architecture" +--- + +There are four main components in Zeebe's architecture: client, gateway, brokers, and exporters. + +![zeebe-architecture](assets/zeebe-architecture.png) + +In Camunda Cloud you will work exclusively with clients. Gateway, broker, and exporters are pre-configured to provide the service, but are not themselves accessible. + +In local or private cloud deployments, all components are relevant. + +## Client + +Clients send commands to Zeebe to: + +- Deploy workflows +- Carry out business logic + - Start workflow instances + - Publish messages + - Activate jobs + - Complete jobs + - Fail jobs +- Handle operational issues + - Update workflow instance variables + - Resolve incidents + +Client applications can be scaled up and down completely separately from Zeebe - the Zeebe brokers do not execute any business logic. + +Clients are libraries that you embed in an application (e.g. a microservice that executes your business logic) to connect to a Zeebe cluster. + +Clients connect to the Zeebe gateway via [gRPC](https://grpc.io), which uses HTTP/2-based transport. To learn more about gRPC in Zeebe, check out the [Zeebe API (gRPC)](/reference/grpc.md). + +The Zeebe project includes officially-supported Java and Go clients. [Community clients](/product-manuals/clients/other-clients/index.md) have been created in other languages, including C#, Ruby, and JavaScript. The gRPC protocol makes it possible to [generate clients](/product-manuals/clients/build-your-own-client.md) in a range of different programming languages. + +### Job Worker + +A job worker is a Zeebe client that uses the client API to first activate jobs, and then upon completion either complete or fail the job. + +## Gateway + +The gateway serves as a single entry point to a Zeebe cluster and forwards requests to brokers. + +The gateway is stateless and sessionless, and gateways can be added as necessary for load balancing and high availability. + +## Broker + +The Zeebe broker is the distributed workflow engine that keeps state of active workflow instances. + +Brokers can be partitioned for horizontal scalability and replicated for fault tolerance. A Zeebe deployment will often consist of more than one broker. + +It's important to note that no application business logic lives in the broker. Its only responsibilities are: + +- Processing commands sent by clients +- Storing and managing the state of active workflow instances +- Assigning jobs to job workers + +Brokers form a peer-to-peer network in which there is no single point of failure. This is possible because all brokers perform the same kind of tasks and the responsibilities of an unavailable broker are transparently reassigned in the network. + +## Exporter + +The exporter system provides an event stream of state changes within Zeebe. This data has many potential uses, including but not limited to: + +- Monitoring the current state of running workflow instances +- Analysis of historic workflow data for auditing, business intelligence, etc +- Tracking [incidents](/product-manuals/concepts/incidents.md) created by Zeebe + +The exporter includes a simple API that you can use to stream data into a storage system of your choice. Zeebe includes an out-of-the-box [Elasticsearch exporter](https://github.com/zeebe-io/zeebe/tree/master/exporters/elasticsearch-exporter), and other [community-contributed exporters](https://awesome.zeebe.io) are also available. diff --git a/docs/product-manuals/zeebe/reference/assets/activity-lifecycle.png b/docs/product-manuals/zeebe/technical-concepts/assets/activity-lifecycle.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/activity-lifecycle.png rename to docs/product-manuals/zeebe/technical-concepts/assets/activity-lifecycle.png diff --git a/docs/product-manuals/zeebe/basics/assets/client-server.png b/docs/product-manuals/zeebe/technical-concepts/assets/client-server.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/client-server.png rename to docs/product-manuals/zeebe/technical-concepts/assets/client-server.png diff --git a/docs/product-manuals/zeebe/basics/assets/cluster.png b/docs/product-manuals/zeebe/technical-concepts/assets/cluster.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/cluster.png rename to docs/product-manuals/zeebe/technical-concepts/assets/cluster.png diff --git a/docs/product-manuals/zeebe/basics/assets/commit.png b/docs/product-manuals/zeebe/technical-concepts/assets/commit.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/commit.png rename to docs/product-manuals/zeebe/technical-concepts/assets/commit.png diff --git a/docs/product-manuals/zeebe/basics/assets/data-distribution.png b/docs/product-manuals/zeebe/technical-concepts/assets/data-distribution.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/data-distribution.png rename to docs/product-manuals/zeebe/technical-concepts/assets/data-distribution.png diff --git a/docs/product-manuals/zeebe/reference/assets/event-lifecycle.png b/docs/product-manuals/zeebe/technical-concepts/assets/event-lifecycle.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/event-lifecycle.png rename to docs/product-manuals/zeebe/technical-concepts/assets/event-lifecycle.png diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/exporters-stream.png b/docs/product-manuals/zeebe/technical-concepts/assets/exporters-stream.png new file mode 100644 index 00000000000..7f8eff0fe36 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/exporters-stream.png differ diff --git a/docs/product-manuals/zeebe/basics/assets/internal-processing-job.png b/docs/product-manuals/zeebe/technical-concepts/assets/internal-processing-job.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/internal-processing-job.png rename to docs/product-manuals/zeebe/technical-concepts/assets/internal-processing-job.png diff --git a/docs/product-manuals/zeebe/basics/assets/order-process.png b/docs/product-manuals/zeebe/technical-concepts/assets/order-process.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/order-process.png rename to docs/product-manuals/zeebe/technical-concepts/assets/order-process.png diff --git a/docs/product-manuals/zeebe/basics/assets/partition.png b/docs/product-manuals/zeebe/technical-concepts/assets/partition.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/partition.png rename to docs/product-manuals/zeebe/technical-concepts/assets/partition.png diff --git a/docs/product-manuals/zeebe/reference/assets/pass-through-lifecycle.png b/docs/product-manuals/zeebe/technical-concepts/assets/pass-through-lifecycle.png similarity index 100% rename from docs/product-manuals/zeebe/reference/assets/pass-through-lifecycle.png rename to docs/product-manuals/zeebe/technical-concepts/assets/pass-through-lifecycle.png diff --git a/docs/product-manuals/zeebe/basics/assets/task-workers-subscriptions.png b/docs/product-manuals/zeebe/technical-concepts/assets/task-workers-subscriptions.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/task-workers-subscriptions.png rename to docs/product-manuals/zeebe/technical-concepts/assets/task-workers-subscriptions.png diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflow-conditions.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-conditions.png new file mode 100644 index 00000000000..6b3483e9519 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-conditions.png differ diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflow-data-flow.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-data-flow.png new file mode 100644 index 00000000000..29b0470dd9a Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-data-flow.png differ diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflow-events.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-events.png new file mode 100644 index 00000000000..499e5562651 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-events.png differ diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflow-parallel-gw.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-parallel-gw.png new file mode 100644 index 00000000000..b9208f0ec82 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-parallel-gw.png differ diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflow-parallel-mi.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-parallel-mi.png new file mode 100644 index 00000000000..2ff63f00b68 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-parallel-mi.png differ diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflow-sequence.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-sequence.png new file mode 100644 index 00000000000..55cebecee05 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflow-sequence.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/workflow.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflow.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/workflow.png rename to docs/product-manuals/zeebe/technical-concepts/assets/workflow.png diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflows-data-based-conditions.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflows-data-based-conditions.png new file mode 100644 index 00000000000..63126a12e57 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflows-data-based-conditions.png differ diff --git a/docs/product-manuals/zeebe/technical-concepts/assets/workflows-parallel-gateway.png b/docs/product-manuals/zeebe/technical-concepts/assets/workflows-parallel-gateway.png new file mode 100644 index 00000000000..e32ce06f1b9 Binary files /dev/null and b/docs/product-manuals/zeebe/technical-concepts/assets/workflows-parallel-gateway.png differ diff --git a/docs/product-manuals/zeebe/basics/assets/zeebe-architecture.png b/docs/product-manuals/zeebe/technical-concepts/assets/zeebe-architecture.png similarity index 100% rename from docs/product-manuals/zeebe/basics/assets/zeebe-architecture.png rename to docs/product-manuals/zeebe/technical-concepts/assets/zeebe-architecture.png diff --git a/docs/product-manuals/zeebe/technical-concepts/clustering.md b/docs/product-manuals/zeebe/technical-concepts/clustering.md new file mode 100644 index 00000000000..d652aa76fb3 --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/clustering.md @@ -0,0 +1,41 @@ +--- +id: clustering +title: "Clustering" +--- + +Zeebe can operate as a cluster of brokers, forming a peer-to-peer network. +In this network, all brokers have the same responsibilities and there is no single point of failure. + +![cluster](assets/cluster.png) + +## Gossip membership protocol + +Zeebe implements the [Gossip protocol](https://en.wikipedia.org/wiki/Gossip_protocol) to know which brokers are currently part of the cluster. + +The cluster is bootstrapped using a set of well-known bootstrap brokers, to which the other ones can connect. To achieve this, each broker must have at least one bootstrap broker as its initial contact point in their configuration: + +```yaml +--- +cluster: + initialContactPoints: [node1.mycluster.loc:26502] +``` + +When a broker is connected to the cluster for the first time, it fetches the topology from the initial contact points and then starts gossiping with the other brokers. Brokers keep cluster topology locally across restarts. + +## Raft consensus and replication protocol + +To ensure fault tolerance, Zeebe replicates data across machines using the [Raft protocol](). + +Data is divided into partitions (shards). Each partition has a number of replicas. Among the replica set, a _leader_ is determined by the raft protocol which takes in requests and performs all of the processing. All other brokers are passive _followers_. When the leader becomes unavailable, the followers transparently select a new leader. + +Each broker in the cluster may be both leader and follower at the same time for different partitions. In an ideal world, this leads to client traffic distributed evenly across all brokers. + +![cluster](assets/data-distribution.png) + +Note, however, that there is no active load balancing across partitions. Each leader election for any partition is completely autonomous and independent of leader elections for other partitions. This may lead, in the worst case, to one node becoming the leader for all partitions. This is not a problem for fault tolerance as the guarantees of replication still hold. However, it may negatively impact throughput as all traffic hits one node. + +## Commit + +Before a new record on a partition can be processed, it must be replicated to a quorum (typically majority) of followers. This procedure is called _commit_. Committing ensures that a record is durable even in case of complete data loss on an individual broker. The exact semantics of committing are defined by the raft protocol. + +![cluster](assets/commit.png) diff --git a/docs/product-manuals/zeebe/technical-concepts/exporters.md b/docs/product-manuals/zeebe/technical-concepts/exporters.md new file mode 100644 index 00000000000..768a0ec25da --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/exporters.md @@ -0,0 +1,144 @@ +--- +id: exporters +title: "Exporters" +--- + +As Zeebe processes jobs and workflows, or performs internal maintenance (e.g. +raft failover), it will generate an ordered stream of records: + +![record-stream](assets/exporters-stream.png) + +While the clients provide no way to inspect this stream directly, Zeebe can load +and configure user code that can process each and every one of those records, in the form of an exporter. + +An **exporter** provides a single entry point to process every record that is +written on a stream. + +- Persist historical data by pushing it to an external data warehouse +- Export records to a visualization tool (e.g. [zeebe-simple-monitor](https://github.com/zeebe-io/zeebe-simple-monitor/)) + +Zeebe will only load exporters which are configured through the main Zeebe YAML +configuration file. + +Once an exporter is configured, the next time Zeebe is started, the exporter +will start receiving records. Note that it is only guaranteed to see records +produced from that point on. + +You can find a reference implementation in the form of the Zeebe-maintained +[ElasticSearch exporter](https://github.com/zeebe-io/zeebe/tree/develop/exporters/elasticsearch-exporter). + +The main impact exporters have on a Zeebe cluster is that they remove the burden +of persisting data indefinitely. + +Once data is not needed by Zeebe itself anymore, it will query its exporters to +know if it can be safely deleted, and if so, will permanently erase it, thereby +reducing disk usage. + +> **Note:** if no exporters are configured at all, then Zeebe will automatically +> erase data when it is not necessary anymore. If you need historical data, +> then you **need** to configure an exporter to stream records into your external +> data warehouse. + +Regardless of how an exporter is loaded (whether through an external JAR or not), +all exporters interact in the same way with the broker, which is defined by the +[Exporter interface](https://github.com/zeebe-io/zeebe/tree/develop/exporter-api/src/main/java/io/zeebe/exporter/api/Exporter.java). + +## Loading + +Once configured, exporters are loaded as part of the broker startup phase, before +any processing is done. + +During the loading phase, the configuration for each exporter is validated, such that +the broker will not start if: + +- An exporter ID is not unique +- An exporter points to a non-existent/non-accessible JAR +- An exporter points to a non-existent/non-instantiable class +- An exporter instance throws an exception in its `Exporter#configure` method. + +The last point is there to provide individual exporters to perform lightweight +validation of their configuration (e.g. fail if missing arguments). + +One of the caveat of the last point is that an instance of an exporter is created and +immediately thrown away; therefore, exporters should not perform any computationally +heavy work during instantiation/configuration. + +> **Note:** Zeebe will create an isolated class loader for every JAR referenced by +> exporter configurations - that is, only once per JAR; if the same JAR is reused to +> define different exporters, then these will share the same class loader. +> +> This has some nice properties, primarily that different exporters can depend on +> the same third party libraries without having to worry about versions, or class +> name collisions. +> +> Additionally, exporters use the system class loader for system classes, or +> classes packaged as part of the Zeebe JAR. + +Exporter specific configuration is handled through the exporter's `[exporters.args]` +nested map. This provides a simple `Map` which is passed directly +in form of a [Configuration](https://github.com/zeebe-io/zeebe/tree/develop/exporter-api/src/main/java/io/zeebe/exporter/api/context/Configuration.java) +object when the broker calls the `Exporter#configure(Configuration)` method. + +Configuration occurs at two different phases: during the broker startup phase, and +once every time a leader is elected for a partition. + +## Processing + +At any given point, there is exactly one leader +node for a given partition. Whenever a node becomes the leader for a partition, one +of the things it will do is run an instance of an +[exporter stream processor](https://github.com/zeebe-io/zeebe/tree/develop/broker/src/main/java/io/zeebe/broker/exporter/stream/ExporterDirector.java). + +This stream processor will create exactly one instance of each configured exporter, +and forward every record written on the stream to each of these in turn. + +> **Note:** this implies that there will be exactly one instance of every exporter for +> every partition: if you have 4 partitions, and at least 4 threads for processing, +> then there are potentially 4 instances of your exporter exporting simultaneously. + +Note that Zeebe only guarantees at-least-once semantics, that is, a record will be +seen at least once by an exporter, and maybe more. Cases where this may happen +include: + +- During reprocessing after raft failover (i.e. new leader election) +- On error if the position has not been updated yet + +To reduce the amount of duplicate records an exporter will process, the stream +processor will keep track of the position of the last successfully exported record +for every single exporter; the position is sufficient since a stream is an ordered +sequence of records whose position is monotonically increasing. This position is +set by the exporter itself once it can guarantee a record has been successfully +updated. + +> **Note:** although Zeebe tries to reduce the amount of duplicate records an +> exporter has to handle, it is likely that it will have to; therefore, it is +> necessary that export operations be idempotent. +> +> This can be implemented either in the exporter itself, but if it exports to an +> external system, it is recommended that you perform deduplication there to reduce +> the load on Zeebe itself. Refer to the exporter specific documentation for how +> this is meant to be achieved. + +### Error handling + +If an error occurs during the `Exporter#open(Context)` phase, the stream +processor will fail and be restarted, potentially fixing the error; worst case +scenario, this means no exporter is running at all until these errors stop. + +If an error occurs during the `Exporter#close` phase, it will be logged, but will +still allow other exporters to gracefully finish their work. + +If an error occurs during processing, we will retry infinitely the same record until +no error is produced. Worst case scenario, this means a failing exporter could bring +all exporters to a halt. Currently, exporter implementations are expected to +implement their own retry/error handling strategies, though this may change in the +future. + +### Performance impact + +Zeebe naturally incurs a performance impact for each loaded exporter. A slow +exporter will slow down all other exporters for a given partition, and, in the +worst case, could completely block a thread. + +It's therefore recommended to keep exporters as simple as possible, and perform +any data enrichment or transformation through the external system. diff --git a/docs/product-manuals/zeebe/technical-concepts/index.md b/docs/product-manuals/zeebe/technical-concepts/index.md new file mode 100644 index 00000000000..0110953128b --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/index.md @@ -0,0 +1,15 @@ +--- +id: index +sidebar_label: "Overview" +title: "Technical concepts" +--- + +This chapter gives an overview of Zeebe's underlying technical concepts: + +- [Architecture](architecture.md) - introduces you to the internal components of Zeebe, as well as, interfaces for external systems to interact with Zeebe. +- [Clustering](clustering.md) - discusses the internal structure and propperties of a Zeebe cluster. +- [Partitions](partitions.md) - sheds light on how Zeebe achives horizontal sclability +- [Internal processing](internal-processing.md) - explains the basics of Zeebe's event processing +- [Workflow lifecycles](workflow-lifecycles.md) - expands on the event processing concept and goes into more detail regarding the lifecycles of selected workflow elements +- [Protocols](protocols.md) - explains how external clients communicate with Zeebe +- [Exporters](exporters.md) - discusses the extension point to add additional processing logic for each record in the event stream diff --git a/docs/product-manuals/zeebe/technical-concepts/internal-processing.md b/docs/product-manuals/zeebe/technical-concepts/internal-processing.md new file mode 100644 index 00000000000..ce330aea913 --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/internal-processing.md @@ -0,0 +1,71 @@ +--- +id: internal-processing +title: "Internal processing" +--- + +Internally, Zeebe is implemented as a collection of _stream processors_ working on record streams \(partitions\). The stream processing model is used since it is a unified approach to provide: + +- Command protocol \(request-response\), +- Record export \(streaming\), +- Workflow evaluation \(asynchronous background tasks\) + +Record export solves the history problem - the stream provides exactly the kind of exhaustive audit log that a workflow engine needs to produce. + +## State machines + +Zeebe manages stateful entities: jobs, workflows, etc. Internally, these entities are implemented as _state machines_ managed by a stream processor. + +The concept of the state machine pattern is simple. An instance of a state machine is always in one of several logical states. From each state, a set of transitions defines the next possible states. Transitioning into a new state may produce outputs/side effects. + +Let's look at the state machine for jobs. Simplified, it looks as follows: + +![partition](assets/internal-processing-job.png) + +Every oval is a state. Every arrow is a state transition. Note how each state transition is only applicable in a specific state. For example, it is not possible to complete a job when it is in state `CREATED`. + +## Events and commands + +Every state change in a state machine is called an _event_. Zeebe publishes every event as a record on the stream. + +State changes can be requested by submitting a _command_. A Zeebe broker receives commands from two sources: + +- Clients send commands remotely. Examples: Deploying workflows, starting workflow instances, creating and completing jobs, etc. +- The broker itself generates commands. Examples: Locking a job for exclusive processing by a worker, etc. + +Once received, a command is published as a record on the addressed stream. + +## Stateful stream processing + +A stream processor reads the record stream sequentially and interprets the commands with respect to the addressed entity's lifecycle. More specifically, a stream processor repeatedly performs the following steps: + +1. Consume the next command from the stream. +1. Determine whether the command is applicable based on the state lifecycle and the entity's current state. +1. If the command is applicable, apply it to the state machine. If the command was sent by a client, send a reply/response. +1. If the command is not applicable, reject it. If it was sent by a client, send an error reply/response. +1. Publish an event reporting the entity's new state. + +For example, processing the _Create Job_ command produces the event _Job Created_. + +## Command triggers + +A state change which occurred in one entity can automatically trigger a command for another entity. + +For example, when a job is completed, the corresponding workflow instance shall continue with the next step. Thus, the Event _Job Completed_ triggers the command _Complete Activity_. + +## Handling back-pressure + +When a broker receives a client request, it is written to the _event stream_ first, and processed later by the stream processor. +If the processing is slow or if there are many client requests in the stream, it might take too long for the processor to start processing the command. +If the broker keeps accepting new requests from the client, the back log increases and the processing latency can grow beyond an acceptable time. +To avoid such problems, Zeebe employs a back-pressure mechanism. +When the broker receives more requests than it can process with an acceptable latency, it rejects some requests. + +The maximum rate of requests that can be processed by a broker depends on the processing capacity of the machine, the network latency, current load of the system and so on. +Hence, there is no fixed limit configured in Zeebe for the maximum rate of requests it accepts. +Instead, Zeebe uses an adaptive algorithm to dynamically determine the limit of the number of inflight requests (the requests that are accepted by the broker, but not yet processed). +The inflight request count is incremented when a request is accepted and decremented when a response is sent back to the client. +The broker rejects requests when the inflight request count reaches the limit. + +When the broker rejects requests due to back-pressure, the clients can retry them with an appropriate retry strategy. +If the rejection rate is high, it indicates that the broker is constantly under high load. +In that case, it is recommended to reduce the request rate. diff --git a/docs/product-manuals/zeebe/technical-concepts/partitions.md b/docs/product-manuals/zeebe/technical-concepts/partitions.md new file mode 100644 index 00000000000..22a783e8da8 --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/partitions.md @@ -0,0 +1,46 @@ +--- +id: partitions +title: "Partitions" +--- + +> Note: If you have worked with the [Apache Kafka System](https://kafka.apache.org/) before, the concepts presented on this page will sound very familiar to you. + +In Zeebe, all data is organized into _partitions_. A _partition_ is a persistent stream of workflow-related events. In a cluster of brokers, partitions are distributed among the nodes so it can be thought of as a _shard_. When you bootstrap a Zeebe cluster you can configure how many partitions you need. + +## Usage examples + +Whenever you deploy a workflow, you deploy it to the first partition. The workflow is then distributed to all partitions. On all partitions, this workflow receives the same key and version such that it can be consistently identified. + +When you start an instance of a workflow, the client library will then route the request to one partition in which the workflow instance will be published. All subsequent processing of the workflow instance will happen in that partition. + +## Distribution over partitions + +When a workflow instance is created in a partition, its state is stored and managed by the same partition until its execution is terminated. The partition in which it is created is determined by various factors. + +- When a client sends a command `CreateWorkflowInstance` or `CreateWorkflowInstanceWithResult`, gateway chooses a partition in a round-robin manner and forwards the requests to that partition. The workflow instance is created in that partition. +- When a client publishes a message to trigger a _message start event_, the message is forwarded to a partition based on the correlation key of the message. The workflow instance is created on the same partition where the message is published. +- Workflow instances created by _timer start events_ are always created on partition 1. + +## Scalability + +Use partitions to scale your workflow processing. Partitions are dynamically distributed in a Zeebe cluster and for each partition there is one leading broker at a time. This _leader_ accepts requests and performs event processing for the partition. Let us assume you want to distribute workflow processing load over five machines. You can achieve that by bootstraping five partitions. + +Note that while each partition has one leading broker, _not all brokers are guaranteed to be leading a partition_. A broker can lead more than one partition, and, at times, a broker in a cluster may be acting only as a replication back-up for partitions. This broker will not be doing any active work on processes until a partition fail-over happens and the broker gets elected as the new leader for that partition. + +## Partition data layout + +A partition is a persistent append-only event stream. Initially, a partition is empty. As the first entry gets inserted, it takes the place of the first entry. As the second entry comes in and is inserted, it takes the place as the second entry and so on and so forth. Each entry has a position in the partition which uniquely identifies it. + +![partition](assets/partition.png) + +## Replication + +For fault tolerance, data in a partition is replicated from the _leader_ of the partition to its _followers_. Followers are other Zeebe broker nodes that maintain a copy of the partition without performing event processing. + +## Recommendations + +Choosing the number of partitions depends on the use case, workload, and cluster setup. Here are some rules of thumb: + +- For testing and early development, start with a single partition. Note that Zeebe's workflow processing is highly optimized for efficiency, so a single partition can already handle high event loads. +- With a single Zeebe broker, a single partition is mostly enough. However, if the node has many cores and the broker is configured to use them, then more partitions can increase the total throughput (~ 2 threads per partition). +- Base your decisions on data. Simulate the expected workload, measure, and compare the performance of different partition setups. diff --git a/docs/product-manuals/zeebe/technical-concepts/protocols.md b/docs/product-manuals/zeebe/technical-concepts/protocols.md new file mode 100644 index 00000000000..6c4da39d560 --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/protocols.md @@ -0,0 +1,30 @@ +--- +id: protocols +title: "Protocols" +--- + +Zeebe clients connect to brokers via a stateless gateway. For the communication +between client and gateway [gRPC](https://grpc.io/) is used. The communication protocol is defined using +Protocol Buffers v3 ([proto3](https://developers.google.com/protocol-buffers/docs/proto3)), and you can find it in the +[Zeebe repository](https://github.com/zeebe-io/zeebe/tree/develop/gateway-protocol). + +## What is gRPC? + +gRPC was first developed by Google and is now an open-source project and part of the Cloud Native Computing Foundation. +If you’re new to gRPC, the [“What is gRPC”](https://grpc.io/docs/guides/index.html) page on the project website provides a good introduction to it. + +## Why gRPC? + +gRPC has many nice features that make it a good fit for Zeebe: + +- supports bi-directional streaming for opening a persistent connection and sending or receiving a stream of messages between client and server +- uses the common HTTP/2 protocol by default +- uses Protocol Buffers as an interface definition and data serialization mechanism–specifically, Zeebe uses proto3, which supports easy client generation in ten different programming languages + +## Supported clients + +At the moment, Zeebe officially supports two gRPC clients: one in [Java](/product-manuals/clients/java-client/index.md), and one in [Golang](/product-manuals/clients/go-client/get-started.md). + +[Community clients](/product-manuals/clients/other-clients/index.md) have been created in other languages, including C#, Ruby, and JavaScript. + +If there is no client in your target language yet, you can [build your own client](/product-manuals/clients/build-your-own-client.md) in a range of different programming languages. diff --git a/docs/product-manuals/zeebe/technical-concepts/workflow-lifecycles.md b/docs/product-manuals/zeebe/technical-concepts/workflow-lifecycles.md new file mode 100644 index 00000000000..bbd059a2c1d --- /dev/null +++ b/docs/product-manuals/zeebe/technical-concepts/workflow-lifecycles.md @@ -0,0 +1,135 @@ +--- +id: workflow-lifecycles +title: "Workflow lifecycles" +--- + +In Zeebe, the workflow execution is represented internally by events of type `WorkflowInstance`. The events are written to the log stream and can be observed by an exporter. + +Each event is one step in a workflow instance lifecycle. All events of one workflow instance have the same `workflowInstanceKey`. + +Events which belongs to the same element instance (e.g. a task) have the same `key`. The element instances have different lifecycles depending on the type of element. + +## (Sub-)Process/Activity/Gateway lifecycle + +![activity lifecycle](assets/activity-lifecycle.png) + +## Event lifecycle + +![event lifecycle](assets/event-lifecycle.png) + +## Sequence flow lifecycle + +![sequence flow lifecycle](assets/pass-through-lifecycle.png) + +## Example + +![order process](assets/workflow.png) + +Given the above workflow a successful execution will yield the following records in the commit log: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement idElement type
    ELEMENT_ACTIVATINGorder-processprocess
    ELEMENT_ACTIVATEDorder-processprocess
    ELEMENT_ACTIVATINGorder-placedstart event
    ELEMENT_ACTIVATEDorder-placedstart event
    ELEMENT_COMPLETINGorder-placedstart event
    ELEMENT_COMPLETEDorder-placedstart event
    SEQUENCE_FLOW_TAKENto-collect-moneysequence flow
    ELEMENT_ACTIVATINGcollect-moneytask
    ELEMENT_ACTIVATEDcollect-moneytask
    ELEMENT_COMPLETINGcollect-moneytask
    ELEMENT_COMPLETEDcollect-moneytask
    SEQUENCE_FLOW_TAKENto-fetch-itemssequence flow
    .........
    SEQUENCE_FLOW_TAKENto-order-deliveredsequence flow
    EVENT_ACTIVATINGorder-deliveredend event
    EVENT_ACTIVATEDorder-deliveredend event
    ELEMENT_COMPLETINGorder-deliveredend event
    ELEMENT_COMPLETEDorder-deliveredend event
    ELEMENT_COMPLETINGorder-placedprocess
    ELEMENT_COMPLETEDorder-placedprocess
    diff --git a/docs/product-manuals/zeebe/zeebe-overview.md b/docs/product-manuals/zeebe/zeebe-overview.md index d2dc5246f41..d38a39a8910 100644 --- a/docs/product-manuals/zeebe/zeebe-overview.md +++ b/docs/product-manuals/zeebe/zeebe-overview.md @@ -1,23 +1,22 @@ --- id: zeebe-overview -title: "Zeebe: the Workflow engine for the Cloud Age" +title: "Zeebe Engine" +sidebar_label: "Introduction" --- - - -### Zeebe is a cloud-native workflow engine for microservices orchestration +With Zeebe you can: - Define workflows graphically in BPMN 2.0 -- Choose any gRPC-supported programming language -- Deploy with Docker and Kubernetes (in the cloud or on-premises) +- Choose any gRPC-supported programming language to implement your workers - Build workflows that react to events from Apache Kafka and other messaging platforms +- Use a SaaS offering or deploy with Docker and Kubernetes (in the cloud or on-premises) - Scale horizontally to handle very high throughput -- Fault tolerance (no relational database required) +- Rely on fault tolerance and high availability for your workflows - Export workflow data for monitoring and analysis - Engage with an active community -**First Steps** +## Next Steps -- [Read up on Zeebe's core concepts](basics/index.md) -- [Run Zeebe with Docker or download a distribution](introduction/install.md) -- [Try the Getting Started tutorial](getting-started/index.md) +- Get familiar with [technical concepts](technical-concepts/index.md) +- Learn more about alternative [deployment options](deployment-guide/index.md) (e.g. how to run Zeebe in a local Docker environment during development) +- Explore [Community Contributions](open-source/community-contributions.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/data-flow-job-worker.png b/docs/reference/bpmn-workflows/assets/data-flow-job-worker.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/data-flow-job-worker.png rename to docs/reference/bpmn-workflows/assets/data-flow-job-worker.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/data-flow.png b/docs/reference/bpmn-workflows/assets/data-flow.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/data-flow.png rename to docs/reference/bpmn-workflows/assets/data-flow.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/merging-mapping.png b/docs/reference/bpmn-workflows/assets/merging-mapping.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/merging-mapping.png rename to docs/reference/bpmn-workflows/assets/merging-mapping.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/order-process.bpmn b/docs/reference/bpmn-workflows/assets/order-process.bpmn similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/order-process.bpmn rename to docs/reference/bpmn-workflows/assets/order-process.bpmn diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/order-process.png b/docs/reference/bpmn-workflows/assets/order-process.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/order-process.png rename to docs/reference/bpmn-workflows/assets/order-process.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/parallel-gateway.png b/docs/reference/bpmn-workflows/assets/parallel-gateway.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/parallel-gateway.png rename to docs/reference/bpmn-workflows/assets/parallel-gateway.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/sequenceflow.png b/docs/reference/bpmn-workflows/assets/sequenceflow.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/sequenceflow.png rename to docs/reference/bpmn-workflows/assets/sequenceflow.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/sub-process.gif b/docs/reference/bpmn-workflows/assets/sub-process.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/sub-process.gif rename to docs/reference/bpmn-workflows/assets/sub-process.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/variable-scopes.png b/docs/reference/bpmn-workflows/assets/variable-scopes.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/variable-scopes.png rename to docs/reference/bpmn-workflows/assets/variable-scopes.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/workflow.bpmn b/docs/reference/bpmn-workflows/assets/workflow.bpmn similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/workflow.bpmn rename to docs/reference/bpmn-workflows/assets/workflow.bpmn diff --git a/docs/reference/bpmn-workflows/assets/workflow.png b/docs/reference/bpmn-workflows/assets/workflow.png new file mode 100644 index 00000000000..8576c92b106 Binary files /dev/null and b/docs/reference/bpmn-workflows/assets/workflow.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/assets/zeebe-modeler.gif b/docs/reference/bpmn-workflows/assets/zeebe-modeler.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/assets/zeebe-modeler.gif rename to docs/reference/bpmn-workflows/assets/zeebe-modeler.gif diff --git a/docs/reference/bpmn-workflows/bpmn-coverage.md b/docs/reference/bpmn-workflows/bpmn-coverage.md new file mode 100644 index 00000000000..ba8bb8c6d16 --- /dev/null +++ b/docs/reference/bpmn-workflows/bpmn-coverage.md @@ -0,0 +1,971 @@ +--- +id: bpmn-coverage +title: "BPMN coverage" +--- + +The following BPMN elements are currently implemented in Zeebe: + +## Participants +* Pool + +## Subprocesses + +* [Embedded subprocess](embedded-subprocesses/embedded-subprocesses.md) +* [Call activities](call-activities/call-activities.md) +* [Event subprocess](event-subprocesses/event-subprocesses.md) + +## Tasks + +* [Service tasks](service-tasks/service-tasks.md) +* [Receive tasks](receive-tasks/receive-tasks.md) + +## Gateways + +* [Exclusive gateways](exclusive-gateways/exclusive-gateways.md) +* [Parallel gateways](parallel-gateways/parallel-gateways.md) +* [Event-based gateways](event-based-gateways/event-based-gateways.md) + +## Markers + +* [Multi-instance](multi-instance/multi-instance.md) + +## Events + +* [None events](none-events/none-events.md) +* [Message events](message-events/message-events.md) +* [Timer events](timer-events/timer-events.md) +* [Error events](error-events/error-events.md) + + \ No newline at end of file diff --git a/docs/reference/bpmn-workflows/bpmn-primer.md b/docs/reference/bpmn-workflows/bpmn-primer.md new file mode 100644 index 00000000000..256f0e4ca14 --- /dev/null +++ b/docs/reference/bpmn-workflows/bpmn-primer.md @@ -0,0 +1,237 @@ +--- +id: bpmn-primer +title: "BPMN primer" +--- + +import ReactPlayer from 'react-player' + +Business Process Model And Notation 2.0 (BPMN) is an industry standard for workflow modeling and execution. A BPMN workflow is an XML document that has a visual representation. For example, here is a BPMN workflow: + +![workflow](assets/workflow.png) + +
    + The corresponding XML +

    + +```xml + + + + + SequenceFlow_1bq1azi + + + + + + SequenceFlow_0ojoaqz + + + + + + + SequenceFlow_1bq1azi + SequenceFlow_09hqjpg + + + + + + SequenceFlow_09hqjpg + SequenceFlow_1ea1mpb + + + + + + SequenceFlow_1ea1mpb + SequenceFlow_0ojoaqz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +

    +
    + +This duality makes BPMN very powerful. The XML document contains all the necessary information to be interpreted by workflow engines and modeling tools like Zeebe. At the same time, the visual representation contains just enough information to be quickly understood by humans, even when they are non-technical people. The BPMN model is source code and documentation in one artifact. + +The following is an introduction to BPMN 2.0, its elements and their execution semantics. It tries to briefly provide an intuitive understanding of BPMN's power but does not cover the entire feature set. For more exhaustive BPMN resources, see the [reference links](#additional-resources) at the end of this section. + +## Modeling BPMN diagrams + +The best tool for modeling BPMN diagrams for Zeebe is the **Zeebe Modeler**. + +![overview](./assets/zeebe-modeler.gif) + +- [Download page](https://github.com/zeebe-io/zeebe-modeler/releases) +- [Source code repository](https://github.com/zeebe-io/zeebe-modeler) + +## BPMN elements + +### Sequence flow: Controlling the flow of execution + +A core concept of BPMN is a _sequence flow_ that defines the order in which steps in the workflow happen. In BPMN's visual representation, a sequence flow is an arrow connecting two elements. The direction of the arrow indicates their order of execution. + +![](./assets/sequenceflow.png) + +You can think of workflow execution as tokens running through the workflow model. When a workflow is started, a token is spawned at the beginning of the model. It advances with every completed step. When the token reaches the end of the workflow, it is consumed and the workflow instance ends. Zeebe's task is to drive the token and to make sure that the job workers are invoked whenever necessary. + +
    + +
    + +### Tasks: Units of work + +The basic elements of BPMN workflows are _tasks_, atomic units of work that are composed to create a meaningful result. Whenever a token reaches a task, the token stops and Zeebe creates a job and notifies a registered worker to perform work. When that handler signals completion, then the token continues on the outgoing sequence flow. + +
    + +
    + +Choosing the granularity of a task is up to the person modeling the workflow. For example, the activity of processing an order can be modeled as a single _Process Order_ task, or as three individual tasks _Collect Money_, _Fetch Items_, _Ship Parcel_. If you use Zeebe to orchestrate microservices, one task can represent one microservice invocation. + +See the [Tasks](tasks.md) section on which types of tasks are currently supported and how to use them. + +### Gateways: Steering flow + +Gateways are elements that route tokens in more complex patterns than plain sequence flow. + +BPMN's _exclusive gateway_ chooses one sequence flow out of many based on data: + +
    + +
    + +BPMN's _parallel gateway_ generates new tokens by activating multiple sequence flows in parallel: + +
    + +
    + +See the [Gateways](gateways.md) section on which types of gateways are currently supported and how to use them. + +### Events: Waiting for something to happen + +_Events_ in BPMN represent things that _happen_. A workflow can react to events (_catching_ event) as well as emit events (_throwing_ event). For example: + +
    + +
    + +The circle with the envelope symbol is a catching message event. It makes the token continue as soon as a message is received. The XML representation of the workflow contains the criteria for which kind of message triggers continuation. + +Events can be added to the workflow in various ways. Not only can they be used to make a token wait at a certain point, but also for interrupting a token's progress. + +See the [Events](events.md) section on which types of events are currently supported and how to use them. + +### Subprocesses: Grouping Elements + +_Subprocesses_ are element containers that allow defining common functionality. For example, we can attach an event to a sub process's border: + +![payload](./assets/sub-process.gif) + +When the event is triggered, the sub process is interrupted regardless which of its elements is currently active. + +See the [Subprocesses](subprocesses.md) section on which types of subprocesses are currently supported and how to use them. + +## Additional resources + +- [BPMN specification](http://www.bpmn.org/) +- [BPMN tutorial](https://camunda.com/bpmn/) +- [Full BPMN reference](https://camunda.com/bpmn/reference/) +- [BPMN book](https://www.amazon.com/dp/1086302095/) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif b/docs/reference/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif rename to docs/reference/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png b/docs/reference/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png rename to docs/reference/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-example.png b/docs/reference/bpmn-workflows/call-activities/assets/call-activities-example.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-example.png rename to docs/reference/bpmn-workflows/call-activities/assets/call-activities-example.png diff --git a/docs/reference/bpmn-workflows/call-activities/call-activities.md b/docs/reference/bpmn-workflows/call-activities/call-activities.md new file mode 100644 index 00000000000..6ecdc4cd007 --- /dev/null +++ b/docs/reference/bpmn-workflows/call-activities/call-activities.md @@ -0,0 +1,129 @@ +--- +id: call-activities +title: "Call activities" +--- + +A call activity (aka reusable subprocess) allows to call/invoke another workflow as part of this workflow. It is similar to an [embedded subprocess](../embedded-subprocesses/embedded-subprocesses.md) but the workflow is externalized (i.e. stored as separated BPMN) and can be invoked by different workflows. + +![call-activity](assets/call-activities-example.png) + +When a call activity is entered then a new workflow instance of the referenced workflow is created. The new workflow instance gets activated at the **none start event**. The workflow can have start events of other types but they are ignored. + +When the created workflow instance is completed then the call activity is left and the outgoing sequence flow is taken. + +## Defining the called workflow + +A call activity must define the BPMN process id of the called workflow as `processId`. + +The new instance of the defined workflow will be created of its **latest version** - at the point when the call activity is activated. + +Usually, the `processId` is defined as a static value (e.g. `shipping-process`) but it can also be defined as [expression](/product-manuals/concepts/expressions.md) (e.g. `= "shipping-" + tenantId`). The expression is evaluated on activating the call activity and must result in a `string`. + +## Boundary events + +![call-activity-boundary-event](assets/call-activities-boundary-events.png) + +Interrupting and non-interrupting boundary events can be attached to a call activity. + +When an interrupting boundary event is triggered then the call activity **and** the created workflow instance are terminated. The variables of the created workflow instance are not propagated to the call activity. + +When an non-interrupting boundary event is triggered then the created workflow instance is not affected. The activities at the outgoing path have no access to the variables of the created workflow instance since they are bounded to the other workflow instance. + +## Variable mappings + +When the call activity is activated then **all variables** of the call activity scope are copied to the created workflow instance. + +Input mappings can be used to create new local variables in the scope of the call activity. These variables are also copied to the created workflow instance. + +If the attribute `propagateAllChildVariables` is set (default: `true`) then all variables of the created workflow instance are propagated to the call activity. This behavior can be customized by defining output mappings at the call activity. The output mappings are applied on completing the call activity and only those variables that are defined in the output mappings are propagated. + +It is recommended to disable the attribute `propagateAllChildVariables` or define output mappings if the call activity is in a parallel flow (e.g. when it is marked as [parallel multi-instance](../multi-instance/multi-instance.md#variable-mappings)). Otherwise, it can happen that variables are overridden accidentally when they are changed in the parallel flow. + +## Additional resources + +
    + XML representation +

    A call activity with static process id: + +```xml + + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding a call activity with static process id: + +![call-activity](assets/bpmn-modeler-call-activity.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of a call activity: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGtask-aCALL_ACTIVITY
    ELEMENT_ACTIVATEDtask-aCALL_ACTIVITY
    ELEMENT_ACTIVATINGchild-process-idPROCESS
    ELEMENT_ACTIVATEDchild-process-idPROCESS
    .........
    ELEMENT_COMPLETEDchild-process-idPROCESS
    ELEMENT_COMPLETINGtask-aCALL_ACTIVITY
    ELEMENT_COMPLETEDtask-aCALL_ACTIVITY
    + +The workflow instance records of the created workflow instance have a reference to its parent workflow instance (`parentWorkflowInstanceKey`) and the element instance of the call activity (`parentElementInstanceKey`). + +

    +
    + +References: + +- [Expressions](/product-manuals/concepts/expressions.md) +- [Variable scopes](/product-manuals/concepts/variables.md#variable-scopes) +- [Variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) diff --git a/docs/reference/bpmn-workflows/data-flow.md b/docs/reference/bpmn-workflows/data-flow.md new file mode 100644 index 00000000000..eefc327a1e5 --- /dev/null +++ b/docs/reference/bpmn-workflows/data-flow.md @@ -0,0 +1,61 @@ +--- +id: data-flow +title: "Data flow" +--- + +Every BPMN workflow instance can have one or more variables. Variables are key-value-pairs and hold +the contextual data of the workflow instance that is required by job workers to do their work or to +decide which sequence flows to take. They can be provided when a workflow instance is created, when +a job is completed, and when a message is correlated. + +![data-flow](assets/data-flow.png) + +## Job workers + +By default, a job worker gets all variables of a workflow instance. It can limit the data by +providing a list of required variables as _fetchVariables_. + +The worker uses the variables to do its work. When the work is done, it completes the job. If the +result of the work is needed by follow-up tasks, then the worker sets the variables while completing +the job. These variables are [merged](/product-manuals/concepts/variables.md#variable-propagation) into the +workflow instance. + +![job-worker](assets/data-flow-job-worker.png) + +If the job worker expects the variables in a different format or under different names then the variables can be transformed by defining _input mappings_ in the workflow. _Output mappings_ can be used to transform the job variables before merging them into the workflow instance. + +## Variable scopes vs. token-based data + +A workflow can have concurrent paths, for example, when using a parallel gateway. When the execution reaches the parallel gateway then new tokens are spawned which execute the following paths concurrently. + +Since the variables are part of the workflow instance and not of the token, they can be read globally from any token. If a token adds a variable or modifies the value of a variable then the changes are also visible to concurrent tokens. + +![variable-scopes](assets/variable-scopes.png) + +The visibility of variables is defined by the _variable scopes_ of the workflow. + +## Concurrency considerations + +When multiple active activities exist in a workflow instance (i.e. there is a form of concurrent +execution, e.g. usage of a parallel gateway, multiple outgoing sequence flows or a parallel +multi-instance marker), you may need to take extra care in dealing with variables. When variables +are altered by one activity, it might also be accessed and altered by another at the same time. Race +conditions can occur in such workflows. + +We recommend taking care when writing variables in a parallel flow. Make sure the variables are +written to the correct [variable scope](/product-manuals/concepts/variables.md#variable-scopes) using variable +mappings and make sure to complete jobs and publish messages only with the minimum required +variables. + +These type of problems can be avoided by: + +- passing only updated variables +- using output variable mappings to customize the variable propagation +- using an embedded subprocess and input variable mappings to limit the visibility and propagation of variables + +## Additional resources + +- [Job handling](/product-manuals/concepts/job-workers.md) +- [Variables](/product-manuals/concepts/variables.md) +- [Input/output variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) +- [Variable scopes](/product-manuals/concepts/variables.md#variable-scopes) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif b/docs/reference/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif rename to docs/reference/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png b/docs/reference/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png rename to docs/reference/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png diff --git a/docs/reference/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md b/docs/reference/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md new file mode 100644 index 00000000000..ce43367cdc5 --- /dev/null +++ b/docs/reference/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md @@ -0,0 +1,99 @@ +--- +id: embedded-subprocesses +title: "Embedded subprocess" +--- + +An embedded subprocess allows to group elements of the workflow. + +![embedded-subprocess](assets/embedded-subprocess.png) + +An embedded subprocess must have exactly one none start event. Other start events are not allowed. + +When an embedded subprocess is entered then the start event gets activated. The subprocess stays active as long as one containing element is active. When the last element is completed then the subprocess gets completed and the outgoing sequence flow is taken. + +Embedded subprocesses are often used together with **boundary events**. One or more boundary events can be attached to an subprocess. When an interrupting boundary event is triggered then the whole subprocess including all active elements gets terminated. + +## Variable mappings + +Input mappings can be used to create new local variables in the scope of the subprocess. These variables are only visible within the subprocess. + +By default, the local variables of the subprocess are not propagated (i.e. they are removed with the scope). This behavior can be customized by defining output mappings at the subprocess. The output mappings are applied on completing the subprocess. + +## Additional resources + +
    + XML representation +

    An embedded subprocess with a start event: + +```xml + + + ... more contained elements ... + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an embedded subprocess: + +![event-based-gateway](assets/embedded-subprocess.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of an embedded subprocess: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGprocess-orderSUB_PROCESS
    ELEMENT_ACTIVATEDprocess-orderSUB_PROCESS
    ELEMENT_ACTIVATINGorder-placedSTART_EVENT
    .........
    ELEMENT_COMPLETEDitems-fetchedEND_EVENT
    ELEMENT_COMPLETINGprocess-orderSUB_PROCESS
    ELEMENT_COMPLETEDprocess-orderSUB_PROCESS
    + +

    +
    + +References: + +- [Variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif b/docs/reference/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif rename to docs/reference/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-events.png b/docs/reference/bpmn-workflows/error-events/assets/error-events.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-events.png rename to docs/reference/bpmn-workflows/error-events/assets/error-events.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-throw-events.png b/docs/reference/bpmn-workflows/error-events/assets/error-throw-events.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-throw-events.png rename to docs/reference/bpmn-workflows/error-events/assets/error-throw-events.png diff --git a/docs/reference/bpmn-workflows/error-events/error-events.md b/docs/reference/bpmn-workflows/error-events/error-events.md new file mode 100644 index 00000000000..529365df615 --- /dev/null +++ b/docs/reference/bpmn-workflows/error-events/error-events.md @@ -0,0 +1,129 @@ +--- +id: error-events +title: "Error events" +--- + +Error events are events which reference an error. They are used to handle business errors in a workflow. + +![workflow](assets/error-events.png) + +An error indicates that some kind of business error has occurred which should be handled in the workflow, for example, by taking a different path to compensate the error. + +## Defining the error + +An error can be referenced by one or more error events. It must define the `errorCode` (e.g. `Invalid Credit Card`) of the error. + +The `errorCode` is a `string` that must match to the error code that is sent by the client command or from the error end event. + +## Catching the error + +An error can be caught using an error **boundary event** or an error **event subprocess**. + +The boundary event or the event subprocess must be interrupting. When the error is caught then the service task gets terminated and the boundary event or event subprocess gets activated. That means the workflow instance continues where the error is caught instead of following the regular path. + +An error is caught by the first event in the scope hierarchy that matches the error code. If the error is thrown form a service task then it can be caught by an attached boundary event. If the task has no boundary event or the error code does not match then the error is propagated to the parent or root scope of the workflow instance. + +In case the workflow instance is created via call activity, the error can also be caught in the calling parent workflow instance. + +## Throwing the error + +An error can be thrown from a **client command** while processing a job. See the [gRPC command](/reference/grpc.md#throwerror-rpc) for details. + +Alternatively, an error can also be thrown inside a workflow using an error **end event**. + +![workflow](assets/error-throw-events.png) + +## Unhandled errors + +When an error is triggered then it should be handled in the workflow. If it is not handled (e.g. unexpected error code) then an **incident** is raised to indicate the failure. The incident is attached to the corresponding service task of the processed job or the error end event. + +The incident can not be solved by the user because the failure is in the workflow itself that can not be changed to handle the error for this workflow instance. + +## Business error vs. technical error + +While processing a job, two different types of errors can be occurred: a technical error (e.g. database connection interrupted) and a business error (e.g. invalid credit card). + +A technical error is usually unexpected and should not be handled in the workflow. The error may disappear when the job is retried, or an incident is created to indicate that an user interaction is required. + +A business error is expected and is handled in the workflow. The workflow may take a different path to compensate the error or undo previous actions. + +## Additional resources + +
    + XML representation +

    A boundary error event: + +```xml + + + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an error boundary event: + +![bpmn-modeler](assets/bpmn-modeler-error-events.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of an error boundary event: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    EVENT_OCCURREDcollect-moneySERVICE_TASK
    ELEMENT_TERMINATINGcollect-moneySERVICE_TASK
    ELEMENT_TERMINATEDcollect-moneySERVICE_TASK
    ELEMENT_ACTIVATINGinvalid-credit-cardBOUNDARY_EVENT
    ELEMENT_ACTIVATEDinvalid-credit-cardBOUNDARY_EVENT
    ELEMENT_COMPLETINGinvalid-credit-cardBOUNDARY_EVENT
    ELEMENT_COMPLETEDinvalid-credit-cardBOUNDARY_EVENT
    + +

    +
    + +References: + +- [Incidents](/product-manuals/concepts/incidents.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif b/docs/reference/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif rename to docs/reference/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png b/docs/reference/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png rename to docs/reference/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png diff --git a/docs/reference/bpmn-workflows/event-based-gateways/event-based-gateways.md b/docs/reference/bpmn-workflows/event-based-gateways/event-based-gateways.md new file mode 100644 index 00000000000..6b1bbbb617b --- /dev/null +++ b/docs/reference/bpmn-workflows/event-based-gateways/event-based-gateways.md @@ -0,0 +1,102 @@ +--- +id: event-based-gateways +title: "Event-based gateway" +--- + +An event-based gateway allows to make a decision based on events. + +![workflow](assets/event-based-gateway.png) + +An event-based gateway must have at least two outgoing sequence flows. Each sequence flow must to be connected to an intermediate catch event of type **timer or message**. + +When an event-based gateway is entered then the workflow instance waits at the gateway until one of the events is triggered. When the first event is triggered then the outgoing sequence flow of this event is taken. No other events of the gateway can be triggered afterward. + +## Additional resources + +
    + XML representation +

    An event-based gateway with two outgoing sequence flows: + +```xml + + + + + + + + + + + + + PT1H + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an event-based gateway with two outgoing sequence flows: + +![event-based-gateway](assets/event-based-gateway.gif) +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of an event-based gateway: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGgatewayEVENT_BASED_GATEWAY
    ELEMENT_ACTIVATEDgatewayEVENT_BASED_GATEWAY
    .........
    EVENT_OCCURREDgatewayEVENT_BASED_GATEWAY
    ELEMENT_COMPLETINGgatewayEVENT_BASED_GATEWAY
    ELEMENT_COMPLETEDgatewayEVENT_BASED_GATEWAY
    ELEMENT_ACTIVATINGpayment-details-updatedINTERMEDIATE_CATCH_EVENT
    + +

    +
    + +References: +* [Timer events](../timer-events/timer-events.md) +* [Message events](../message-events/message-events.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/event-subprocess.png b/docs/reference/bpmn-workflows/event-subprocesses/assets/event-subprocess.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/event-subprocess.png rename to docs/reference/bpmn-workflows/event-subprocesses/assets/event-subprocess.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif b/docs/reference/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif rename to docs/reference/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif diff --git a/docs/reference/bpmn-workflows/event-subprocesses/event-subprocesses.md b/docs/reference/bpmn-workflows/event-subprocesses/event-subprocesses.md new file mode 100644 index 00000000000..a5f0157155b --- /dev/null +++ b/docs/reference/bpmn-workflows/event-subprocesses/event-subprocesses.md @@ -0,0 +1,143 @@ +--- +id: event-subprocesses +title: "Event subprocess" +--- + +An event subprocess is a subprocess that is triggered by an event. It can be added globally to the process or locally inside an embedded subprocess. + +![event-subprocess](assets/event-subprocess.png) + +An event subprocess must have exactly one start event of one of the following types: + +- [Timer](../timer-events/timer-events.md) +- [Message](../message-events/message-events.md) +- [Error](../error-events/error-events.md) + +An event subprocess behaves like a boundary event but is inside the scope instead of being attached to the scope. Like a boundary event, the event subprocess can be interrupting or non-interrupting (indicated in BPMN by a solid or dashed border of the start event). The start event of the event subprocess can be triggered when its containing scope is activated. + +A non-interrupting event subprocess can be triggered multiple times. An interrupting event subprocess can be triggered only once. + +When an interrupting event subprocess is triggered then **all active instances** of its containing scope are terminated, including instances of other non-interrupting event subprocesses. + +If an event subprocess is triggered then its containing scope is not completed until the triggered instance is completed. + +## Variables + +Unlike a boundary event, an event subprocess is inside the scope. So, it can access and modify **all local variables** of its containing scope. This is not possible with a boundary event because a boundary event is outside of the scope. + +Input mappings can be used to create new local variables in the scope of the event subprocess. These variables are only visible within the event subprocess. + +By default, the local variables of the event subprocess are not propagated (i.e. they are removed with the scope). This behavior can be customized by defining output mappings at the event subprocess. The output mappings are applied on completing the event subprocess. + +## Additional resources + +
    + XML representation +

    An event subprocess with an interrupting timer start event: + +```xml + + + + PT5M + + ... other elements + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an event subprocess with an interrupting timer start event: + +![event-subprocess](assets/zeebe-modeler-event-subprocess.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of an event subprocess with an interrupting timer start event: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    EVENT_OCCURREDfive-minutesSTART_EVENT
    ELEMENT_TERMINATINGfetch-itemSERVICE_TASK
    .........
    ELEMENT_TERMINATEDfetch-itemSERVICE_TASK
    ELEMENT_ACTIVATINGcompensate-subprocessSUB_PROCESS
    ELEMENT_ACTIVATEDcompensate-subprocessSUB_PROCESS
    ELEMENT_ACTIVATINGfive-minutesSTART_EVENT
    .........
    ELEMENT_COMPLETEDorder-cancelledEND_EVENT
    ELEMENT_COMPLETINGcompensate-subprocessSUB_PROCESS
    ELEMENT_COMPLETEDcompensate-subprocessSUB_PROCESS
    ELEMENT_COMPLETINGorder-processPROCESS
    ELEMENT_COMPLETEDorder-processPROCESS
    + +

    +
    + +References: + +- [Embedded subprocess](../embedded-subprocesses/embedded-subprocesses.md) +- [Variable scopes](/product-manuals/concepts/variables.md#variable-scopes) diff --git a/docs/reference/bpmn-workflows/events.md b/docs/reference/bpmn-workflows/events.md new file mode 100644 index 00000000000..e89081c6f23 --- /dev/null +++ b/docs/reference/bpmn-workflows/events.md @@ -0,0 +1,34 @@ +--- +id: events +title: "Overview" +--- + +Currently supported events: + +* [None events](none-events/none-events.md) +* [Message events](message-events/message-events.md) +* [Timer events](timer-events/timer-events.md) +* [Error events](error-events/error-events.md) + +## Events in general + +Events in BPMN can be __thrown__ (i.e. sent), or __caught__ (i.e. received), respectively referred to as *throw* or *catch* events, e.g. `message throw event`, `timer catch event`. + +Additionally, a distinction is made between start, intermediate, and end events: + +* Start events (catch events, as they can only react to something) are used to denote the beginning of a process or subprocess. +* End events (throw events, as they indicate something has happened) are used to denote the end of a particular sequence flow. +* Intermediate events can be used to indicate that something has happened (i.e. intermediate throw events), or to wait and react to certain events (i.e. intermediate catch events). + +Intermediate catch events can be inserted into your process in two different contexts: normal flow, or attached to an activity, and are called boundary events. + +## Intermediate events +In normal flow, an intermediate throw event will execute its event (e.g. send a message) once the token has reached it, and once done the token will continue to all outgoing sequence flows. + +An intermediate catch event, however, will stop the token, and wait until the event it is waiting for happens, at which execution will resume, and the token will move on. + +## Boundary events + +Boundary events provide a way to model what should happen if an event occurs while an activity is currently active. For example, if a process is waiting on a user task to happen which is taking too long, an intermediate timer catch event can be attached to the task, with an outgoing sequence flow to notification task, allowing the modeler to automate sending a reminder email to the user. + +A boundary event must be an intermediate catch event, and can be either interrupting or non-interrupting. Interrupting in this case means that once triggered, before taking any outgoing sequence flow, the activity the event is attached to will be terminated. This allows modeling timeouts where we want to prune certain execution paths if something happens, e.g. the process takes too long. diff --git a/docs/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif b/docs/reference/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif rename to docs/reference/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png b/docs/reference/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png rename to docs/reference/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png diff --git a/docs/reference/bpmn-workflows/exclusive-gateways/exclusive-gateways.md b/docs/reference/bpmn-workflows/exclusive-gateways/exclusive-gateways.md new file mode 100644 index 00000000000..efa11548b2b --- /dev/null +++ b/docs/reference/bpmn-workflows/exclusive-gateways/exclusive-gateways.md @@ -0,0 +1,111 @@ +--- +id: exclusive-gateways +title: "Exclusive gateway" +--- + +An exclusive gateway (aka XOR-gateway) allows to make a decision based on data (i.e. on workflow instance variables). + +![workflow](assets/exclusive-gateway.png) + +If an exclusive gateway has multiple outgoing sequence flows then all sequence flows, except one, **must** have a `conditionExpression` to define when the flow is taken. The gateway can have one sequence flow without `conditionExpression` which must be defined as the default flow. + +When an exclusive gateway is entered then the `conditionExpression`s are evaluated. The workflow instance takes the first sequence flow that condition is fulfilled. + +If no condition is fulfilled then it takes the **default flow** of the gateway. In case the gateway has no default flow, an incident is created. + +An exclusive gateway can also be used to **join** multiple incoming flows to one, in order to improve the readability of the BPMN. A joining gateway has a pass-through semantic. It doesn't merge the incoming concurrent flows like a parallel gateway. + +## Conditions + +A `conditionExpression` defines when a flow is taken. It is a [boolean expression](/product-manuals/concepts/expressions.md#boolean-expressions) that can access the workflow instance variables and compare them with literals or other variables. The condition is fulfilled when the expression returns `true`. + +Multiple boolean values or comparisons can be combined as disjunction (`and`) or conjunction (`or`). + +For example: + +```feel += totalPrice > 100 + += order.customer = "Paul" + += orderCount > 15 or totalPrice > 50 + += valid and orderCount > 0 +``` + +## Additional resources + +
    + XML representation +

    An exclusive gateway with two outgoing sequence flows: + +```xml + + + + + = totalPrice > 100 + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an exclusive gateway with two outgoing sequence flows: + +![exclusive-gateway](assets/exclusive-gateway.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of an exclusive gateway: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGshipping-gatewayEXCLUSIVE_GATEWAY
    ELEMENT_ACTIVATEDshipping-gatewayEXCLUSIVE_GATEWAY
    ELEMENT_COMPLETINGshipping-gatewayEXCLUSIVE_GATEWAY
    ELEMENT_COMPLETEDshipping-gatewayEXCLUSIVE_GATEWAY
    SEQUENCE_FLOW_TAKENpriceGreaterThan100SEQUENCE_FLOW
    + +

    +
    + +References: + +- [Expressions](/product-manuals/concepts/expressions.md) +- [Incidents](/product-manuals/concepts/incidents.md) diff --git a/docs/reference/bpmn-workflows/gateways.md b/docs/reference/bpmn-workflows/gateways.md new file mode 100644 index 00000000000..476daade5cb --- /dev/null +++ b/docs/reference/bpmn-workflows/gateways.md @@ -0,0 +1,10 @@ +--- +id: gateways +title: "Overview" +--- + +Currently supported elements: + +* [Exclusive gateways](exclusive-gateways/exclusive-gateways.md) +* [Parallel gateways](parallel-gateways/parallel-gateways.md) +* [Event-based gateways](event-based-gateways/event-based-gateways.md) diff --git a/docs/reference/bpmn-workflows/markers.md b/docs/reference/bpmn-workflows/markers.md new file mode 100644 index 00000000000..b66c35c4e3b --- /dev/null +++ b/docs/reference/bpmn-workflows/markers.md @@ -0,0 +1,8 @@ +--- +id: markers +title: "Overview" +--- + +Currently supported markers: + +* [Multi-instance](multi-instance/multi-instance.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event-example.png b/docs/reference/bpmn-workflows/message-events/assets/message-catch-event-example.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event-example.png rename to docs/reference/bpmn-workflows/message-events/assets/message-catch-event-example.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event.png b/docs/reference/bpmn-workflows/message-events/assets/message-catch-event.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event.png rename to docs/reference/bpmn-workflows/message-events/assets/message-catch-event.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-event.gif b/docs/reference/bpmn-workflows/message-events/assets/message-event.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-event.gif rename to docs/reference/bpmn-workflows/message-events/assets/message-event.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-events.png b/docs/reference/bpmn-workflows/message-events/assets/message-events.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-events.png rename to docs/reference/bpmn-workflows/message-events/assets/message-events.png diff --git a/docs/reference/bpmn-workflows/message-events/message-events.md b/docs/reference/bpmn-workflows/message-events/message-events.md new file mode 100644 index 00000000000..6873ea07ee9 --- /dev/null +++ b/docs/reference/bpmn-workflows/message-events/message-events.md @@ -0,0 +1,186 @@ +--- +id: message-events +title: "Message events" +--- + +Message events are events which reference a message. They are used to wait until a proper message is received. + +![workflow](assets/message-events.png) + +At the moment, messages can be published only externally by using one of the Zeebe clients. + +## Message start events + +A workflow can have one or more message start events (besides other types of start events). Each of the message events must have a unique message name. + +When a workflow is deployed then it creates a message subscription for each message start event. Message subscriptions of the previous version of the workflow (based on the BPMN process id) are closed. + +When the message subscription is created then a message can be correlated to the start event if the message name matches. On correlating the message, a new workflow instance is created and the corresponding message start event is activated. + +Messages are **not** correlated if they were published before the workflow was deployed. Or, if a new version of the workflow is deployed which doesn't have a proper start event. + +The `correlationKey` of a published message can be used to control the workflow instance creation. If an instance of this workflow is active (independently from its version) and it was triggered by a message with the same `correlationKey` then the message is **not** correlated and no new instance is created. When the active workflow instance is ended (completed or terminated) and a message with the same `correlationKey` and a matching message name is buffered (i.e. TTL > 0) then this message is correlated and a new instance of the latest version of the workflow is created. + +If the `correlationKey` of a message is empty then it will always create a new workflow instance and does not check if an instance is already active. + +## Intermediate message catch events + +When an intermediate message catch event is entered then a corresponding message subscription is created. The workflow instance stops at this point and waits until the message is correlated. When a message is correlated, the catch event gets completed and the workflow instance continues. + +> An alternative to intermediate message catch events are [receive tasks](../receive-tasks/receive-tasks.md) which behaves the same but can be used together with boundary events. + +## Message boundary events + +An activity can have one or more message boundary events. Each of the message events must have a unique message name. + +When the activity is entered then it creates a corresponding message subscription for each boundary message event. If a non-interrupting boundary event is triggered then the activity is not terminated and multiple messages can be correlated. + +## Messages + +A message can be referenced by one or more message events. It **must** define the name of the message (e.g. `Money collected`) and the `correlationKey` expression (e.g. `= orderId`). If the message is only referenced by message start events then the `correlationKey` is not required. + +Usually, the name of the message is defined as a static value (e.g. `order canceled`), but it can also be defined as [expression](/product-manuals/concepts/expressions.md) (e.g. `= "order " + awaitingAction`). If the expression belongs to a message start event of the workflow, then it is evaluated on deploying the workflow. Otherwise, it is evaluated on activating the message event. The evaluation must result in a `string`. + +The `correlationKey` is an expression that usually [accesses a variable](/product-manuals/concepts/expressions.md#access-variables) of the workflow instance that holds the correlation key of the message. The expression is evaluated on activating the message event and must result either in a `string` or in a `number`. + +In order to correlate a message to the message event, the message is published with the defined name (e.g. `Money collected`) and the **value** of the `correlationKey` expression. For example, if the workflow instance has a variable `orderId` with value `"order-123"` then the message must be published with the correlation key `"order-123"`. + +## Variable mappings + +By default, all message variables are merged into the workflow instance. This behavior can be customized by defining an output mapping at the message catch event. + +## Additional resources + +
    + XML representation +

    A message start event with message definition: + +```xml + + + + + +``` + +An intermediate message catch event with message definition: + +```xml + + + + + + + + + +``` + +A boundary message event: + +```xml + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an intermediate message catch event: + +![message-event](assets/message-event.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of a message start event: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    EVENT_OCCURREDorder-placedSTART_EVENT
    ELEMENT_ACTIVATINGorder-placedSTART_EVENT
    ELEMENT_ACTIVATEDorder-placedSTART_EVENT
    ELEMENT_COMPLETINGorder-placedSTART_EVENT
    ELEMENT_COMPLETEDorder-placedSTART_EVENT
    + +Workflow instance records of an intermediate message catch event: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGorder-deliveredINTERMEDIATE_CATCH_EVENT
    ELEMENT_ACTIVATEDorder-deliveredINTERMEDIATE_CATCH_EVENT
    .........
    EVENT_OCCURREDmoney-collectedINTERMEDIATE_CATCH_EVENT
    ELEMENT_COMPLETINGmoney-collectedINTERMEDIATE_CATCH_EVENT
    ELEMENT_COMPLETEDmoney-collectedINTERMEDIATE_CATCH_EVENT
    + +

    +
    + +References: + +- [Message correlation](/product-manuals/concepts/messages.md) +- [Expressions](/product-manuals/concepts/expressions.md) +- [Variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) +- [Incidents](/product-manuals/concepts/incidents.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif b/docs/reference/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif rename to docs/reference/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png b/docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png rename to docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-example.png b/docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-example.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-example.png rename to docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-example.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png b/docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png rename to docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png b/docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png rename to docs/reference/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png diff --git a/docs/reference/bpmn-workflows/multi-instance/multi-instance.md b/docs/reference/bpmn-workflows/multi-instance/multi-instance.md new file mode 100644 index 00000000000..99921e3731f --- /dev/null +++ b/docs/reference/bpmn-workflows/multi-instance/multi-instance.md @@ -0,0 +1,204 @@ +--- +id: multi-instance +title: "Multi-Instance" +--- + +The following activities can be marked as multi-instance: + +- [Service tasks](../service-tasks/service-tasks.md) +- [Receive tasks](../receive-tasks/receive-tasks.md) +- [Embedded subprocesses](../embedded-subprocesses/embedded-subprocesses.md) +- [Call activities](../call-activities/call-activities.md) + +A multi-instance activity is executed multiple times - once for each element of a given collection (like a _foreach_ loop in a programming language). + +![multi-instance](assets/multi-instance-example.png) + +On the execution level, a multi-instance activity has two parts: a **multi-instance body** and an inner activity. The multi-instance body is the container for all instances of the inner activity. + +When the activity is entered, the multi-instance body is activated and one instance for every element of the `inputCollection` is created (sequentially or in parallel). When all instances are completed, the body is completed and the activity is left. + +## Sequential vs. parallel + +A multi-instance activity is executed either sequentially or in parallel (default). In the BPMN, a sequential multi-instance activity is displayed with 3 horizontal lines at the bottom. A parallel one with 3 vertical lines. + +In case of a **sequential** multi-instance activity, the instances are executed one-by-one. When one instance is completed then a new instance is created for the next element in the `inputCollection`. + +![sequential multi-instance](assets/multi-instance-sequential.png) + +In case of a **parallel** multi-instance activity, all instances are created when the multi-instance body is activated. The instances are executed concurrently and independently from each other. + +![parallel multi-instance](assets/multi-instance-parallel.png) + +## Defining the collection to iterate over + +A multi-instance activity **must** have an `inputCollection` expression that defines the collection to iterate over (e.g. `= items`). Usually, it [accesses a variable](/product-manuals/concepts/expressions.md#access-variables) of the workflow instance that holds the collection. The expression is evaluated on activating the multi-instance body. It must result in an `array` of any type (e.g. `["item-1", "item-2"]`). + +In order to access the current element of the `inputCollection` value within the instance, the multi-instance activity can define the `inputElement` variable (e.g. `item`). The element is stored as a local variable of the instance under the given name. + +If the `inputCollection` value is **empty** then the multi-instance body is completed immediately and no instances are created. It behaves like the activity is skipped. + +## Collecting the output + +The output of a multi-instance activity (e.g. the result of a calculation) can be collected from the instances by defining the `outputCollection` **and** the `outputElement` expression. + +`outputCollection` defines the name of the variable under which the collected output is stored (e.g. `results`). It is created as a local variable of the multi-instance body and gets updated when an instance is completed. When the multi-instance body is completed, the variable is propagated to its parent scope. + +`outputElement` is an expression that defines the output of the instance (e.g. `= result`). Usually, it [accesses a variable](/product-manuals/concepts/expressions.md#access-variables) of the instance that holds the output value. If the expression only accesses a variable or a nested property then it is created as **local variable** of the instance. This variable should be updated with the output value, for example, by a job worker providing a variable with the name `result`. Since the variable is defined as a local variable, it is not propagated to its parent scope and is only visible within the instance. + +When the instance is completed, the `outputElement` expression is evaluated and the result is inserted into the `outputCollection` at the same index as the `inputElement` of the `inputCollection`. So, the order of the `outputCollection` is determined and matches to the `inputCollection`, even for parallel multi-instance activities. If the `outputElement` variable is not updated then `null` is inserted instead. + +If the `inputCollection` value is empty then an empty array is propagated as `outputCollection`. + +## Boundary events + +![multi-instance with boundary event](assets/multi-instance-boundary-event.png) + +Interrupting and non-interrupting boundary events can be attached to a multi-instance activity. + +When an interrupting boundary event is triggered then the multi-instance body and **all active instances** are terminated. The `outputCollection` variable is not propagated to the parent scope (i.e. no partial output). + +When an non-interrupting boundary event is triggered then the instances are not affected. The activities at the outgoing path have no access to the local variables since they are bounded to the multi-instance activity. + +## Special multi-instance variables + +Every instance has a local variable `loopCounter`. It holds the index in the `inputCollection` of this instance, starting with `1`. + +## Variable mappings + +Input and output variable mappings can be defined at the multi-instance activity. They are applied **on each instance** on activating and on completing. + +The input mappings can be used to create new local variables in the scope of an instance. These variables are only visible within the instance. It is a way to restrict the **visibility** of variables. By default, new variables (e.g. provided by a job worker) are created in the scope of the workflow instance and are visible to all instances of the multi-instance activity as well as outside of it. In case of a parallel multi-instance activity, this can lead to variables that are modified by multiple instances and result in race conditions. If a variable is defined as local variable, then it is not propagated to a parent or the workflow instance scope and can't be modified outside of the instance. + +The input mappings can access the local variables of the instance (e.g. `inputElement`, `loopCounter`). For example, to extract parts of the `inputElement` variable and apply them to separate variables. + +The output mappings can be used to update the `outputElement` variable. For example, to extract a part of the job variables. + +**Example:** say we have a call activity that is marked as a parallel multi-instance. When the +called workflow instance completes, its variables get [merged](/product-manuals/concepts/variables.md#variable-propagation) +into the call activity's workflow instance. Its result is collected in the output collection +variable, but this has become a race condition where each completed child instance again overwrites +this same variable. We end up with a corrupted output collection. An output mapping can used to +overcome this, because it restricts which variables get merged. In the case that: + +- parallel multi-instance call activity +- multi-instance output element: `=output` +- variable in the child instance that holds the result: `x` + +The output mapping on the call activity should then be: + +``` +source: =x +target: output +``` + +## Additional resources + +
    + XML representation +

    A sequential multi-instance service task: + +```xml + + + + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding the parallel multi-instance marker to a service task: + +![multi-instance](assets/bpmn-modeler-multi-instance.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of a parallel multi-instance service task: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGtask-aMULTI_INSTANCE_BODY
    ELEMENT_ACTIVATEDtask-aMULTI_INSTANCE_BODY
    ELEMENT_ACTIVATINGtask-aSERVICE_TASK
    ELEMENT_ACTIVATINGtask-aSERVICE_TASK
    ELEMENT_ACTIVATEDtask-aSERVICE_TASK
    ELEMENT_ACTIVATEDtask-aSERVICE_TASK
    .........
    ELEMENT_COMPLETEDtask-aSERVICE_TASK
    .........
    ELEMENT_COMPLETEDtask-aSERVICE_TASK
    ELEMENT_COMPLETINGtask-aMULTI_INSTANCE_BODY
    ELEMENT_COMPLETEDtask-aMULTI_INSTANCE_BODY
    + +

    +
    + +References: + +- [Variable scopes](/product-manuals/concepts/variables.md#variable-scopes) +- [Expressions](/product-manuals/concepts/expressions.md) +- [Variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/none-events/assets/end-event.gif b/docs/reference/bpmn-workflows/none-events/assets/end-event.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/none-events/assets/end-event.gif rename to docs/reference/bpmn-workflows/none-events/assets/end-event.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/none-events/assets/none-events.png b/docs/reference/bpmn-workflows/none-events/assets/none-events.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/none-events/assets/none-events.png rename to docs/reference/bpmn-workflows/none-events/assets/none-events.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/none-events/assets/start-event.gif b/docs/reference/bpmn-workflows/none-events/assets/start-event.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/none-events/assets/start-event.gif rename to docs/reference/bpmn-workflows/none-events/assets/start-event.gif diff --git a/docs/reference/bpmn-workflows/none-events/none-events.md b/docs/reference/bpmn-workflows/none-events/none-events.md new file mode 100644 index 00000000000..769a7223024 --- /dev/null +++ b/docs/reference/bpmn-workflows/none-events/none-events.md @@ -0,0 +1,114 @@ +--- +id: none-events +title: "None events" +--- +None events are unspecified events, also called ‘blank’ events. + +![workflow](assets/none-events.png) + +## None start events + +A workflow can have at most one none start event (besides other types of start events). + +A none start event is where the workflow instance or a subprocess starts when the workflow or the subprocess is activated. + +## None end events + +A workflow or subprocess can have multiple none end events. When a none end event is entered then the current execution path ends. If the workflow instance or subprocess has no more active execution paths then it is completed. + +If an activity has no outgoing sequence flow then it behaves the same as it would be connected to a none end event. When the activity is completed then the current execution path ends. + +## Additional resources + +
    + XML representation +

    A none start event: + +```xml + +``` + +A none end event: +```xml + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding a none start event: + +![start-event](assets/start-event.gif) + +Adding a none end event: + +![end-event](assets/end-event.gif) +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of a none start event: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGorder-placedSTART_EVENT
    ELEMENT_ACTIVATEDorder-placedSTART_EVENT
    ELEMENT_COMPLETINGorder-placedSTART_EVENT
    ELEMENT_COMPLETEDorder-placedSTART_EVENT
    + +Workflow instance records of a none end event: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGorder-deliveredEND_EVENT
    ELEMENT_ACTIVATEDorder-deliveredEND_EVENT
    ELEMENT_COMPLETINGorder-deliveredEND_EVENT
    ELEMENT_COMPLETEDorder-deliveredEND_EVENT
    + +

    +
    diff --git a/docs/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif b/docs/reference/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif rename to docs/reference/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png b/docs/reference/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png rename to docs/reference/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png diff --git a/docs/reference/bpmn-workflows/parallel-gateways/parallel-gateways.md b/docs/reference/bpmn-workflows/parallel-gateways/parallel-gateways.md new file mode 100644 index 00000000000..262a7a6024f --- /dev/null +++ b/docs/reference/bpmn-workflows/parallel-gateways/parallel-gateways.md @@ -0,0 +1,127 @@ +--- +id: parallel-gateways +title: "Parallel gateway" +--- + +A parallel gateway (aka AND-gateway) allows to split the flow into concurrent paths. + +![workflow](assets/parallel-gateways.png) + +When a parallel gateway with multiple outgoing sequence flows is entered then all flows are taken. The paths are executed **concurrently** and independently. + +The concurrent paths can be **joined** using a parallel gateway with multiple incoming sequence flows. The workflow instance waits at the parallel gateway until each incoming sequence is taken. + +> Note the outgoing paths of the parallel gateway are executed concurrently - and not parallel in the sense of parallel threads. All records of a workflow instance are written to the same partition (single stream processor). + +## Additional Resources + +
    + XML representation +

    A parallel gateway with two outgoing sequence flows: + +```xml + + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding a parallel gateway with two outgoing sequence flows: + +![parallel-gateway](assets/parallel-gateway.gif) +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of a parallel gateway: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGsplitPARALLEL_GATEWAY
    ELEMENT_ACTIVATEDsplitPARALLEL_GATEWAY
    ELEMENT_COMPLETINGsplitPARALLEL_GATEWAY
    ELEMENT_COMPLETEDsplitPARALLEL_GATEWAY
    SEQUENCE_FLOW_TAKENto-ship-parcelSEQUENCE_FLOW
    SEQUENCE_FLOW_TAKENto-process-paymentSEQUENCE_FLOW
    .........
    SEQUENCE_FLOW_TAKENto-join-1SEQUENCE_FLOW
    .........
    SEQUENCE_FLOW_TAKENto-join-2SEQUENCE_FLOW
    ELEMENT_ACTIVATINGjoinPARALLEL_GATEWAY
    ELEMENT_ACTIVATEDjoinPARALLEL_GATEWAY
    ELEMENT_COMPLETINGjoinPARALLEL_GATEWAY
    ELEMENT_COMPLETEDjoinPARALLEL_GATEWAY
    + +

    +
    + diff --git a/docs/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-task.gif b/docs/reference/bpmn-workflows/receive-tasks/assets/receive-task.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-task.gif rename to docs/reference/bpmn-workflows/receive-tasks/assets/receive-task.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-tasks.png b/docs/reference/bpmn-workflows/receive-tasks/assets/receive-tasks.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-tasks.png rename to docs/reference/bpmn-workflows/receive-tasks/assets/receive-tasks.png diff --git a/docs/reference/bpmn-workflows/receive-tasks/receive-tasks.md b/docs/reference/bpmn-workflows/receive-tasks/receive-tasks.md new file mode 100644 index 00000000000..49a1a906a15 --- /dev/null +++ b/docs/reference/bpmn-workflows/receive-tasks/receive-tasks.md @@ -0,0 +1,110 @@ +--- +id: receive-tasks +title: "Receive tasks" +--- + +Receive tasks are tasks which references a message. They are used to wait until a proper message is received. + +![Receive Tasks](assets/receive-tasks.png) + +When a receive task is entered then a corresponding message subscription is created. The workflow instance stops at this point and waits until the message is correlated. + +A message can published using one of the Zeebe clients. When the message is correlated, the receive task gets completed and the workflow instance continues. + +> An alternative to receive tasks are [message intermediate catch events](../../bpmn-workflows/message-events/message-events.md) which behaves the same but can be used together with event-based gateways. + +## Messages + +A message can be referenced by one or more receive tasks. It **must** define the name of the message (e.g. `Money collected`) and the `correlationKey` expression (e.g. `= orderId`). + +Usually, the name of the message is defined as a static value (e.g. `order canceled`), but it can also be defined as [expression](/product-manuals/concepts/expressions.md) (e.g. `= "order " + awaitingAction`). The expression is evaluated on activating the receive task and must result in a `string`. + +The `correlationKey` is an expression that usually [accesses a variable](/product-manuals/concepts/expressions.md#access-variables) of the workflow instance that holds the correlation key of the message. The expression is evaluated on activating the receive task and must result either in a `string` or in a `number`. + +In order to correlate a message to the receive task, the message is published with the defined name (e.g. `Money collected`) and the **value** of the `correlationKey` expression. For example, if the workflow instance has a variable `orderId` with value `"order-123"` then the message must be published with the correlation key `"order-123"`. + +## Variable mappings + +By default, all message variables are merged into the workflow instance. This behavior can be customized by defining an output mapping at the receive task. + +## Additional resources + +
    + XML representation +

    A receive task with message definition: + +```xml + + + + + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding a receive task with message: + +![receive-task](assets/receive-task.gif) + +

    +
    + +
    + Workflow Lifecycle +

    Workflow instance records of a receive task: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGmoney-collectedRECEIVE_TASK
    ELEMENT_ACTIVATEDmoney-collectedRECEIVE_TASK
    .........
    EVENT_OCCURREDmoney-collectedRECEIVE_TASK
    ELEMENT_COMPLETINGmoney-collectedRECEIVE_TASK
    ELEMENT_COMPLETEDmoney-collectedRECEIVE_TASK
    + +

    +
    + +References: + +- [Message correlation](/product-manuals/concepts/messages.md) +- [Expressions](/product-manuals/concepts/expressions.md) +- [Variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) +- [Incidents](/product-manuals/concepts/incidents.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.gif b/docs/reference/bpmn-workflows/service-tasks/assets/service-task.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.gif rename to docs/reference/bpmn-workflows/service-tasks/assets/service-task.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.png b/docs/reference/bpmn-workflows/service-tasks/assets/service-task.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.png rename to docs/reference/bpmn-workflows/service-tasks/assets/service-task.png diff --git a/docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/task-headers.gif b/docs/reference/bpmn-workflows/service-tasks/assets/task-headers.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/task-headers.gif rename to docs/reference/bpmn-workflows/service-tasks/assets/task-headers.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/variable-mappings.gif b/docs/reference/bpmn-workflows/service-tasks/assets/variable-mappings.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/variable-mappings.gif rename to docs/reference/bpmn-workflows/service-tasks/assets/variable-mappings.gif diff --git a/docs/reference/bpmn-workflows/service-tasks/service-tasks.md b/docs/reference/bpmn-workflows/service-tasks/service-tasks.md new file mode 100644 index 00000000000..eb2e0461aac --- /dev/null +++ b/docs/reference/bpmn-workflows/service-tasks/service-tasks.md @@ -0,0 +1,112 @@ +--- +id: service-tasks +title: "Service tasks" +--- + +A service task represents a work item in the workflow with a specific type. + +![workflow](../assets/order-process.png) + +When a service task is entered then a corresponding job is created. The workflow instance stops at this point and waits until the job is completed. + +A worker can subscribe to the job type, process the jobs and complete them using one of the Zeebe clients. When the job is completed, the service task gets completed and the workflow instance continues. + +## Task definition + +A service task **must** have a `taskDefinition`. It specifies the **type of job** which workers can subscribe to. + +Optionally, a `taskDefinition` can specify the number of times the job is retried when a worker signals failure (default = 3). + +Usually, the job type and the job retries are defined as static values (e.g. `order-items`) but they can also be defined as [expressions](/product-manuals/concepts/expressions.md) (e.g. `= "order-" + priorityGroup`). The expressions are evaluated on activating the service task and must result in a `string` for the job type and a `number` for the retries. + +## Task headers + +A service task can define an arbitrary number of `taskHeaders`. They are static metadata that are handed to workers along with the job. The headers can be used as configuration parameters for the worker. + +## Variable mappings + +By default, all job variables are merged into the workflow instance. This behavior can be customized by defining an output mapping at the service task. + +Input mappings can be used to transform the variables into a format that is accepted by the job worker. + +## Additional resources + +
    + XML representation +

    A service task with a custom header: + +```xml + + + + + + + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding a service task: + +![service-task](assets/service-task.gif) + +Adding custom headers: +![task-headers](assets/task-headers.gif) + +Adding variable mappings: +![variable-mappings](assets/variable-mappings.gif) + +

    +
    + +
    + Workflow Lifecycle +

    Workflow instance records of a service task: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGcollect-moneySERVICE_TASK
    ELEMENT_ACTIVATEDcollect-moneySERVICE_TASK
    .........
    ELEMENT_COMPLETINGcollect-moneySERVICE_TASK
    ELEMENT_COMPLETEDcollect-moneySERVICE_TASK
    + +

    +
    + +References: + +- [Job handling](/product-manuals/concepts/job-workers.md) +- [Expressions](/product-manuals/concepts/expressions.md) +- [Variable mappings](/product-manuals/concepts/variables.md#inputoutput-variable-mappings) +- [Incidents](/product-manuals/concepts/incidents.md) diff --git a/docs/reference/bpmn-workflows/subprocesses.md b/docs/reference/bpmn-workflows/subprocesses.md new file mode 100644 index 00000000000..074f0e57206 --- /dev/null +++ b/docs/reference/bpmn-workflows/subprocesses.md @@ -0,0 +1,10 @@ +--- +id: subprocesses +title: "Overview" +--- + +Currently supported elements: + +* [Embedded subprocess](embedded-subprocesses/embedded-subprocesses.md) +* [Call activities](call-activities/call-activities.md) +* [Event subprocess](event-subprocesses/event-subprocesses.md) diff --git a/docs/reference/bpmn-workflows/tasks.md b/docs/reference/bpmn-workflows/tasks.md new file mode 100644 index 00000000000..1b26c0fa378 --- /dev/null +++ b/docs/reference/bpmn-workflows/tasks.md @@ -0,0 +1,9 @@ +--- +id: tasks +title: "Overview" +--- + +Currently supported elements: + +* [Service tasks](service-tasks/service-tasks.md) +* [Receive tasks](receive-tasks/receive-tasks.md) diff --git a/docs/product-manuals/zeebe/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif b/docs/reference/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif rename to docs/reference/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif b/docs/reference/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif rename to docs/reference/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif diff --git a/docs/product-manuals/zeebe/bpmn-workflows/timer-events/assets/timer-events.png b/docs/reference/bpmn-workflows/timer-events/assets/timer-events.png similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/timer-events/assets/timer-events.png rename to docs/reference/bpmn-workflows/timer-events/assets/timer-events.png diff --git a/docs/reference/bpmn-workflows/timer-events/timer-events.md b/docs/reference/bpmn-workflows/timer-events/timer-events.md new file mode 100644 index 00000000000..fb0a762c835 --- /dev/null +++ b/docs/reference/bpmn-workflows/timer-events/timer-events.md @@ -0,0 +1,195 @@ +--- +id: timer-events +title: "Timer events" +--- + +Timer events are events which are triggered by a defined timer. + +![workflow](assets/timer-events.png) + +## Timer start events + +A workflow can have one or more timer start events (besides other types of start events). Each of the timer events must have either a **time date or time cycle** definition. + +When a workflow is deployed then it schedules a timer for each timer start event. Scheduled timers of the previous version of the workflow (based on the BPMN process id) are canceled. + +When a timer is triggered then a new workflow instance is created and the corresponding timer start event is activated. + +## Intermediate timer catch events + +An intermediate timer catch event must have a **time duration** definition that defines when it is triggered. + +When an intermediate timer catch event is entered then a corresponding timer is scheduled. The workflow instance stops at this point and waits until the timer is triggered. When the timer is triggered, the catch event gets completed and the workflow instance continues. + +## Timer boundary events + +An interrupting timer boundary event must have a **time duration** definition. When the corresponding timer is triggered then the activity gets terminated. Interrupting timer boundary events is often used to model timeouts, for example, canceling the processing after 5 minutes and do something else. + +An non-interrupting timer boundary event must have either a **time duration or time cycle** definition. When the activity is entered then it schedules a corresponding timer. If the timer is triggered and it is defined as time cycle with repetitions > 0 then it schedules the timer again until the defined number of repetitions is reached. Non-interrupting timer boundary events is often used to model notifications, for example, contacting the support if the processing takes longer than one hour. + +## Timers + +Timers must be defined by providing either a date, a duration, or a cycle. + +A timer can be defined either as a static value (e.g. `PT3D`) or as an [expression](/product-manuals/concepts/expressions.md). There are two common ways for using an expression: + +- [access a variable](/product-manuals/concepts/expressions.md#access-variables) (e.g. `= remainingTime`) +- [using temporal values](/product-manuals/concepts/expressions.md#temporal-expressions) (e.g. `= date and time(expirationDate) - date and time(creationDate)`) + +If the expression belongs to a timer start event of the workflow then it is evaluated on deploying the workflow. Otherwise, it is evaluated on activating the timer catch event. The evaluation must result either in a `string` that has the same ISO 8601 format as the static value or an equivalent temporal value (i.e. a date-time, a duration, or a cycle). + +### Time date + +A specific point in time defined as ISO 8601 combined date and time representation. It must contain a timezone information, either `Z` for UTC or a zone offset. Optionally, it can contain a zone id. + +- `2019-10-01T12:00:00Z` - UTC time +- `2019-10-02T08:09:40+02:00` - UTC plus 2 hours zone offset +- `2019-10-02T08:09:40+02:00[Europe/Berlin]` - UTC plus 2 hours zone offset at Berlin + +### Time duration + +A duration defined as ISO 8601 durations format. + +- `PT15S` - 15 seconds +- `PT1H30M` - 1 hour and 30 minutes +- `P14D` - 14 days + +If the duration is zero or negative then the timer will fire immediately. + +### Time cycle + +A cycle defined as ISO 8601 repeating intervals format. It contains the duration and the number of repetitions. If the repetitions are not defined then the timer will be repeated infinitely until it is canceled. + +- `R5/PT10S` - every 10 seconds, up to 5 times +- `R/P1D` - every day, infinitely + +## Additional resources + +
    + XML representation +

    A timer start event with time date: + +```xml + + + 2019-10-01T12:00:00Z + + +``` + +An intermediate timer catch event with time duration: + +```xml + + + PT10M + + +``` + +A non-interrupting boundary timer event with time cycle: + +```xml + + + R3/PT1H + + +``` + +

    +
    + +
    + Using the BPMN modeler +

    Adding an interrupting timer boundary event: + +![message-event](assets/interrupting-timer-event.gif) + +

    +
    + +
    + Workflow lifecycle +

    Workflow instance records of a timer start event: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    EVENT_OCCURREDrelease-dateSTART_EVENT
    ELEMENT_ACTIVATINGrelease-dateSTART_EVENT
    ELEMENT_ACTIVATEDrelease-dateSTART_EVENT
    ELEMENT_COMPLETINGrelease-dateSTART_EVENT
    ELEMENT_COMPLETEDrelease-dateSTART_EVENT
    + +Workflow instance records of an intermediate timer catch event: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IntentElement IdElement Type
    ELEMENT_ACTIVATINGcoffee-breakINTERMEDIATE_CATCH_EVENT
    ELEMENT_ACTIVATEDcoffee-breakINTERMEDIATE_CATCH_EVENT
    .........
    EVENT_OCCURREDcoffee-breakINTERMEDIATE_CATCH_EVENT
    ELEMENT_COMPLETINGcoffee-breakINTERMEDIATE_CATCH_EVENT
    ELEMENT_COMPLETEDcoffee-breakINTERMEDIATE_CATCH_EVENT
    + +

    +
    + +References: + +- [Expressions](/product-manuals/concepts/expressions.md) +- [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) diff --git a/docs/reference/cloud-console-api-clients.md b/docs/reference/cloud-console-api-clients.md new file mode 100644 index 00000000000..75a525f82e0 --- /dev/null +++ b/docs/reference/cloud-console-api-clients.md @@ -0,0 +1,35 @@ +--- +id: cloud-console-api-clients +title: Console API clients +--- + +To interact with Camunda Cloud programmatically, without using the Camunda Cloud UI, you can create Cloud API Clients. + +Cloud API clients are created for an organization, an therefore can access all Zeebe clusters of this organization. + +You can create Cloud API clients in the organization settings. + +A client can have one or multiple of the following permissions: + +- **Get Clusters** - retrieve information of all clusters of the organization +- **Create Clusters** - create a cluster for the organization +- **Delete Clusters** - delete a cluster of the organization +- **Get Zeebe Clients** - retieve all Zeebe clients of the organization +- **Create Zeebe Clients** - create a Zeebe client for a cluster of the organization +- **Delete Zeebe Clients** - delete a Zeebe client of a cluster owned by the organization + +After a Cloud API client is created, the `Client Secret` is only shown once! Please write it down somewhere save! + +To retrieve a access token for the Cloud API client: + +```bash +curl --header "Content-Type: application/json" \ + --request POST \ + --data '{"grant_type":"client_credentials", "audience":"api.cloud.camunda.io", "client_id":"XXX", "client_secret":"YYY"}' \ + https://login.cloud.camunda.io/oauth/token +``` + +Please note: + +- Access tokens have a validity period that can be found in the access token. After this time a new access token must be requested. +- The auth service has a built-in rate limiting. If too many token requests are executed in a short time, the client is blocked for a certain time. Since the access tokens have a certain validity period, they must be cached on the client side. diff --git a/docs/reference/cloud-console-api-reference.md b/docs/reference/cloud-console-api-reference.md new file mode 100644 index 00000000000..445f28ab5c8 --- /dev/null +++ b/docs/reference/cloud-console-api-reference.md @@ -0,0 +1,82 @@ +--- +id: cloud-console-api-reference +title: Console API (REST) +--- + +For all requests include the access token for Cloud API into the Authorization header: `authorization:Bearer ${TOKEN}` (see [Cloud Console API clients](./cloud-console-api-clients.md)) + +## Clusters + +### Get all clusters + +`GET https://api.cloud.camunda.io/clusters/` +Returns detailed data on all clusters of the organization + +### Get cluster + +`GET https://api.cloud.camunda.io/clusters/${uuid}` +Returns detailed data of one cluster. + +### Get cluster creation parameters + +`GET https://api.cloud.camunda.io/clusters/parameters` +Returns all options available to create a cluster. + +### Delete cluster + +`DELETE https://api.cloud.camunda.io/clusters/${uuid}` + +### Create cluster + +`POST https://api.cloud.camunda.io/clusters/` +With following JSON payload: + +```json +{ + "name": string, // Name of the Cluster + "channelId": string, // Software Channel for further upgrades, check Get creation parameters + "generationId": string, // Software Generation, check Get creation parameters + "regionId": string, // Region to host the cluster, check Get creation parameters + "planTypeId": string // Hardware Plan of the cluster, check Get creation parameters +} +``` + +## Zeebe clients + +### Get all Zeebe clients + +`GET https://api.cloud.camunda.io/clusters/${clusterUuid}/clients/` +List all Zeebe clients + +### Get Zeebe client details + +`GET https://api.cloud.camunda.io/clusters/${clusterUuid}/clients/${clientId}` +Returns data needed to connect to a cluster + +### Delete Zeebe client + +`DELETE https://api.cloud.camunda.io/clusters/${clusterUuid}/clients/${clientId}` +Delete a Zeebe client + +### Create Zeebe client + +`POST https://api.cloud.camunda.io/clusters/${clusterUuid}/clients/` +With following JSON payload: + +```json +{ + "clientName": string // Name of the ZeebeClient +} +``` + +This returns: + +```json +{ + "name": string, + "clientId": string, + "clientSecret": string +} +``` + +Be aware the `clientSecret` is only returned on creation. `GET Client` calls do not return the `clientSecret`. diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-boolean.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-boolean.md new file mode 100644 index 00000000000..e8df5ff52fb --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-boolean.md @@ -0,0 +1,39 @@ +--- +id: feel-built-in-functions-boolean +title: Boolean functions +--- + +## `not()` + +* parameters: + * `negand`: boolean +* result: boolean + +```js +not(true) +// false +``` + +## `is defined()` + +Checks if a given value is defined or not. A value is defined if it exists, and it is an instance of one of the FEEL data types including `null`. + +The function can be used to check if a variable, or a context entry (e.g. a property of a variable) exists. It allows differentiating between a variable that is `null` and a value that doesn't exist. + +* parameters: + * `value`: any +* result: boolean + +```js +is defined(1) +// true + +is defined(null) +// true + +is defined(x) +// false - if no variable "x" exists + +is defined(x.y) +// false - if no variable "x" exists or it doesn't have a property "y" +``` diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-context.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-context.md new file mode 100644 index 00000000000..43215be50b4 --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-context.md @@ -0,0 +1,31 @@ +--- +id: feel-built-in-functions-context +title: Context functions +--- + +## `get value()` + +Returns the value of the context entry with the given key. + +* parameters: + * `context`: context + * `key`: string +* result: any + +```js +get value({foo: 123}, "foo") +// 123 +``` + +## `get entries()` + +Returns the entries of the context as list of key-value-pairs. + +* parameters: + * `context`: context +* result: list of context which contains two entries for "key" and "value" + +```js +get entries({foo: 123}) +// [{key: "foo", value: 123}] +``` \ No newline at end of file diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-conversion.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-conversion.md new file mode 100644 index 00000000000..330ddf9d116 --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-conversion.md @@ -0,0 +1,116 @@ +--- +id: feel-built-in-functions-conversion +title: Conversion functions +--- + +Convert a value into a different type. + +## `date()` + +* parameters: + * `from`: string / date-time + * or `year`, `month`, `day`: number +* result: date + +```js +date(birthday) +// date("2018-04-29") + +date(date and time("2012-12-25T11:00:00")) +// date("2012-12-25") + +date(2012, 12, 25) +// date("2012-12-25") +``` + +## `time()` + +* parameters: + * `from`: string / date-time + * or `hour`, `minute`, `second`: number + * (optional) `offset`: day-time-duration +* result: time + +```js +time(lunchTime) +// time("12:00:00") + +time(date and time("2012-12-25T11:00:00")) +// time("11:00:00") + +time(23, 59, 0) +// time("23:59:00") + +time(14, 30, 0, duration("PT1H")) +// time("15:30:00") +``` + +## `date and time()` + +* parameters: + * `date`: date / date-time + * `time`: time + * or `from`: string +* result: date-time + +```js +date and time(date("2012-12-24"),time("T23:59:00")) +// date and time("2012-12-24T23:59:00") + +date and time(date and time("2012-12-25T11:00:00"),time("T23:59:00")) +// date and time("2012-12-25T23:59:00") + +date and time(birthday) +// date and time("2018-04-29T009:30:00") +``` + +## `duration()` + +* parameters: + * `from`: string +* result: day-time-duration or year-month-duration + +```js +duration(weekDays) +// duration("P5D") + +duration(age) +// duration("P32Y") +``` + +## `years and months duration()` + +* parameters: + * `from`: date + * `to`: date +* result: year-month-duration + +```js +years and months duration(date("2011-12-22"), date("2013-08-24")) +// duration("P1Y8M") +``` + +## `number()` + +* parameters: + * `from`: string +* result: number + +```js +number("1500.5") +// 1500.5 +``` + +## `string()` + +* parameters: + * `from`: any +* result: string + +```js +string(1.1) +// "1.1" + +string(date("2012-12-25")) +// "2012-12-25" +``` diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-list.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-list.md new file mode 100644 index 00000000000..c5c6d0c56c6 --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-list.md @@ -0,0 +1,320 @@ +--- +id: feel-built-in-functions-list +title: List functions +--- + +## `list contains()` + +* parameters: + * `list`: list + * `element`: any +* result: boolean + +```js +list contains([1,2,3], 2) +// true +``` + +## `count()` + +* parameters: + * `list`: list +* result: number + +```js +count([1,2,3]) +// 3 +``` + +## `min()` + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +min([1,2,3]) +// 1 + +min(1,2,3) +// 1 +``` + +## `max()` + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +min([1,2,3]) +// 3 + +min(1,2,3) +// 3 +``` + +## `sum()` + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +min([1,2,3]) +// 6 + +min(1,2,3) +// 6 +``` + +## `product()` + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +product([2, 3, 4]) +// 24 + +product(2, 3, 4) +// 24 +``` + +## `mean()` + +Returns the arithmetic mean (i.e. average). + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +mean([1,2,3]) +// 2 + +mean(1,2,3) +// 2 +``` + +## `median()` + +Returns the median element of the list of numbers. + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +median(8, 2, 5, 3, 4) +// 4 + +median([6, 1, 2, 3]) +// 2.5 +``` + +## `stddev()` + +Returns the standard deviation. + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: number + +```js +stddev(2, 4, 7, 5) +// 2.0816659994661326 + +stddev([2, 4, 7, 5]) +// 2.0816659994661326 +``` + +## `mode()` + +Returns the mode of the list of numbers. + +* parameters: + * `list`: list of numbers + * or numbers as varargs +* result: list of numbers + +```js +mode(6, 3, 9, 6, 6) +// [6] + +mode([6, 1, 9, 6, 1]) +// [1, 6] +``` + +## `and()` / `all()` + +* parameters: + * `list`: list of booleans + * or booleans as varargs +* result: boolean + +```js +and([true,false]) +// false + +and(false,null,true) +// false +``` + +## `or(`) / `any()` + +* parameters: + * `list`: list of booleans + * or booleans as varargs +* result: boolean + +```js +or([false,true]) +// true + +or(false,null,true) +// true +``` + +## `sublist()` + +* parameters: + * `list`: list + * `start position`: number + * (optional) `length`: number +* result: list + +```js +sublist([1,2,3], 2) +// [2,3] + +sublist([1,2,3], 1, 2) +// [1,2] +``` + +## `append()` + +* parameters: + * `list`: list + * `items`: elements as varargs +* result: list + +```js +append([1], 2, 3) +// [1,2,3] +``` + +## `concatenate()` + +* parameters: + * `lists`: lists as varargs +* result: list + +```js +concatenate([1,2],[3]) +// [1,2,3] + +concatenate([1],[2],[3]) +// [1,2,3] +``` + +## `insert before()` + +* parameters: + * `list`: list + * `position`: number + * `newItem`: any +* result: list + +```js +insert before([1,3],1,2) +// [1,2,3] +``` + +## `remove()` + +* parameters: + * `list`: list + * `position`: number +* result: list + +```js +remove([1,2,3], 2) +// [1,3] +``` + +## `reverse()` + +* parameters: + * `list`: list +* result: list + +```js +reverse([1,2,3]) +// [3,2,1] +``` + +## `index of()` + +* parameters: + * `list`: list + * `match`: any +* result: list of numbers + +```js +index of([1,2,3,2],2) +// [2,4] +``` + +## `union()` + +* parameters: + * `lists`: lists as varargs +* result: list + +```js +union([1,2],[2,3]) +// [1,2,3] +``` + +## `distinct values()` + +* parameters: + * `list`: list +* result: list + +```js +distinct values([1,2,3,2,1]) +// [1,2,3] +``` + +## `flatten()` + +* parameters: + * `list`: list +* result: list + +```js +flatten([[1,2],[[3]], 4]) +// [1,2,3,4] +``` + +## `sort()` + +* parameters: + * `list`: list + * `precedes`: function with two arguments and boolean result +* result: list + +```js +sort(list: [3,1,4,5,2], precedes: function(x,y) x < y) +// [1,2,3,4,5] +``` diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-numeric.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-numeric.md new file mode 100644 index 00000000000..44f82a80734 --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-numeric.md @@ -0,0 +1,142 @@ +--- +id: feel-built-in-functions-numeric +title: Numeric functions +--- + +## `decimal()` + +Round the given number at the given scale using the given rounding mode. If no rounding mode is passed in then it uses `HALF_EVEN` as default. + +* parameters: + * `n`: number + * `scale`: number + * (optional) `mode`: string - one of `UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN, HALF_EVEN, UNNECESSARY` (default: `HALF_EVEN`) +* result: number + +```js +decimal(1/3, 2) +// .33 + +decimal(1.5, 0) +// 2 + +decimal(2.5, 0, "half_up") +// 3 +``` + +## `floor()` + +* parameters: + * `n`: number +* result: number + +```js +floor(1.5) +// 1 + +floor(-1.5) +// -2 +``` + +## `ceiling()` + +* parameters: + * `n`: number +* result: number + +```js +ceiling(1.5) +// 2 + +floor(-1.5) +// -1 +``` + +## `abs()` + +* parameters: + * `number`: number +* result: number + +```js +abs(10) +// 10 + +abs(-10) +// 10 +``` + +## `modulo()` + +Returns the remainder of the division of dividend by divisor. + +* parameters: + * `dividend`: number + * `divisor`: number +* result: number + +```js +modulo(12, 5) +// 2 +``` + +## `sqrt()` + +Returns the square root. + +* parameters: + * `number`: number +* result: number + +```js +sqrt(16) +// 4 +``` + +## `log()` + +Returns the natural logarithm (base e) of the number. + +* parameters: + * `number`: number +* result: number + +```js +log(10) +// 2.302585092994046 +``` + +## `exp()` + +Returns the Euler’s number e raised to the power of number . + +* parameters: + * `number`: number +* result: number + +```js +exp(5) +// 148.4131591025766 +``` + +## `odd()` + +* parameters: + * `number`: number +* result: boolean + +```js +odd(5) +// true +``` + +## `even()` + +* parameters: + * `number`: number +* result: boolean + +```js +odd(5) +// false +``` diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-string.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-string.md new file mode 100644 index 00000000000..d4584204989 --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-string.md @@ -0,0 +1,157 @@ +--- +id: feel-built-in-functions-string +title: String functions +--- + +## `substring()` + +* parameters: + * `string`: string + * `start position`: number + * (optional) `length`: number +* result: string + +```js +substring("foobar",3) +// "obar" + +substring("foobar",3,3) +// "oba" +``` + +## `string length()` + +* parameters: + * `string`: string +* result: number + +```js +string length("foo") +// 3 +``` + +## `upper case()` + +* parameters: + * `string`: string +* result: string + +```js +upper case("aBc4") +// "ABC4" +``` + +## `lower case()` + +* parameters: + * `string`: string +* result: string + +```js +lower case("aBc4") +// "abc4" +``` + +## `substring before()` + +* parameters: + * `string`: string + * `match`: string +* result: string + +```js +substring before("foobar", "bar") +// "foo" +``` + +## `substring after()` + +* parameters: + * `string`: string + * `match`: string +* result: string + +```js +substring after("foobar", "ob") +// "ar" +``` + +## `contains()` + +* parameters: + * `string`: string + * `match`: string +* result: boolean + +```js +contains("foobar", "of") +// false +``` + +## `starts with()` + +* parameters: + * `input`: string + * `match`: string +* result: boolean + +```js +starts with("foobar", "fo") +// true +``` + +## `ends with()` + +* parameters: + * `input`: string + * `match`: string +* result: boolean + +```js +ends with("foobar", "r") +// true +``` + +## `matches()` + +* parameters: + * `input`: string + * `pattern`: string (regular expression) +* result: boolean + +```js +matches("foobar", "^fo*bar") +// true +``` + +## `replace()` + +* parameters: + * `input`: string + * `pattern`: string (regular expression) + * `replacement`: string (e.g. `$1` returns the first match group) + * (optional) `flags`: string ("s", "m", "i", "x") +* result: string + +```js +replace("abcd", "(ab)|(a)", "[1=$1][2=$2]") +// "[1=ab][2=]cd" + +replace("0123456789", "(\d{3})(\d{3})(\d{4})", "($1) $2-$3") +// "(012) 345-6789" +``` + +## `split()` + +* parameters: + * `string`: string + * `delimiter`: string (regular expression) +* result: list of strings + +```js +split("John Doe", "\s" ) +// ["John", "Doe"] + +split("a;b;c;;", ";") +// ["a", "b", "c", "", ""] +``` diff --git a/docs/reference/feel/builtin-functions/feel-built-in-functions-temporal.md b/docs/reference/feel/builtin-functions/feel-built-in-functions-temporal.md new file mode 100644 index 00000000000..a91a576d917 --- /dev/null +++ b/docs/reference/feel/builtin-functions/feel-built-in-functions-temporal.md @@ -0,0 +1,80 @@ +--- +id: feel-built-in-functions-temporal +title: Temporal functions +--- + +## `now()` + +Returns the current date and time including the timezone. + +* parameters: no +* result: date-time with timezone + +```js +now() +// date and time("2020-07-31T14:27:30@Europe/Berlin") +``` + +## `today()` + +Returns the current date. + +* parameters: no +* result: date + +```js +today() +// date("2020-07-31") +``` + +## `day of week()` + +Returns the day of the week according to the Gregorian calendar. Note that it returns always the english name of the day. + +* parameters: + * `date`: date/date-time +* result: string + +```js +day of week(date("2019-09-17")) +// "Tuesday" +``` + +## `day of year()` + +Returns the Gregorian number of the day within the year. + +* parameters: + * `date`: date/date-time +* result: number + +```js +day of year(date("2019-09-17")) +// 260 +``` + +## `week of year()` + +Returns the Gregorian number of the week within the year, according to ISO 8601. + +* parameters: + * `date`: date/date-time +* result: number + +```js +week of year(date("2019-09-17")) +// 38 +``` + +## `month of year()` + +Returns the month of the week according to the Gregorian calendar. Note that it returns always the english name of the month. + +* parameters: + * `date`: date/date-time +* result: string + +```js +month of year(date("2019-09-17")) +// "September" +``` diff --git a/docs/reference/feel/language-guide/feel-data-types.md b/docs/reference/feel/language-guide/feel-data-types.md new file mode 100644 index 00000000000..7a6fe00cfb0 --- /dev/null +++ b/docs/reference/feel/language-guide/feel-data-types.md @@ -0,0 +1,143 @@ +--- +id: feel-data-types +title: Data types +--- + +A value can have one of the following types. + +### Null + +Nothing, null or nil (i.e. the value is not present). + +Some operations/functions return `null` if an argument in not valid or types doesn't match. + +* Java Type: `null` + +```js +null +``` + +### Number + +A whole or floating point number. + +* not-a-number (NaN), positive/negative infinity are represented as `null` +* Java Type: `java.math.BigDecimal` + +```js +1 +2.3 +.4 +``` + +### String + +* Java Type: `java.lang.String` + +```js +"valid" +``` + +### Boolean + +* Java Type: `java.lang.Boolean` + +```js +true +false +``` + +### Date + +* Format: `yyyy-MM-dd`. +* Java Type: `java.time.LocalDate` + +```js +date("2017-03-10") +``` + +### Time + +A local or zoned time. The time can have an offset or time zone id. + +* Format: `HH:mm:ss` / `HH:mm:ss+/-HH:mm` / `HH:mm:ss@ZoneId` +* Java Type: `java.time.LocalTime` / `java.time.OffsetTime` + +```js +time("11:45:30") +time("13:30") + +time("11:45:30+02:00") + +time("10:31:10@Europe/Paris") +``` + +### Date-Time + +A date with a local or zoned time component. The time can have an offset or time zone id. + +* Format: `yyyy-MM-dd'T'HH:mm:ss` / `yyyy-MM-dd'T'HH:mm:ss+/-HH:mm` / `yyyy-MM-dd'T'HH:mm:ss@ZoneId` +* Java Type: `java.time.LocalDateTime` / `java.time.DateTime` + +```js +date and time("2015-09-18T10:31:10") + +date and time("2015-09-18T10:31:10+01:00") + +date and time("2015-09-18T10:31:10@Europe/Paris") +``` + +### Day-Time-Duration + +A duration based on seconds. It can contain days, hours, minutes and seconds. + +* Format: `PxDTxHxMxS` +* Java Type: `java.time.Duration` + +```js +duration("P4D") +duration("PT2H") +duration("PT30M") +duration("P1DT6H") +``` + +### Year-Month-Duration + +A duration based on the calendar. It can contain years and months. + +* Format: `PxYxM` +* Java Type: `java.time.Period` + +```js +duration("P2Y") +duration("P6M") +duration("P1Y6M") +``` + +### List + +A list of elements. Can be empty. + +* Java Type: `java.util.List` + +```js +[] +[1,2,3] +["a","b"] + +[["list"], "of", [["lists"]]] +``` + +### Context + +A list of key-value-pairs. Can be empty. + +* Java Type: `java.util.Map` + +```js +{} +{"a": 1} +{"b": 2, "c": "valid"} + +{"nested": {"d": 3}} +``` diff --git a/docs/reference/feel/language-guide/feel-expression.md b/docs/reference/feel/language-guide/feel-expression.md new file mode 100644 index 00000000000..d49fcda555b --- /dev/null +++ b/docs/reference/feel/language-guide/feel-expression.md @@ -0,0 +1,389 @@ +--- +id: feel-expression +title: Expressions +--- + +An expression can contain literals, operators and function calls. + +### Literal + +A single value of one of the [types](feel-data-types.md). + +```js +null; +21; +("valid"); +``` + +### Path Expression + +Access a value by its name/path. For example, a given variable from the input/context. + +```js +x + y; +``` + +If the value is a context (or data object/POJO) then the inner values can be accessed by `context.key`. + +```js +x.y; +// return 1 if x is {y: 1} +``` + +Also, directly on a context. + +```js +{x: 2}.x +// 2 + +{x: {y: "valid"}}.x +// {y: "valid"} + +{x: {y: "valid"}}.x.y +// "valid" +``` + +Inside a context, the previous values can be accessed. + +```js +{ + a: 1, + b: 2, + c: a + b +} +``` + +If the name or path contains any special character (e.g. whitespace, dash, etc.) then the name needs to be wrapped into single backquotes/backtick `` `foo bar` ``. + +```js +`name with whitespace`.`name+operator` +``` + +### Addition + +- supported types: number, string, day-time-duration, year-month-duration + +```js +2 + 3; +// 5 + +"foo" + "bar"; +// "foobar" + +duration("P1D") + duration("PT6H"); +// duration("P1DT6H") +``` + +### Subtraction + +- supported types: number, time, date-time, day-time-duration, year-month-duration + +```js +5 - 3; +// 2 + +time("10:30:00") - time("09:00:00"); +// duration("PT1H30M") + +time("10:30:00") - duration("PT1H"); +// time("09:30:00") +``` + +### Multiplication + +- supported types: number, day-time-duration, year-month-duration + +```js +5 * 3; +// 15 + +3 * duration("P2Y"); +// duration("P6Y") +``` + +### Division + +- supported types: number, day-time-duration, year-month-duration + +```js +6 / 2; +// 3 + +duration("P1Y") / 2; +// duration("P6M") + +duration("P1Y") / duration("P1M"); +// 12 +``` + +### Exponentiation + +- supported types: number + +```js +2 ** 3; +// 8 +``` + +### Comparison + +| operator | symbol | example | +| --------------------- | ----------------- | ------------------- | +| equal to | `=` | `x = "valid"` | +| not equal to | `!=` | `x != "valid"` | +| less than | `<` | `< 10` | +| less than or equal | `<=` | `<= 10` | +| greater than | `>` | `> 10` | +| greater than or equal | `>=` | `>= 10` | +| between | `between _ and _` | `x between 3 and 9` | + +The operators less than, greater than, and between are only supported for: + +- number +- date +- time +- date-time +- year-month-duration +- day-time-duration + +Any value can be compared with `null` to check if it is equal to `null`, or if it exists. Comparing `null` to a value different from `null` results in `false`. It returns `true` if the value, or the context entry (e.g. the property of a variable) is `null` or doesn't exist. The built-in function [is defined()](../builtin-functions/feel-built-in-functions-boolean.md#is-defined) can be used to differentiate between a value that is `null` and a value that doesn't exist. + +```js +null = null; +// true + +"foo" = null; +// false + +x = null; +// true - if "x" is null or doesn't exist + +x.y = null; +// true - if "x" is null, "x" doesn't exist, +// "y" is null, or "x" has no property "y" +``` + +### Disjunction and conjunction + +Combine two boolean values. + +```js +true and true +// true + +true and false +// false + +true and null +// null + +false and null +// false +``` + +```js +true or false +// true + +false or false +// false + +true or null +// true + +false or null +// null +``` + +### If expression + +```js +if (x < 5) then "low" else "high" +``` + +### For expressions + +Iterate over a list and apply an expression (i.e. aka `map`). The result is again a list. + +```js +for x in [1,2] return x * 2 +// [2,4] +``` + +Iterate over multiple lists. + +```js +for x in [1,2], y in [3,4] return x * y +// [3,4,6,8] +``` + +Iterate over a range - forward or backward. + +```js +for x in 1..3 return x * 2 +// [2,4,6] + +for x in 3..1 return x * 2 +// [6,4,2] +``` + +The previous results of the iterator can be accessed by the variable `partial`. + +```js +for x in 1..5 return x + sum(partial) +// [1,3,7,15,31] +``` + +### Some/every expression + +Test if at least one element of the list satisfies the expression. + +```js +some x in [1,2,3] satisfies x > 2 +// true + +some x in [1,2,3] satisfies x > 3 +// false + +some x in [1,2], y in [2,3] satisfies x < y +// true +``` + +Test if all elements of the list satisfies the expression. + +```js +every x in [1,2,3] satisfies x >= 1 +// true + +every x in [1,2,3] satisfies x >= 2 +// false + +every x in [1,2], y in [2,3] satisfies x < y +// false +``` + +### Filter expression + +Filter a list of elements by an expression. The expression can access the current element by `item`. The result is a list again. + +```js +[1, 2, 3, 4][item > 2]; +// [3,4] +``` + +An element of a list can be accessed by its index. The index starts at `1`. A negative index starts at the end by `-1`. + +```js +[1, 2, 3, 4][1][ + // 1 + + (1, 2, 3, 4) +][4][ + // 4 + + (1, 2, 3, 4) +][-1][ + // 4 + + (1, 2, 3, 4) +][-2][ + // 3 + + (1, 2, 3, 4) +][5]; +// null +``` + +If the elements are contextes then the nested value of the current element can be accessed directly by its name. + +```js +[ + { a: "foo", b: 5 }, + { a: "bar", b: 10 }, +][b > 7]; +// {a : "bar", b: 10} +``` + +The nested values of a specific key can be extracted by `.key`. + +```js +[ + { a: "foo", b: 5 }, + { a: "bar", b: 10 }, +].a; +// ["foo", "bar"] +``` + +### Evaluate a unary tests + +Evaluates a [unary tests expression](feel-unary-tests) with the given value. + +```js +x in (2..4) + +x in < 3 +``` + +### Instance-Of expression + +Checks the type of the value. + +```js +"foo" instance of number +// false + +"bar" instance of string +// true +``` + +### Functions + +Invoke a user-defined or built-in function by its name. The arguments can be passed positional or named. + +```js +add(1, 2); +// or +add((x: 1), (y: 2)); +``` + +A function (body) can be defined using `function(arguments) expression`. For example, inside a context. + +```js +{ + add : function(x,y) x + y +} +``` + +### Special properties + +Values of type date, time, date-time and duration have special properties to access their individual parts. + +```js +date("2017-03-10").year +date("2017-03-10").month +date("2017-03-10").day +date("2017-03-10").weekday + +time("11:45:30+02:00").hour +time("11:45:30+02:00").minute +time("11:45:30+02:00").second +time("11:45:30+02:00").time offset + +date and time("2017-03-10T11:45:30+02:00").year +date and time("2017-03-10T11:45:30+02:00").month +date and time("2017-03-10T11:45:30+02:00").day +date and time("2017-03-10T11:45:30+02:00").weekday +date and time("2017-03-10T11:45:30+02:00").hour +date and time("2017-03-10T11:45:30+02:00").minute +date and time("2017-03-10T11:45:30+02:00").second +date and time("2017-03-10T11:45:30+02:00").time offset +date and time("2017-03-10T11:45:30+02:00").timezone + +duration("P2Y3M").years +duration("P2Y3M").months + +duration("P1DT2H10M30S").days +duration("P1DT2H10M30S").hours +duration("P1DT2H10M30S").minutes +duration("P1DT2H10M30S").seconds +``` diff --git a/docs/reference/feel/language-guide/feel-unary-tests.md b/docs/reference/feel/language-guide/feel-unary-tests.md new file mode 100644 index 00000000000..c9cc7178846 --- /dev/null +++ b/docs/reference/feel/language-guide/feel-unary-tests.md @@ -0,0 +1,88 @@ +--- +id: feel-unary-tests +title: Unary tests +--- + +Unary tests can be used only for input entries of a decision table. They are a special kind of expression with additional operators. The operators get the value of the input expression implicitly as the first argument. + +The result of the expression must be either `true` or `false`. + +A unary test expression is `true` if one of the following conditions is fulfilled: +* the expression evaluates to `true` when the input value is applied to it +* the expression evaluates to a list and the input value is equal to at least one of the values in that list +* the expression evaluates to a value and the input value is equal to that value + +### Comparison + +Compare the input value to `x`. + +| operator | symbol | example | +|----------|-----------------|---------| +| equal to | (none) | `"valid"` | +| less than | `<` | `< 10` | +| less than or equal | `<=` | `<= 10` | +| greater than | `>` | `> 10` | +| greater than or equal | `>=` | `>= 10` | + +* less than/greater than are only supported for: + * number + * date + * time + * date-time + * year-month-duration + * day-time-duration + +### Interval + +Test if the input value is within the interval `x` and `y`. + +An interval can be open `(x..y)` / `]x..y[` or closed `[x..y]`. If the interval is open then the value is not included. + +```js +(2..5) +// input > 2 and input < 5 + +[2..5] +// input >= 2 and input <= 5 + +(2..5] +// input > 2 and input <= 5 +``` + +### Disjunction + +Test if at least of the expressions is `true`. + +```js +2, 3, 4 +// input = 2 or input = 3 or input = 4 + +< 10, > 50 +// input < 10 or input > 50 +``` + +### Negation + +Test if the expression is `false`. + +```js +not("valid") +// input != "valid" + +not(2, 3) +// input != 2 and input != 3 +``` + +### Expression + +It is also possible to use a boolean [expression](feel-expression) instead of an operator. For example, invoking a built-in function. + +The input value can be accessed by the special variable `?`. + +```js +ends with(?, "@camunda.com") +// test if the input value (string) ends with "@camunda.com" + +list contains(?, "invalid") +// test if the input value (list) contains "invalid" +``` diff --git a/docs/reference/feel/sidebar-schema.js b/docs/reference/feel/sidebar-schema.js new file mode 100644 index 00000000000..c803ffe1c56 --- /dev/null +++ b/docs/reference/feel/sidebar-schema.js @@ -0,0 +1,19 @@ +module.exports = { + "FEEL expressions": [ + 'reference/feel/what-is-feel', + 'reference/feel/language-guide/feel-data-types', + 'reference/feel/language-guide/feel-unary-tests', + 'reference/feel/language-guide/feel-expression', + { + "Built-in functions": [ + 'reference/feel/builtin-functions/feel-built-in-functions-conversion', + 'reference/feel/builtin-functions/feel-built-in-functions-boolean', + 'reference/feel/builtin-functions/feel-built-in-functions-string', + 'reference/feel/builtin-functions/feel-built-in-functions-numeric', + 'reference/feel/builtin-functions/feel-built-in-functions-list', + 'reference/feel/builtin-functions/feel-built-in-functions-context', + 'reference/feel/builtin-functions/feel-built-in-functions-temporal' + ], + }, + ], +}; diff --git a/docs/reference/feel/what-is-feel.md b/docs/reference/feel/what-is-feel.md new file mode 100644 index 00000000000..f81d1ce57d6 --- /dev/null +++ b/docs/reference/feel/what-is-feel.md @@ -0,0 +1,48 @@ +--- +id: what-is-feel +title: What is FEEL? +--- + +FEEL (Friendly Enough Expression Language) is a part of the [DMN specification](http://www.omg.org/spec/DMN/) of the OMG. It is designed to write expressions for decision tables and literal expressions in a simple way what can easily understand by business professionals and developers. + +## Unary tests vs. expression + +FEEL has two entry points: unary-tests and expressions. + +### Unary tests + +Unary-tests can be used only for input entries of a decision table. They are a special kind of expression with a different grammar. The expression gets the value of the input expression implicitly as the first argument. The result of the expression must be either `true` or `false`. + +Examples: + +```js +< 7 +// input less than 7 + +not(2,4) +// input is not 2 or 4 + +[date("2015-09-17")..date("2015-09-19")] +// input is between '2015-09-17' and '2015-09-19' + +<= duration("P1D") +// input is less or equal one day +``` + +### Expression + +Expressions can be used everywhere, e.g. in a decision table as input expression or output entry. An expression takes no implicit arguments like unary-tests. + +Examples: + +```js +applicant.monthly.income * 12 + +if applicant.maritalStatus in ("M","S") then "valid" else "not valid" + +sum( [applicant.monthly.repayments, applicant.monthly.expenses] ) + +sum( credit_history[record_date > date("2011-01-01")].weight ) + +some ch in credit_history satisfies ch.event = "bankruptcy" +``` diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md new file mode 100644 index 00000000000..76523f46ab8 --- /dev/null +++ b/docs/reference/glossary.md @@ -0,0 +1,186 @@ +--- +id: glossary +title: "Glossary" +--- + +This section defines commonly used terminology referenced within the documentation. + +### Broker + +A broker is an instance of a Zeebe installation which executes workflows and manages workflow state. A single broker will be installed on a single machine. + +- [Architecture](/product-manuals/zeebe/technical-concepts/architecture.md#broker) + +### Client + +A client interacts with the Zeebe broker on behalf of the business application. Clients poll for work from the broker. + +- [Architecture](/product-manuals/zeebe/technical-concepts/architecture.md#client) + +### Cluster + +A cluster represents a configuration of one or more brokers collaborating to execute workflows. Each broker in a cluster acts as a leader or a follower. + +- [Clustering](/product-manuals/zeebe/technical-concepts/clustering.md) + +### Command + +A command represents an action to be taken or executed. Example commands include: deploy a workflow, execute a workflow, etc. + +- [Internal processing](/product-manuals/zeebe/technical-concepts/internal-processing.md#events-and-commands) + +### Correlation + +Correlation refers to the act of matching a message with an inflight workflow instance. + +- [Message correlation](/product-manuals/concepts/messages.md) + +### Correlation Key + +A correlation is an attribute within a message which is used to match this message against a certain variable within an inflight workflow instance. If the value of the correlation key matches the value of the variable within the workflow instance, the message is matched to this workflow instance. + +- [Message correlation](/product-manuals/concepts/messages.md) + +### Deployment + +A workflow cannot execute unless it is known by the broker. Deployment is the process of pushing or deploying worklows to the broker. + +- [Getting started tutorial: Deploy a workflow](/product-manuals/zeebe/deployment-guide/getting-started/deploy-a-workflow.md) + +### Event + +An event represents a state change associated with an aspect of an executing workflow instance. Events capture variable changes, state transition in workflow elements, etc. An event will be represented by a timestamp, the variable name and variable value. Events are stored in an append-only log. + +- [Internal processing](/product-manuals/zeebe/technical-concepts/internal-processing.md#events-and-commands) + +### Exporter + +An exporter represents a sink to which Zeebe will submitted all records within the log. This gives users of Zeebe an opportunity to persist records with the log for future use as this data will not be available after log compaction. + +- [Exporter](/product-manuals/zeebe/open-source/exporters.md) + +### Follower + +In a clustered environment, a broker which is not a leader is a follower of a given partition. A follower can become the new leader when the old leader is no longer reachable. + +- [Clustering](/product-manuals/zeebe/technical-concepts/clustering.md#raft-consensus-and-replication-protocol) + +### Gateway + +Clients communicate with the Zeebe cluster through a gateway. The gateway provides a gRPC API and forwards client commands to the cluster. Depending on the setup, a gateway can be embedded in the broker or can be configured to be standalone. + +- [Architecture](/product-manuals/zeebe/technical-concepts/architecture.md#gateway) + +### Incident + +An incident represents an error condition which prevents Zeebe from advancing an executing workflow instance. Zeebe will create an incident if there was an uncaught exception thrown in your code and the number of retries of the given step has been exceeded. + +- [Incident](/product-manuals/concepts/incidents.md) + +### Job + +A job represents a distinct unit of work within a business process. Service tasks represent such +jobs in your workflow and are identified by a unique id. A job has a type to allow specific job +workers to find jobs that they can work on. + +- [Job workers](/product-manuals/concepts/job-workers.md#what-is-a-job) + +### Job activation timeout + +This is the amount of time the broker will wait for a complete or fail response from the job worker after a job has been submitted to the job worker for processing before it marks the job as available again for other job workers. + +- [Job workers](/product-manuals/concepts/job-workers.md#requesting-jobs-from-the-broker) + +### Job worker + +A special type of client that polls for and executes available jobs. An uncompleted job prevents Zeebe from advancing workflow execution to the next step. + +- [Job workers](/product-manuals/concepts/job-workers.md) + +### Leader + +In a clustered environment, one broker, the leader, is responsible for workflow execution and housekeeping of data within a partition. Housekeeping includes, taking snapshots, replication and running exports. + +- [Clustering](/product-manuals/zeebe/technical-concepts/clustering.md#raft-consensus-and-replication-protocol) + +### Log + +The log comprises of an ordered sequence of records written to persistent storage. The log is appended-only and is stored on disk within the broker. + +- [Partitions](/product-manuals/zeebe/technical-concepts/partitions.md#partition-data-layout) + +### Message + +A message contains information to be delivered to interested parties during execution of a workflow instance. Messages can be published via Kafka or Zeebe’s internal messaging system. Messages are associated with timestamp and other constraints such as time-to-live (TTL). + +- [Messages](/product-manuals/concepts/messages.md) + +### Partition + +A partition represents a logical grouping of data in a Zeebe broker. This data includes workflow instance variables stored in RocksDB, commands and events generated by Zeebe stored in the log. The number of partitions is defined by configuration. + +- [Partitions](/product-manuals/zeebe/technical-concepts/partitions.md) + +### Record + +A record represents a command or an event. For example, a command to create a new workflow instance, or a state transition of an executing workflow instance representing an event at a given point in time would result to generation of a record. During the execution lifecycle of a workflow instance, numerous records will be generated to capture various commands and events generated. Records are stored in the log. + +- [Internal processing](/product-manuals/zeebe/technical-concepts/internal-processing.md#events-and-commands) + +### Replication + +Replication is the act of copying data in a partition from a leader to its followers within a clustered Zeebe installation. After _replication_, the leader and followers of a partition will have the exact same data. Replication allows the system to be resilient to brokers going down. + +- [Clustering](/product-manuals/zeebe/technical-concepts/clustering.md#raft-consensus-and-replication-protocol) + +### Replication factor + +This is the number of times data in a partition will be copied and this depends on the number of brokers in a cluster. A cluster with one leader and two followers will have a replication factor of three, as data in each partition needs to have three copies. + +- [Clustering](/product-manuals/zeebe/technical-concepts/clustering.md#raft-consensus-and-replication-protocol) + +### Request timeout + +This is how long a client will wait for a response from the broker after the client has submitted a request. If a response is not received within the client request timeout, the client can consider the broker unreachable. + +- [Zeebe API (gRPC)](grpc.md) + +### Snapshot + +The state of all active workflows instances, (these are also known as inflight workflow instances) are stored as records in an in-memory database called RocksDB. A snapshot represents a copy of all data within the in-memory database at any given point in time. Snapshots are binary images stored on disk and can be used to restore execution state of a workflow. The size of a snapshot is affected by the size of the data. Size of the data depends on several factors including complexity of the model or business process, the size and quantity of variables in each workflow instance as well as the total number of executing workflow instances in a broker. + +- [Resource planning](/product-manuals/zeebe/deployment-guide/operations/resource-planning.md#snapshots) + +### Segment + +The log consists of one or more _segments_. Each _segment_ is a file that contains an ordered sequence records. _Segments_ are deleted when the log is compacted. + +- [Resource planning](/product-manuals/zeebe/deployment-guide/operations/resource-planning.md#event-log) + +### Worker + +A worker executes a job. In the Zeebe nomenclature, these are also referred to as job workers. + +- [Job workers](/product-manuals/concepts/job-workers.md) + +### Workflow + +A workflow is a defined sequence of distinct steps representing your business logic. Examples of a +workflow could be an e-commerce shopping experience, onboarding a new employee, etc. In Zeebe, +workflows are identified by a unique process id. The workflow is usually also referred to as the +BPMN model. + +- [Workflows](/product-manuals/concepts/workflows.md) + +### Workflow instance + +While a workflow represents a defined sequence of distinct steps representing your business logic, a workflow instance represents a currently executing or completed workflow. For a single workflow, there could be many associated _workflow instances_ in various stages of their executing lifecycle. Workflow instances are identitied by workflow instance id. Executing workflows instances are also sometimes referred to as inflight workflows. + +- [Workflows](/product-manuals/concepts/workflows.md) + +### Workflow instance variable + +A workflow instance variable represents the execution state (i.e data) of a workflow instance. These variables capture business process parameters which are input and output of various stages of the workflow instance and which also influence process flow execution. + +- [Variables](/product-manuals/concepts/variables.md) +- [Data flow](/reference/bpmn-workflows/data-flow.md) diff --git a/docs/reference/grpc.md b/docs/reference/grpc.md new file mode 100644 index 00000000000..d6926422d57 --- /dev/null +++ b/docs/reference/grpc.md @@ -0,0 +1,672 @@ +--- +id: grpc +title: "Zeebe API (gRPC)" +--- + +[Zeebe](../product-manuals/zeebe/zeebe-overview.md) clients use [gRPC](https://grpc.io/) to communicate with the cluster. + +## Gateway Service + +The Zeebe Client gRPC API is exposed through a single gateway service. + +### `ActivateJobs` RPC + +Iterates through all known partitions round-robin and activates up to the requested +maximum and streams them back to the client as they are activated. + +#### Input: `ActivateJobsRequest` + +```protobuf +message ActivateJobsRequest { + // the job type, as defined in the BPMN process (e.g. ) + string type = 1; + // the name of the worker activating the jobs, mostly used for logging purposes + string worker = 2; + // a job returned after this call will not be activated by another call until the + // timeout (in ms) has been reached + int64 timeout = 3; + // the maximum jobs to activate by this request + int32 maxJobsToActivate = 4; + // a list of variables to fetch as the job variables; if empty, all visible variables at + // the time of activation for the scope of the job will be returned + repeated string fetchVariable = 5; + // The request will be completed when at least one job is activated or after the requestTimeout (in ms). + // if the requestTimeout = 0, a default timeout is used. + // if the requestTimeout < 0, long polling is disabled and the request is completed immediately, even when no job is activated. + int64 requestTimeout = 6; +} +``` + +#### Output: `ActivateJobsResponse` + +```protobuf +message ActivateJobsResponse { + // list of activated jobs + repeated ActivatedJob jobs = 1; +} + +message ActivatedJob { + // the key, a unique identifier for the job + int64 key = 1; + // the type of the job (should match what was requested) + string type = 2; + // the job's workflow instance key + int64 workflowInstanceKey = 3; + // the bpmn process ID of the job workflow definition + string bpmnProcessId = 4; + // the version of the job workflow definition + int32 workflowDefinitionVersion = 5; + // the key of the job workflow definition + int64 workflowKey = 6; + // the associated task element ID + string elementId = 7; + // the unique key identifying the associated task, unique within the scope of the + // workflow instance + int64 elementInstanceKey = 8; + // a set of custom headers defined during modelling; returned as a serialized + // JSON document + string customHeaders = 9; + // the name of the worker which activated this job + string worker = 10; + // the amount of retries left to this job (should always be positive) + int32 retries = 11; + // when the job can be activated again, sent as a UNIX epoch timestamp + int64 deadline = 12; + // JSON document, computed at activation time, consisting of all visible variables to + // the task scope + string variables = 13; +} +``` + +#### Errors + +##### GRPC_STATUS_INVALID_ARGUMENT + +Returned if: + +- type is blank (empty string, null) +- worker is blank (empty string, null) +- timeout less than 1 (ms) +- amount is less than 1 + +### `CancelWorkflowInstance` RPC + +Cancels a running workflow instance + +#### Input: `CancelWorkflowInstanceRequest` + +```protobuf +message CancelWorkflowInstanceRequest { + // the workflow instance key (as, for example, obtained from + // CreateWorkflowInstanceResponse) + int64 workflowInstanceKey = 1; +} +``` + +#### Output: `CancelWorkflowInstanceResponse` + +```protobuf +message CancelWorkflowInstanceResponse { +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no workflow instance exists with the given key. Note that since workflow instances + are removed once their are finished, it could mean the instance did exist at some point. + +### `CompleteJob` RPC + +Completes a job with the given payload, which allows completing the associated service task. + +#### Input: `CompleteJobRequest` + +```protobuf +message CompleteJobRequest { + // the unique job identifier, as obtained from ActivateJobsResponse + int64 jobKey = 1; + // a JSON document representing the variables in the current task scope + string variables = 2; +} +``` + +#### Output: `CompleteJobResponse` + +```protobuf +message CompleteJobResponse { +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no job exists with the given job key. Note that since jobs are removed once completed, + it could be that this job did exist at some point. + +##### GRPC_STATUS_FAILED_PRECONDITION + +Returned if: + +- the job was marked as failed. In that case, the related incident must be resolved before + the job can be activated again and completed. + +### `CreateWorkflowInstance` RPC + +Creates and starts an instance of the specified workflow. The workflow definition to use +to create the instance can be specified either using its unique key (as returned by +DeployWorkflow), or using the BPMN process ID and a version. Pass -1 as the version to +use the latest deployed version. + +Note that only workflows with none start events can be started through this command. + +#### Input: `CreateWorkflowInstanceRequest` + +```protobuf +message CreateWorkflowInstanceRequest { + // the unique key identifying the workflow definition (e.g. returned from a workflow + // in the DeployWorkflowResponse message) + int64 workflowKey = 1; + // the BPMN process ID of the workflow definition + string bpmnProcessId = 2; + // the version of the process; set to -1 to use the latest version + int32 version = 3; + // JSON document that will instantiate the variables for the root variable scope of the + // workflow instance; it must be a JSON object, as variables will be mapped in a + // key-value fashion. e.g. { "a": 1, "b": 2 } will create two variables, named "a" and + // "b" respectively, with their associated values. [{ "a": 1, "b": 2 }] would not be a + // valid argument, as the root of the JSON document is an array and not an object. + string variables = 4; +} +``` + +#### Output: `CreateWorkflowInstanceResponse` + +```protobuf +message CreateWorkflowInstanceResponse { + // the key of the workflow definition which was used to create the workflow instance + int64 workflowKey = 1; + // the BPMN process ID of the workflow definition which was used to create the workflow + // instance + string bpmnProcessId = 2; + // the version of the workflow definition which was used to create the workflow instance + int32 version = 3; + // the unique identifier of the created workflow instance; to be used wherever a request + // needs a workflow instance key (e.g. CancelWorkflowInstanceRequest) + int64 workflowInstanceKey = 4; +} +``` + +### `CreateWorkflowInstanceWithResult` RPC + +Similar to `CreateWorkflowInstance` RPC , creates and starts an instance of the specified workflow. +Unlike `CreateWorkflowInstance` RPC, the response is returned when the workflow is completed. + +Note that only workflows with none start events can be started through this command. + +#### Input: `CreateWorkflowInstanceWithResultRequest` + +```protobuf +message CreateWorkflowInstanceRequest { + CreateWorkflowInstanceRequest request = 1; + // timeout (in ms). the request will be closed if the workflow is not completed before + // the requestTimeout. + // if requestTimeout = 0, uses the generic requestTimeout configured in the gateway. + int64 requestTimeout = 2; +} +``` + +#### Output: `CreateWorkflowInstanceWithResultResponse` + +```protobuf +message CreateWorkflowInstanceResponse { + // the key of the workflow definition which was used to create the workflow instance + int64 workflowKey = 1; + // the BPMN process ID of the workflow definition which was used to create the workflow + // instance + string bpmnProcessId = 2; + // the version of the workflow definition which was used to create the workflow instance + int32 version = 3; + // the unique identifier of the created workflow instance; to be used wherever a request + // needs a workflow instance key (e.g. CancelWorkflowInstanceRequest) + int64 workflowInstanceKey = 4; + // consisting of all visible variables to the root scope + string variables = 5; +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no workflow with the given key exists (if workflowKey was given) +- no workflow with the given process ID exists (if bpmnProcessId was given but version was -1) +- no workflow with the given process ID and version exists (if both bpmnProcessId and version were given) + +##### GRPC_STATUS_FAILED_PRECONDITION + +Returned if: + +- the workflow definition does not contain a none start event; only workflows with none + start event can be started manually. + +##### GRPC_STATUS_INVALID_ARGUMENT + +Returned if: + +- the given variables argument is not a valid JSON document; it is expected to be a valid + JSON document where the root node is an object. + +### `DeployWorkflow` RPC + +Deploys one or more workflows to Zeebe. Note that this is an atomic call, +i.e. either all workflows are deployed, or none of them are. + +#### Input: `DeployWorkflowRequest` + +```protobuf +message DeployWorkflowRequest { + // List of workflow resources to deploy + repeated WorkflowRequestObject workflows = 1; +} + +message WorkflowRequestObject { + enum ResourceType { + // FILE type means the gateway will try to detect the resource type + // using the file extension of the name field + FILE = 0; + BPMN = 1; // extension 'bpmn' + YAML = 2; // extension 'yaml' + } + + // the resource basename, e.g. myProcess.bpmn + string name = 1; + // the resource type; if set to BPMN or YAML then the file extension + // is ignored + ResourceType type = 2; + // the process definition as a UTF8-encoded string + bytes definition = 3; +} +``` + +#### Output: `DeployWorkflowResponse` + +```protobuf +message DeployWorkflowResponse { + // the unique key identifying the deployment + int64 key = 1; + // a list of deployed workflows + repeated WorkflowMetadata workflows = 2; +} + +message WorkflowMetadata { + // the bpmn process ID, as parsed during deployment; together with the version forms a + // unique identifier for a specific workflow definition + string bpmnProcessId = 1; + // the assigned process version + int32 version = 2; + // the assigned key, which acts as a unique identifier for this workflow + int64 workflowKey = 3; + // the resource name (see: WorkflowRequestObject.name) from which this workflow was + // parsed + string resourceName = 4; +} +``` + +#### Errors + +##### GRPC_STATUS_INVALID_ARGUMENT + +Returned if: + +- no resources given. +- if at least one resource is invalid. A resource is considered invalid if: + - it is not a BPMN or YAML file (currently detected through the file extension) + - the resource data is not deserializable (e.g. detected as BPMN, but it's broken XML) + - the workflow is invalid (e.g. an event-based gateway has an outgoing sequence flow to a task) + +### `FailJob` RPC + +Marks the job as failed; if the retries argument is positive, then the job will be immediately +activatable again, and a worker could try again to process it. If it is zero or negative however, +an incident will be raised, tagged with the given errorMessage, and the job will not be +activatable until the incident is resolved. + +#### Input: `FailJobRequest` + +```protobuf +message FailJobRequest { + // the unique job identifier, as obtained when activating the job + int64 jobKey = 1; + // the amount of retries the job should have left + int32 retries = 2; + // an optional message describing why the job failed + // this is particularly useful if a job runs out of retries and an incident is raised, + // as it this message can help explain why an incident was raised + string errorMessage = 3; +} +``` + +#### Output: `FailJobResponse` + +```protobuf +message FailJobResponse { +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no job was found with the given key + +##### GRPC_STATUS_FAILED_PRECONDITION + +Returned if: + +- the job was not activated +- the job is already in a failed state, i.e. ran out of retries + +### `PublishMessage` RPC + +Publishes a single message. Messages are published to specific partitions computed from their +correlation keys. + +#### Input: `PublishMessageRequest` + +```protobuf +message PublishMessageRequest { + // the name of the message + string name = 1; + // the correlation key of the message + string correlationKey = 2; + // how long the message should be buffered on the broker, in milliseconds + int64 timeToLive = 3; + // the unique ID of the message; can be omitted. only useful to ensure only one message + // with the given ID will ever be published (during its lifetime) + string messageId = 4; + // the message variables as a JSON document; to be valid, the root of the document must be an + // object, e.g. { "a": "foo" }. [ "foo" ] would not be valid. + string variables = 5; +} +``` + +#### Output: `PublishMessageResponse` + +```protobuf +message PublishMessageResponse { + // the unique ID of the message that was published + int64 key = 1; +} +``` + +#### Errors + +##### GRPC_STATUS_ALREADY_EXISTS + +Returned if: + +- a message with the same ID was previously published (and is still alive) + +### `ResolveIncident` RPC + +Resolves a given incident. This simply marks the incident as resolved; most likely a call to +UpdateJobRetries or UpdateWorkflowInstancePayload will be necessary to actually resolve the +problem, following by this call. + +#### Input: `ResolveIncidentRequest` + +```protobuf +message ResolveIncidentRequest { + // the unique ID of the incident to resolve + int64 incidentKey = 1; +} +``` + +#### Output: `ResolveIncidentResponse` + +```protobuf +message ResolveIncidentResponse { +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no incident with the given key exists + +### `SetVariables` RPC + +Updates all the variables of a particular scope (e.g. workflow instance, flow element instance) from the given JSON document. + +#### Input: `SetVariablesRequest` + +```protobuf +message SetVariablesRequest { + // the unique identifier of a particular element; can be the workflow instance key (as + // obtained during instance creation), or a given element, such as a service task (see + // elementInstanceKey on the job message) + int64 elementInstanceKey = 1; + // a JSON serialized document describing variables as key value pairs; the root of the document + // must be an object + string variables = 2; + // if true, the variables will be merged strictly into the local scope (as indicated by + // elementInstanceKey); this means the variables is not propagated to upper scopes. + // for example, let's say we have two scopes, '1' and '2', with each having effective variables as: + // 1 => `{ "foo" : 2 }`, and 2 => `{ "bar" : 1 }`. if we send an update request with + // elementInstanceKey = 2, variables `{ "foo" : 5 }`, and local is true, then scope 1 will + // be unchanged, and scope 2 will now be `{ "bar" : 1, "foo" 5 }`. if local was false, however, + // then scope 1 would be `{ "foo": 5 }`, and scope 2 would be `{ "bar" : 1 }`. + bool local = 3; +} +``` + +#### Output: `SetVariablesResponse` + +```protobuf +message SetVariablesResponse { + // the unique key of the set variables command + int64 key = 1; +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no element with the given `elementInstanceKey` was exists + +##### GRPC_STATUS_INVALID_ARGUMENT + +Returned if: + +- the given payload is not a valid JSON document; all payloads are expected to be + valid JSON documents where the root node is an object. + +### `ThrowError` RPC + +Throw an error to indicate that a business error is occurred while processing the job. The error is identified by an error code and is handled by an error catch event in the workflow with the same error code. + +#### Input: `ThrowErrorRequest` + +```protobuf +message ThrowErrorRequest { + // the unique job identifier, as obtained when activating the job + int64 jobKey = 1; + // the error code that will be matched with an error catch event + string errorCode = 2; + // an optional error message that provides additional context + string errorMessage = 3; +} +``` + +#### Output: `ThrowErrorResponse` + +```protobuf +message ThrowErrorResponse { +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no job was found with the given key + +##### GRPC_STATUS_FAILED_PRECONDITION + +Returned if: + +- the job is already in a failed state, i.e. ran out of retries + +### `Topology` RPC + +Obtains the current topology of the cluster the gateway is part of. + +#### Input: `TopologyRequest` + +```protobuf +message TopologyRequest { +} +``` + +#### Output: `TopologyResponse` + +```protobuf +message TopologyResponse { + // list of brokers part of this cluster + repeated BrokerInfo brokers = 1; + // how many nodes are in the cluster + int32 clusterSize = 2; + // how many partitions are spread across the cluster + int32 partitionsCount = 3; + // configured replication factor for this cluster + int32 replicationFactor = 4; + // gateway version + string gatewayVersion = 5; +} + +message BrokerInfo { + // unique (within a cluster) node ID for the broker + int32 nodeId = 1; + // hostname of the broker + string host = 2; + // port for the broker + int32 port = 3; + // list of partitions managed or replicated on this broker + repeated Partition partitions = 4; + // broker version + string version = 5; +} + +message Partition { + // Describes the Raft role of the broker for a given partition + enum PartitionBrokerRole { + LEADER = 0; + FOLLOWER = 1; + } + + // Describes the current health of the partition + enum PartitionBrokerHealth { + HEALTHY = 0; + UNHEALTHY = 1; + } + + // the unique ID of this partition + int32 partitionId = 1; + // the role of the broker for this partition + PartitionBrokerRole role = 2; + // the health of this partition + PartitionBrokerHealth health = 3; +} +``` + +#### Errors + +No specific errors + +### `UpdateJobRetries` RPC + +Updates the number of retries a job has left. This is mostly useful for jobs that have run out of +retries, should the underlying problem be solved. + +#### Input: `UpdateJobRetriesRequest` + +```protobuf +message UpdateJobRetriesRequest { + // the unique job identifier, as obtained through ActivateJobs + int64 jobKey = 1; + // the new amount of retries for the job; must be positive + int32 retries = 2; +} +``` + +#### Output: `UpdateJobRetriesResponse` + +```protobuf +message UpdateJobRetriesResponse { +} +``` + +#### Errors + +##### GRPC_STATUS_NOT_FOUND + +Returned if: + +- no job exists with the given key + +##### GRPC_STATUS_INVALID_ARGUMENT + +Returned if: + +- retries is not greater than 0 + +## Technical Error Handling + +In the documentation above, the documented errors are business logic errors. +These are errors which are a result of request processing logic, and not serialization, network, or +other more general errors. These error are described in this sections. + +The gRPC API for Zeebe is exposed through an API gateway, which acts as a proxy +for the cluster. Generally, this means that the clients execute a remote call on the gateway, +which is then translated to special binary protocol that the gateway uses to +communicate with nodes in the cluster. The nodes in the cluster are called brokers. + +Technical errors which occur between gateway and brokers (e.g. the gateway cannot deserialize the broker response, +the broker is unavailable, etc.) are reported to the client using the following error codes: + +- `GRPC_STATUS_RESOURCE_EXHAUSTED`: when a broker receives more requests than it can handle, it signals back-pressure and rejects requests with this error code. + - In this case, it is possible to retry the requests with an appropriate retry strategy. + - If you receive many such errors within a small time period, it indicates that the broker is constantly under high load. + - It is recommended to reduce the rate of requests. + When back-pressure is active, the broker may reject any request except _CompleteJob_ RPC and _FailJob_ RPC. + - These requests are white-listed for back-pressure and are always accepted by the broker even if it is receiving requests above its limits. +- `GRPC_STATUS_UNAVAILABLE`: if the gateway itself is in an invalid state (e.g. out of memory) +- `GRPC_STATUS_INTERNAL`: for any other internal errors that occurred between the gateway and the broker. + +This behavior applies to every request. In these cases, the client should retry +with an appropriate retry policy (e.g. a combination of exponential backoff or jitter wrapped +in a circuit breaker). + +As the gRPC server/client is based on generated code, keep in mind that +any call made to the server can also return errors as described by the spec +[here](https://grpc.io/docs/guides/error.html#error-status-codes). diff --git a/docs/reference/overview.md b/docs/reference/overview.md index 475a35985f7..c12b6d1a5fe 100644 --- a/docs/reference/overview.md +++ b/docs/reference/overview.md @@ -1,8 +1,16 @@ --- id: overview -title: Overview Reference -sidebar_label: Overview Reference +title: Overview +sidebar_label: Overview slug: /reference/ --- -... +This section contains general reference material for Camunda Cloud, including API references. + +- [Console API clients](cloud-console-api-clients.md) +- [Console API (REST)](cloud-console-api-reference.md) +- [Zeebe API (gRPC)](grpc.md) +- [Tasklist API (GraphQL)](tasklist-api/generated.md) +- [BPMN corkflows](bpmn-workflows/bpmn-primer.md) +- [FEEL expressions](feel/what-is-feel.md) +- [Glossary](glossary.md) diff --git a/docs/reference/tasklist-api/directives/deprecated.mdx b/docs/reference/tasklist-api/directives/deprecated.mdx new file mode 100644 index 00000000000..d619a01031c --- /dev/null +++ b/docs/reference/tasklist-api/directives/deprecated.mdx @@ -0,0 +1,30 @@ +--- +id: deprecated +title: deprecated +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Marks an element of a GraphQL schema as no longer supported. + +```graphql +directive @deprecated( + reason: String = "No longer supported" +) +``` + +### Arguments + +#### `reason` ([`String`](/docs/reference/tasklist-api/scalars/string)) + +Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/). diff --git a/docs/reference/tasklist-api/directives/include.mdx b/docs/reference/tasklist-api/directives/include.mdx new file mode 100644 index 00000000000..f1984b03380 --- /dev/null +++ b/docs/reference/tasklist-api/directives/include.mdx @@ -0,0 +1,30 @@ +--- +id: include +title: include +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Directs the executor to include this field or fragment only when the `if` argument is true. + +```graphql +directive @include( + if: Boolean! +) +``` + +### Arguments + +#### `if` ([`Boolean!`](/docs/reference/tasklist-api/scalars/boolean)) + +Included when true. diff --git a/docs/reference/tasklist-api/directives/skip.mdx b/docs/reference/tasklist-api/directives/skip.mdx new file mode 100644 index 00000000000..23fb947d0e0 --- /dev/null +++ b/docs/reference/tasklist-api/directives/skip.mdx @@ -0,0 +1,30 @@ +--- +id: skip +title: skip +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Directs the executor to skip this field or fragment when the `if` argument is true. + +```graphql +directive @skip( + if: Boolean! +) +``` + +### Arguments + +#### `if` ([`Boolean!`](/docs/reference/tasklist-api/scalars/boolean)) + +Skipped when true. diff --git a/docs/reference/tasklist-api/directives/specified-by.mdx b/docs/reference/tasklist-api/directives/specified-by.mdx new file mode 100644 index 00000000000..0d009e518c8 --- /dev/null +++ b/docs/reference/tasklist-api/directives/specified-by.mdx @@ -0,0 +1,30 @@ +--- +id: specified-by +title: specifiedBy +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Exposes a URL that specifies the behaviour of this scalar. + +```graphql +directive @specifiedBy( + url: String! +) +``` + +### Arguments + +#### `url` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +The URL that specifies the behaviour of this scalar. diff --git a/docs/reference/tasklist-api/enums/task-state.mdx b/docs/reference/tasklist-api/enums/task-state.mdx new file mode 100644 index 00000000000..e3a2367137c --- /dev/null +++ b/docs/reference/tasklist-api/enums/task-state.mdx @@ -0,0 +1,34 @@ +--- +id: task-state +title: TaskState +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +State of the task + +```graphql +enum TaskState { + CREATED + COMPLETED + CANCELED +} +``` + +### Values + +#### `CREATED` + +#### `COMPLETED` + +#### `CANCELED` diff --git a/docs/reference/tasklist-api/generated.md b/docs/reference/tasklist-api/generated.md new file mode 100644 index 00000000000..c82c35b7d07 --- /dev/null +++ b/docs/reference/tasklist-api/generated.md @@ -0,0 +1,13 @@ +--- +id: schema +title: GraphQL schema +--- + +This documentation has been automatically generated from the GraphQL schema. + +Use the docs in the sidebar to find out how to use the schema: + +- **Allowed operations**: queries and mutations. +- **Schema-defined types**: scalars, objects, enums, interfaces, unions, and input objects. + +Generated on December 15, 2020 at 2:43:29 PM. diff --git a/docs/reference/tasklist-api/inputs/task-query.mdx b/docs/reference/tasklist-api/inputs/task-query.mdx new file mode 100644 index 00000000000..3a3ce13a0fe --- /dev/null +++ b/docs/reference/tasklist-api/inputs/task-query.mdx @@ -0,0 +1,40 @@ +--- +id: task-query +title: TaskQuery +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +What can be queried + +```graphql +type TaskQuery { + state: TaskState + assigned: Boolean + assignee: String +} +``` + +### Fields + +#### `state` ([`TaskState`](/docs/reference/tasklist-api/enums/task-state)) + +State of the tasks + +#### `assigned` ([`Boolean`](/docs/reference/tasklist-api/scalars/boolean)) + +Are the tasks assigned? + +#### `assignee` ([`String`](/docs/reference/tasklist-api/scalars/string)) + +Who is assigned to the tasks? diff --git a/docs/reference/tasklist-api/inputs/variable-input.mdx b/docs/reference/tasklist-api/inputs/variable-input.mdx new file mode 100644 index 00000000000..81508252344 --- /dev/null +++ b/docs/reference/tasklist-api/inputs/variable-input.mdx @@ -0,0 +1,31 @@ +--- +id: variable-input +title: VariableInput +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Change or add a variable with name and value + +```graphql +type VariableInput { + name: String! + value: String! +} +``` + +### Fields + +#### `name` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +#### `value` ([`String!`](/docs/reference/tasklist-api/scalars/string)) diff --git a/docs/reference/tasklist-api/mutations/claim-task.mdx b/docs/reference/tasklist-api/mutations/claim-task.mdx new file mode 100644 index 00000000000..8c1b310faad --- /dev/null +++ b/docs/reference/tasklist-api/mutations/claim-task.mdx @@ -0,0 +1,35 @@ +--- +id: claim-task +title: claimTask +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Claim a task with taskId to currently logged in user. Returns the task. + +```graphql +claimTask( + taskId: String! +): Task! + +``` + +### Arguments + +#### `taskId` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +### Type + +#### [`Task`](/docs/reference/tasklist-api/objects/task) + +Describes the User task diff --git a/docs/reference/tasklist-api/mutations/complete-task.mdx b/docs/reference/tasklist-api/mutations/complete-task.mdx new file mode 100644 index 00000000000..bded58750f7 --- /dev/null +++ b/docs/reference/tasklist-api/mutations/complete-task.mdx @@ -0,0 +1,38 @@ +--- +id: complete-task +title: completeTask +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Complete a task with taskId and optional variables. Returns the task. + +```graphql +completeTask( + taskId: String! + variables: [VariableInput!]! +): Task! + +``` + +### Arguments + +#### `taskId` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +#### `variables` ([`[VariableInput!]!`](/docs/reference/tasklist-api/inputs/variable-input)) + +### Type + +#### [`Task`](/docs/reference/tasklist-api/objects/task) + +Describes the User task diff --git a/docs/reference/tasklist-api/mutations/unclaim-task.mdx b/docs/reference/tasklist-api/mutations/unclaim-task.mdx new file mode 100644 index 00000000000..645d1f70b1b --- /dev/null +++ b/docs/reference/tasklist-api/mutations/unclaim-task.mdx @@ -0,0 +1,35 @@ +--- +id: unclaim-task +title: unclaimTask +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Unclaim a task with taskId. Returns the task. + +```graphql +unclaimTask( + taskId: String! +): Task! + +``` + +### Arguments + +#### `taskId` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +### Type + +#### [`Task`](/docs/reference/tasklist-api/objects/task) + +Describes the User task diff --git a/docs/reference/tasklist-api/objects/task.mdx b/docs/reference/tasklist-api/objects/task.mdx new file mode 100644 index 00000000000..886c679b480 --- /dev/null +++ b/docs/reference/tasklist-api/objects/task.mdx @@ -0,0 +1,65 @@ +--- +id: task +title: Task +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Describes the User task + +```graphql +type Task { + id: ID! + name: String! + workflowName: String! + creationTime: String! + completionTime: String + assignee: User + variables: [Variable!] + taskState: TaskState! +} +``` + +### Fields + +#### `id` ([`ID!`](/docs/reference/tasklist-api/scalars/id)) + +The unique identifier of the task + +#### `name` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +Name of the task + +#### `workflowName` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +Name of the workflow + +#### `creationTime` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +When was the task created + +#### `completionTime` ([`String`](/docs/reference/tasklist-api/scalars/string)) + +When was the task completed + +#### `assignee` ([`User`](/docs/reference/tasklist-api/objects/user)) + +Who is assigned to the task + +#### `variables` ([`[Variable!]`](/docs/reference/tasklist-api/objects/variable)) + +Variables associated to the task + +#### `taskState` ([`TaskState!`](/docs/reference/tasklist-api/enums/task-state)) + +State of the task diff --git a/docs/reference/tasklist-api/objects/user.mdx b/docs/reference/tasklist-api/objects/user.mdx new file mode 100644 index 00000000000..7327e2a4d4f --- /dev/null +++ b/docs/reference/tasklist-api/objects/user.mdx @@ -0,0 +1,34 @@ +--- +id: user +title: User +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Describes the user + +```graphql +type User { + username: ID! + firstname: String + lastname: String +} +``` + +### Fields + +#### `username` ([`ID!`](/docs/reference/tasklist-api/scalars/id)) + +#### `firstname` ([`String`](/docs/reference/tasklist-api/scalars/string)) + +#### `lastname` ([`String`](/docs/reference/tasklist-api/scalars/string)) diff --git a/docs/reference/tasklist-api/objects/variable.mdx b/docs/reference/tasklist-api/objects/variable.mdx new file mode 100644 index 00000000000..218fdeda495 --- /dev/null +++ b/docs/reference/tasklist-api/objects/variable.mdx @@ -0,0 +1,31 @@ +--- +id: variable +title: Variable +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Variable used in task + +```graphql +type Variable { + name: String! + value: String! +} +``` + +### Fields + +#### `name` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +#### `value` ([`String!`](/docs/reference/tasklist-api/scalars/string)) diff --git a/docs/reference/tasklist-api/queries/current-user.mdx b/docs/reference/tasklist-api/queries/current-user.mdx new file mode 100644 index 00000000000..6ee1635f900 --- /dev/null +++ b/docs/reference/tasklist-api/queries/current-user.mdx @@ -0,0 +1,29 @@ +--- +id: current-user +title: currentUser +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Get currently logged in user. + +```graphql +currentUser: User! + +``` + +### Type + +#### [`User`](/docs/reference/tasklist-api/objects/user) + +Describes the user diff --git a/docs/reference/tasklist-api/queries/task.mdx b/docs/reference/tasklist-api/queries/task.mdx new file mode 100644 index 00000000000..d56671f64e9 --- /dev/null +++ b/docs/reference/tasklist-api/queries/task.mdx @@ -0,0 +1,35 @@ +--- +id: task +title: task +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Get task with id. Returns task or error when task does not exist. + +```graphql +task( + id: String! +): Task! + +``` + +### Arguments + +#### `id` ([`String!`](/docs/reference/tasklist-api/scalars/string)) + +### Type + +#### [`Task`](/docs/reference/tasklist-api/objects/task) + +Describes the User task diff --git a/docs/reference/tasklist-api/queries/tasks.mdx b/docs/reference/tasklist-api/queries/tasks.mdx new file mode 100644 index 00000000000..4f7e68211c4 --- /dev/null +++ b/docs/reference/tasklist-api/queries/tasks.mdx @@ -0,0 +1,35 @@ +--- +id: tasks +title: tasks +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +Find all tasks specified by query. + +```graphql +tasks( + query: TaskQuery! +): [Task!]! + +``` + +### Arguments + +#### `query` ([`TaskQuery!`](/docs/reference/tasklist-api/inputs/task-query)) + +### Type + +#### [`Task`](/docs/reference/tasklist-api/objects/task) + +Describes the User task diff --git a/docs/reference/tasklist-api/scalars/boolean.mdx b/docs/reference/tasklist-api/scalars/boolean.mdx new file mode 100644 index 00000000000..3c4e77f42d8 --- /dev/null +++ b/docs/reference/tasklist-api/scalars/boolean.mdx @@ -0,0 +1,22 @@ +--- +id: boolean +title: Boolean +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +The `Boolean` scalar type represents `true` or `false`. + +```graphql +scalar Boolean +``` diff --git a/docs/reference/tasklist-api/scalars/id.mdx b/docs/reference/tasklist-api/scalars/id.mdx new file mode 100644 index 00000000000..b0c9ad76aa1 --- /dev/null +++ b/docs/reference/tasklist-api/scalars/id.mdx @@ -0,0 +1,22 @@ +--- +id: id +title: ID +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. + +```graphql +scalar ID +``` diff --git a/docs/reference/tasklist-api/scalars/string.mdx b/docs/reference/tasklist-api/scalars/string.mdx new file mode 100644 index 00000000000..f185a8923de --- /dev/null +++ b/docs/reference/tasklist-api/scalars/string.mdx @@ -0,0 +1,22 @@ +--- +id: string +title: String +--- + +export const Tag = ({children, color}) => ( + +{children} + +); + +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. + +```graphql +scalar String +``` diff --git a/docs/reference/tasklist-api/sidebar-schema.js b/docs/reference/tasklist-api/sidebar-schema.js new file mode 100644 index 00000000000..badb4aa3ade --- /dev/null +++ b/docs/reference/tasklist-api/sidebar-schema.js @@ -0,0 +1,64 @@ +module.exports = { + "Tasklist API": [ + { type: "doc", id: "reference/tasklist-api/schema" }, + { + type: "category", + label: "Queries", + items: [ + "reference/tasklist-api/queries/current-user", + "reference/tasklist-api/queries/task", + "reference/tasklist-api/queries/tasks", + ], + }, + { + type: "category", + label: "Mutations", + items: [ + "reference/tasklist-api/mutations/claim-task", + "reference/tasklist-api/mutations/complete-task", + "reference/tasklist-api/mutations/unclaim-task", + ], + }, + { + type: "category", + label: "Directives", + items: [ + "reference/tasklist-api/directives/deprecated", + "reference/tasklist-api/directives/include", + "reference/tasklist-api/directives/skip", + "reference/tasklist-api/directives/specified-by", + ], + }, + { + type: "category", + label: "Objects", + items: [ + "reference/tasklist-api/objects/task", + "reference/tasklist-api/objects/user", + "reference/tasklist-api/objects/variable", + ], + }, + { + type: "category", + label: "Enums", + items: ["reference/tasklist-api/enums/task-state"], + }, + { + type: "category", + label: "Inputs", + items: [ + "reference/tasklist-api/inputs/task-query", + "reference/tasklist-api/inputs/variable-input", + ], + }, + { + type: "category", + label: "Scalars", + items: [ + "reference/tasklist-api/scalars/boolean", + "reference/tasklist-api/scalars/id", + "reference/tasklist-api/scalars/string", + ], + }, + ], +}; diff --git a/docs/samples/overview.md b/docs/samples/overview.md deleted file mode 100644 index b2670d29191..00000000000 --- a/docs/samples/overview.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: overview -title: Overview Samples -sidebar_label: Overview Samples -slug: /samples/ ---- - -... diff --git a/docusaurus.config.js b/docusaurus.config.js index 76a15d3575f..a88c9dc644a 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -14,50 +14,31 @@ module.exports = { title: "Camunda Cloud Docs", logo: { alt: "Camunda Cloud Docs", - src: "img/camunda-cloud-logo.png", + src: "img/camunda-cloud-gradient.png", }, items: [ { - to: "docs/guides/", - activeBasePath: "docs/guides/", - label: "Guides", + type: "docsVersionDropdown", position: "left", }, { - to: "docs/product-manuals/", - activeBasePath: "docs/product-manuals", - label: "Product Manuals", + type: "doc", + docId: "guides/introduction-to-camunda-cloud", + label: "Guides", position: "left", }, { - to: "docs/reference/", - activeBasePath: "docs/reference", - label: "Reference", + type: "doc", + docId: "product-manuals/overview", + label: "Product Manuals", position: "left", }, { - to: "docs/samples/", - activeBasePath: "docs/samples", - label: "Samples", + type: "doc", + docId: "reference/overview", + label: "Reference", position: "left", }, - { - to: "contact", - activeBasePath: "contact", - label: "Contact", - position: "right", - }, - { href: "https://zeebe.io/blog/", label: "Blog", position: "left" }, - { - href: "https://camunda.io", - label: "Cloud Console", - position: "right", - }, - { - href: "https://github.com/camunda-cloud/camunda-cloud-docs", - label: "GitHub", - position: "right", - }, ], }, footer: { @@ -88,9 +69,17 @@ module.exports = { { title: "More", items: [ + { + label: "Contact", + to: "contact", + }, + { + label: "Cloud Console", + href: "https://camunda.io", + }, { label: "Blog", - href: "https://camunda.com/blog/", + href: "https://zeebe.io/blog/", }, { label: "GitHub", @@ -106,6 +95,42 @@ module.exports = { indexName: "camunda", searchParameters: {}, // Optional (if provided by Algolia) }, + // Disabling Dark Mode + // https://github.com/camunda-cloud/camunda-cloud-documentation/issues/125 + // + colorMode: { + // "light" | "dark" + defaultMode: "light", + + // Hides the switch in the navbar + // Useful if you want to support a single color mode + disableSwitch: true, + + // Should we use the prefers-color-scheme media-query, + // using user system preferences, instead of the hardcoded defaultMode + respectPrefersColorScheme: false, + + // Dark/light switch icon options + switchConfig: { + // Icon for the switch while in dark mode + darkIcon: "🌙", + + // CSS to apply to dark icon, + // React inline style object + // see https://reactjs.org/docs/dom-elements.html#style + darkIconStyle: { + marginLeft: "2px", + }, + + // Unicode icons such as '\u2600' will work + // Unicode with 5 chars require brackets: '\u{1F602}' + lightIcon: "\u{1F602}", + + lightIconStyle: { + marginLeft: "1px", + }, + }, + }, }, presets: [ [ @@ -116,6 +141,17 @@ module.exports = { // Please change this to your repo. editUrl: "https://github.com/camunda-cloud/camunda-cloud-documentation/edit/master/", + // disableVersioning: isVersioningDisabled, + lastVersion: "current", + // onlyIncludeVersions: + // !isVersioningDisabled && (isDev || isDeployPreview) + // ? ["current", ...versions.slice(0, 2)] + // : undefined, + versions: { + current: { + label: `latest`, + }, + }, }, blog: { showReadingTime: true, diff --git a/hacks/cropIf.sh b/hacks/cropIf.sh new file mode 100755 index 00000000000..48af4456667 --- /dev/null +++ b/hacks/cropIf.sh @@ -0,0 +1,42 @@ +#/bin/sh +# cropIf.sh $file $height $width $cropTop $cropBottom $cropLeft $cropRight +# +# usefull for remove browser decorations from screenshots, requires imagemagick installed on your machine +# +# will just modify files if they match the given sourceWidth and sourceHeight +# +# can be easily integrated into a recursive find from basedirectory like this +# find . -not -path "./node_modules/*" -name "*png" -exec hacks/cropIf.sh {} 1032 835 68 2 2 2 \; + + +if [ "$#" -ne 7 ]; + then + echo "illegal number of parameters, expecting 7: file, sourceWidth, sourceHeight, cropTop, cropBottom, cropLeft, cropRight"; + exit 1 +fi +file=$1 +sourceWidth=$2 +sourceHeight=$3 +cropTop=$4 +cropBottom=$5 +cropLeft=$6 +cropRight=$7 + +if [ ! -f $file ]; + then + echo "file $file does not exist" + exit 1 +fi + +realHeight=`identify -format '%h' $file` +realWidth=`identify -format '%w' $file` + +if [ $realHeight = $sourceHeight ] && [ $realWidth = $sourceWidth ]; + then + newWidth=$(($sourceWidth-$cropLeft-$cropRight)) + newHeight=$(($sourceHeight-$cropTop-$cropBottom)) + convert $file -crop ${newWidth}x${newHeight}+${cropLeft}+${cropTop} +repage $file + echo "converted $file" +fi + + diff --git a/howtos/configuration.md b/howtos/configuration.md new file mode 100644 index 00000000000..144d82c7e37 --- /dev/null +++ b/howtos/configuration.md @@ -0,0 +1,13 @@ +# Configuration + +This documentation is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. + +The framework is [well documented](https://v2.docusaurus.io/docs/) and is used by many (open-source) Projects. + +## `docusaurus.config.js` + +The documentation can be customized by setting parameters in [docusaurus.config.js](../docusaurus.config.js). Parameters are described here: [https://v2.docusaurus.io/docs/docusaurus.config.js](https://v2.docusaurus.io/docs/docusaurus.config.js). + +## Search by Algolia + +- API-Key and Index name is configured in `./docusaurus.config.js`. diff --git a/howtos/configuration.svg b/howtos/configuration.svg new file mode 100644 index 00000000000..43fdb4452b9 --- /dev/null +++ b/howtos/configuration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/documentation-guidelines.md b/howtos/documentation-guidelines.md new file mode 100644 index 00000000000..f893a250288 --- /dev/null +++ b/howtos/documentation-guidelines.md @@ -0,0 +1,19 @@ +# Documentation Guidelines + +## PRs for every change + +All changes have to be done in a separate Branch. As soon as the changes are done please open a PR. A Github Action runs with every commit to a Branch and checks if the documentation can be build (including a broken links check). + +## Structure + +- Name Markdown files according to the title. This makes it easier to find a file. Example: **Introduction to Camunda Cloud** --> `introduction-to-camunda-cloud.md`. Use the file name as internal document id to reference in `sidebars.js`. +- Sub catagories have to be placed in their own sub directories. Example: Guides/Getting Started can be found in `docs/guides/getting-started`. + +## Adding a new documentation page + +1. Select the corresponding directory +2. Add the document id to [`sidebars.js`](./sidebars.js) + +## Rights + +`OWNERS` files in various folders define who needs to approve changes within this folder. Approvers can approve a PR by adding the comment `/lgtm`. diff --git a/howtos/documentation-guidelines.svg b/howtos/documentation-guidelines.svg new file mode 100644 index 00000000000..b24cd4bdd60 --- /dev/null +++ b/howtos/documentation-guidelines.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/markdown-and-mdx-features.md b/howtos/markdown-and-mdx-features.md new file mode 100644 index 00000000000..835e72cce8f --- /dev/null +++ b/howtos/markdown-and-mdx-features.md @@ -0,0 +1,91 @@ +# Markdown and MDX Features + +The Docusaurus documentation provides a detailed explanation of the Markdown features at [https://v2.docusaurus.io/docs/markdown-features](https://v2.docusaurus.io/docs/markdown-features). + +## Images + +- Static images can be placed into [`static/img/`](./static/img/). +- Images that will change with a new version have to be placed into `docs`. Best practice: add an `img` directory to each directory where it is needed. + +## Videos + +- The regular `video` does not work in MDX. +- Use the [react-video](https://www.npmjs.com/package/react-player) component in the following way: + +Import the component into corresponding Markdown file: + +```js +import ReactPlayer from "react-player"; +``` + +Embed a video with the `react-video` component: + +```html + +``` + +## Code Blocks / Selector + +Docusaurus supports [MDX](https://mdxjs.com/) that makes it easily possible to use code selectors for our docs. Two things need to be done: + +Import the needed libraries to the markdown file: + +```js +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +``` + +Define code blocks: + +```html + + + +code + + + +``` + +Hint: `groupId="language"` sets the decision documentation-wide. Can also be used for other use cases like different Tabs for different operating systems. + +Template: + +```html + + + + + + + + + + + + + + + + + + + + + +``` + +## Source Files for Images and Videos + +Source files for images and videos can be put in: + +`./media-src/[subfolder according to do structure]/` diff --git a/howtos/markdown-and-mdx-features.svg b/howtos/markdown-and-mdx-features.svg new file mode 100644 index 00000000000..5600d9aa9f5 --- /dev/null +++ b/howtos/markdown-and-mdx-features.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/publish-documentation.md b/howtos/publish-documentation.md new file mode 100644 index 00000000000..b7a9dfd43b6 --- /dev/null +++ b/howtos/publish-documentation.md @@ -0,0 +1,17 @@ +# Publish Documentation + +## General + +Putting the documentation online happens automatically. The source is always `Master`. + +## Steps + +1. Make sure that all changes are in the `Master` +2. Switch to the Releases view: [https://github.com/camunda-cloud/camunda-cloud-documentation/releases](https://github.com/camunda-cloud/camunda-cloud-documentation/releases) +3. Create a new release using the button _Draft a new release_. +4. Fill out the form: Tag version (semver: 'x.y.z'), Release title, Description +5. Click on _Publish release_ + +Technically [this Github Workflow](./.github/workflows/publish.yaml) will be triggered by the Release to build and deploy the docs. + +You can observe the progress of the Build under [https://github.com/camunda-cloud/camunda-cloud-documentation/actions](https://github.com/camunda-cloud/camunda-cloud-documentation/actions). diff --git a/howtos/publish-documentation.svg b/howtos/publish-documentation.svg new file mode 100644 index 00000000000..bb9b4dd6b37 --- /dev/null +++ b/howtos/publish-documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/release-procedure.md b/howtos/release-procedure.md new file mode 100644 index 00000000000..a271b85a22f --- /dev/null +++ b/howtos/release-procedure.md @@ -0,0 +1,65 @@ +# Release Procedure + +## General + +The complete documentation is fully versioned. This means that there will be no static content that is the same across all versions. The documentation contains a drop down menu to set the version. The default is the latest version. + +## Roles + +PM = Product Manager +DEVEX = Developer Experience +PT = Product Team (Zeebe/Operate/Tasklist/Cloud Console/..) +RM = Release Manager +AUTO = Automated task + +## Perform a Minor Release (MR) + +Here the phases for a new minor release are described (referring to the documentation). + +### MR Phase 1: Preparation + +- RM: Convert Draft PR into PR +- PM and DEVEX: Final review of the release branch (including release notes). +- PM and DEVEX: Approve Release Branch. +- AUTO: Merge Release Branch into Master. + +### MR Phase 2: Publish Release + +- RM: Create new GIT release (with the same version number of the release branch). Use release notes from `RELEASE.md`. +- AUTO: Build master and put it live + +### MR Phase 3: After the release + +- RM: Create new Release Branch. Naming Pattern: `release_${major-version}_${minor-version}`, example: `release_0_26`. +- RM: Create a new version in the documentation: `npm run docusaurus docs:version ${major-version}.${minor-version}`. This freezes the current state of the documentation. New content is added to the newly created version. +- RM: Open Draft PR with the name `Release ${major-version}.${minor-version}`. +- RM: Communicate new Release Branch via Slack. + +## Make changes to old versions (C) + +### C Phase 1: Preparation + +- PT: Create Github Issue with a short description of the changes. +- PT: Create a new branch. Naming Pattern: `${product}_${issue-number}` +- PT: Create Draft-PR (name: `${product} / #${issue-number} / ${title}`), link issue and make changes. +- PT: Once the draft PR is ready for review, convert it to PR. +- PT and DEVEX: Review and approve. +- AUTO: Merge Branch to Master. + +### C Phase 2: Publish Release + +- RM: Create new GIT release. +- AUTO: Build master and put it live. + +### C Phase 3: After the release + +- PT: Merge changes to the current release branch. + +## Changes to the current Release Branch (RB) + +- PT: Create Github Issue with a short description of the changes. +- PT: New branch from the Release Branch. Naming: `release_${major-version}_${minor-version}_${product}_${issue-number}` +- PT: Create Draft-PR (name: `Release ${major-version}.${minor-version} / ${product} / #${issue-number} / ${title}`), link issue and make changes +- PT: Once the draft PR is ready for review, convert to PR. +- PT and DEVEX: Review and approve. +- AUTO: Merge Branch to Release Branch. diff --git a/howtos/release-procedure.svg b/howtos/release-procedure.svg new file mode 100644 index 00000000000..dfd07b77043 --- /dev/null +++ b/howtos/release-procedure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/setup.md b/howtos/setup.md new file mode 100644 index 00000000000..aa6aae8994c --- /dev/null +++ b/howtos/setup.md @@ -0,0 +1,33 @@ +# Setup + +## Installation + +```bash +npm i +``` + +## Local Development + +```bash +npm run start +``` + +This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. + +## Build + +```bash +npm run build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +## Deployment + +This is just for the record. All deployments have to be done via a new Release. + +```bash +$ GIT_USER= USE_SSH=true npm run deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/howtos/setup.svg b/howtos/setup.svg new file mode 100644 index 00000000000..2108853bfa7 --- /dev/null +++ b/howtos/setup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/technical-writing-cheatsheet.md b/howtos/technical-writing-cheatsheet.md new file mode 100644 index 00000000000..8a85e0d2f64 --- /dev/null +++ b/howtos/technical-writing-cheatsheet.md @@ -0,0 +1,41 @@ +# Tech Writing Cheat Sheet + +Proposed Editorial Style Guide: [Google Style Guide](https://developers.google.com/style) + +## Voice + +- Second person, active voice, American spelling & punctuation +- Address the user as “you”. + +## Company & Product Names + +- Camunda +- Camunda Cloud +- Camunda BPM + +## Button names + +- Verb + **Button Name** +- Click **OK**. + +Can use screenshot or icon in instructions. + +## Text box & text to input + +- Name is bold, input is code font. +- In the **Name** box enter `project1`. + +## Images + +- All images should include alt text +- If using a screenshot to show steps to fill out a UI, include text above or below the screenshot that include input text. + +## Filenames + +Code font, lower case + +# Menu bar + +- File and filepath should be bold. +- In the **File** menu, click **Save As**. +- Go to **File > New File > BPMN Diagram**. diff --git a/howtos/technical-writing-cheatsheet.svg b/howtos/technical-writing-cheatsheet.svg new file mode 100644 index 00000000000..00a1c48fc10 --- /dev/null +++ b/howtos/technical-writing-cheatsheet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/howtos/versioning.md b/howtos/versioning.md new file mode 100644 index 00000000000..996a09220be --- /dev/null +++ b/howtos/versioning.md @@ -0,0 +1,72 @@ +# Versioning + +Our documentation is versioned. All sections are versioned together, this includes products that do not have a fixed release cycle (such as Cloud Console). + +## Structure + +### Contents + +The latest version of the documentation can be found in the folder [docs](../docs). All contents in this folder will be visible by default after a release of the documentation. It is therefore the latest version. + +Older versions can be found in the folder [versioned_docs](../versioned_docs). All subfolders represent a separate version. + +### Navigation + +The navigation of the documentation is configured via 'sidebars.js'. Again, a distinction is made between the latest and older versions: + +- Latest: [sidebars.js](../sidebars.js) +- Versioned: each version under [versioned_sidebars](../versioned_sidebars) + +### Adjustments + +The name for the latest version can be set via [docusaurus.config.js](../docusaurus.config.js): + +```json +presets: [ + [ + "@docusaurus/preset-classic", + { + "docs": { + "sidebarPath": require.resolve("./sidebars.js"), + // Please change this to your repo. + "editUrl": + "https://github.com/camunda-cloud/camunda-cloud-documentation/edit/master/", + // disableVersioning: isVersioningDisabled, + "lastVersion": "current", + // onlyIncludeVersions: + // !isVersioningDisabled && (isDev || isDeployPreview) + // ? ["current", ...versions.slice(0, 2)] + // : undefined, + "versions": { + "current": { + "label": `latest`, + }, + }, + }, + "blog": { + "showReadingTime": true, + // Please change this to your repo. + "editUrl": + "https://github.com/camunda-cloud/camunda-cloud-documentation/edit/master/blog/", + }, + "theme": { + "customCss": require.resolve("./src/css/custom.css"), + }, + }, + ], + ], +``` + +## Create new version + +This step usually happens after a release has been created. Technically, the current contents are frozen in `docs` and copied to `versioned_docs` with the corresponding version. The process can be triggered by this Docusraus command: + +``bash +npm run docusaurus docs:version 0.26 + +``` + +## Further information + +The Docusaurus documentation provides a detailed explanation of versioning at [https://v2.docusaurus.io/docs/versioning/](https://v2.docusaurus.io/docs/versioning/). +``` diff --git a/howtos/versioning.svg b/howtos/versioning.svg new file mode 100644 index 00000000000..449097278ce --- /dev/null +++ b/howtos/versioning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a10340ccf74..585c49938fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,118 +5,118 @@ "requires": true, "dependencies": { "@algolia/cache-browser-local-storage": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.5.1.tgz", - "integrity": "sha512-TAQHRHaCUAR0bNhUHG0CnO6FTx3EMPwZQrjPuNS6kHvCQ/H8dVD0sLsHyM8C7U4j33xPQCWi9TBnSx8cYXNmNw==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.3.tgz", + "integrity": "sha512-Cwc03hikHSUI+xvgUdN+H+f6jFyoDsC9fegzXzJ2nPn1YSN9EXzDMBnbrgl0sbl9iLGXe0EIGMYqR2giCv1wMQ==", "requires": { - "@algolia/cache-common": "4.5.1" + "@algolia/cache-common": "4.8.3" } }, "@algolia/cache-common": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.5.1.tgz", - "integrity": "sha512-Sux+pcedQi9sfScIiQdl6pEaTVl712qM9OblvDhnaeF1v6lf4jyTlRTiBLP7YBLuvO1Yo54W3maf03kmz9PVhA==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.8.3.tgz", + "integrity": "sha512-Cf7zZ2i6H+tLSBTkFePHhYvlgc9fnMPKsF9qTmiU38kFIGORy/TN2Fx5n1GBuRLIzaSXvcf+oHv1HvU0u1gE1g==" }, "@algolia/cache-in-memory": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.5.1.tgz", - "integrity": "sha512-fzwAtBFwveuG+E5T/namChEIvdVl0DoV3djV1C078b/JpO5+DeAwuXIJGYbyl950u170n5NEYuIwYG+R6h4lJQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.8.3.tgz", + "integrity": "sha512-+N7tkvmijXiDy2E7u1mM73AGEgGPWFmEmPeJS96oT46I98KXAwVPNYbcAqBE79YlixdXpkYJk41cFcORzNh+Iw==", "requires": { - "@algolia/cache-common": "4.5.1" + "@algolia/cache-common": "4.8.3" } }, "@algolia/client-account": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.5.1.tgz", - "integrity": "sha512-2WFEaI7Zf4ljnBsSAS4e+YylZ5glovm78xFg4E1JKA8PE6M+TeIgUY6HO2ouLh2dqQKxc9UfdAT1Loo/dha2iQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.8.3.tgz", + "integrity": "sha512-Uku8LqnXBwfDCtsTCDYTUOz2/2oqcAQCKgaO0uGdIR8DTQENBXFQvzziambHdn9KuFuY+6Et9k1+cjpTPBDTBg==", "requires": { - "@algolia/client-common": "4.5.1", - "@algolia/client-search": "4.5.1", - "@algolia/transporter": "4.5.1" + "@algolia/client-common": "4.8.3", + "@algolia/client-search": "4.8.3", + "@algolia/transporter": "4.8.3" } }, "@algolia/client-analytics": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.5.1.tgz", - "integrity": "sha512-bTmZUU8zhZMWBeGEQ/TVqLoL3OOT0benU0HtS3iOnQURwb+AOCv3RsgZvkj2djp+M24Q6P8/L34uBJMmCurbLg==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.8.3.tgz", + "integrity": "sha512-9ensIWmjYJprZ+YjAVSZdWUG05xEnbytENXp508X59tf34IMIX8BR2xl0RjAQODtxBdAteGxuKt5THX6U9tQLA==", "requires": { - "@algolia/client-common": "4.5.1", - "@algolia/client-search": "4.5.1", - "@algolia/requester-common": "4.5.1", - "@algolia/transporter": "4.5.1" + "@algolia/client-common": "4.8.3", + "@algolia/client-search": "4.8.3", + "@algolia/requester-common": "4.8.3", + "@algolia/transporter": "4.8.3" } }, "@algolia/client-common": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.5.1.tgz", - "integrity": "sha512-5CpIf8IK1hke7q+N4e+A4TWdFXVJ5Qwyaa0xS84DrDO8HQ7vfYbDvG1oYa9hVEtGn6c3WVKPAvuWynK+fXQQCA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.8.3.tgz", + "integrity": "sha512-TU3623AEFAWUQlDTznkgAMSYo8lfS9pNs5QYDQzkvzWdqK0GBDWthwdRfo9iIsfxiR9qdCMHqwEu+AlZMVhNSA==", "requires": { - "@algolia/requester-common": "4.5.1", - "@algolia/transporter": "4.5.1" + "@algolia/requester-common": "4.8.3", + "@algolia/transporter": "4.8.3" } }, "@algolia/client-recommendation": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.5.1.tgz", - "integrity": "sha512-GiFrNSImoEBUQICjFBEoxPGzrjWji8PY9GeMg2CNvOYcRQ0Xt0Y36v9GN53NLjvB7QdQ2FlE1Cuv/PLUfS/aQQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.8.3.tgz", + "integrity": "sha512-qysGbmkcc6Agt29E38KWJq9JuxjGsyEYoKuX9K+P5HyQh08yR/BlRYrA8mB7vT/OIUHRGFToGO6Vq/rcg0NIOQ==", "requires": { - "@algolia/client-common": "4.5.1", - "@algolia/requester-common": "4.5.1", - "@algolia/transporter": "4.5.1" + "@algolia/client-common": "4.8.3", + "@algolia/requester-common": "4.8.3", + "@algolia/transporter": "4.8.3" } }, "@algolia/client-search": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.5.1.tgz", - "integrity": "sha512-wjuOTte9Auo9Cg4fL0709PjeJ9rXFh4okYUrOt/2SWqQid6DSdZOp+BtyaHKV3E94sj+SlmMxkMUacYluYg5zA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.8.3.tgz", + "integrity": "sha512-rAnvoy3GAhbzOQVniFcKVn1eM2NX77LearzYNCbtFrFYavG+hJI187bNVmajToiuGZ10FfJvK99X2OB1AzzezQ==", "requires": { - "@algolia/client-common": "4.5.1", - "@algolia/requester-common": "4.5.1", - "@algolia/transporter": "4.5.1" + "@algolia/client-common": "4.8.3", + "@algolia/requester-common": "4.8.3", + "@algolia/transporter": "4.8.3" } }, "@algolia/logger-common": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.5.1.tgz", - "integrity": "sha512-ZoVnGriinlLHlkvn5K7djOUn1/1IeTjU8rDzOJ3t06T+2hQytgJghaX7rSwKIeH4CjWMy61w8jLisuGJRBOEeg==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.8.3.tgz", + "integrity": "sha512-03wksHRbhl2DouEKnqWuUb64s1lV6kDAAabMCQ2Du1fb8X/WhDmxHC4UXMzypeOGlH5BZBsgVwSB7vsZLP3MZg==" }, "@algolia/logger-console": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.5.1.tgz", - "integrity": "sha512-1qa7K18+uAgxyWuguayaDS5ViiZFcOjI3J5ACBb0i/n7RsXUo149lP6mwmx6TIU7s135hT0f0TCqnvfMvN1ilA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.8.3.tgz", + "integrity": "sha512-Npt+hI4UF8t3TLMluL5utr9Gc11BjL5kDnGZOhDOAz5jYiSO2nrHMFmnpLT4Cy/u7a5t7EB5dlypuC4/AGStkA==", "requires": { - "@algolia/logger-common": "4.5.1" + "@algolia/logger-common": "4.8.3" } }, "@algolia/requester-browser-xhr": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.5.1.tgz", - "integrity": "sha512-tsQz+9pZw9dwPm/wMvZDpsWFZgmghLjXi4c3O4rfwoP/Ikum5fhle5fiR14yb4Lw4WlOQ1AJIHJvrg1qLIG8hQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.3.tgz", + "integrity": "sha512-/LTTIpgEmEwkyhn8yXxDdBWqXqzlgw5w2PtTpIwkSlP2/jDwdR/9w1TkFzhNbJ81ki6LAEQM5mSwoTTnbIIecg==", "requires": { - "@algolia/requester-common": "4.5.1" + "@algolia/requester-common": "4.8.3" } }, "@algolia/requester-common": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.5.1.tgz", - "integrity": "sha512-bPCiLvhHKXaka7f5FLtheChToz0yHVhvza64naFJRRh/3kC0nvyrvQ0ogjiydiSrGIfdNDyyTVfKGdk4gS5gyA==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.8.3.tgz", + "integrity": "sha512-+Yo9vBkofoKR1SCqqtMnmnfq9yt/BiaDewY/6bYSMNxSYCnu2Fw1JKSIaf/4zos09PMSsxGpLohZwGas3+0GDQ==" }, "@algolia/requester-node-http": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.5.1.tgz", - "integrity": "sha512-BfFc2h9eQOKu1gGs3DtQO7GrVZW/rxUgpJVLja4UVQyGplJyTCrFgkTyfl+8rb3MkNgA/S2LNo7cKNSPfpqeAQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.8.3.tgz", + "integrity": "sha512-k2fiKIeMIFqgC01FnzII6kqC2GQBAfbNaUX4k7QCPa6P8t4sp2xE6fImOUiztLnnL3C9X9ZX6Fw3L+cudi7jvQ==", "requires": { - "@algolia/requester-common": "4.5.1" + "@algolia/requester-common": "4.8.3" } }, "@algolia/transporter": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.5.1.tgz", - "integrity": "sha512-asPDNToDAPhH0tM6qKGTn1l0wTlNUbekpa1ifZ6v+qhSjo3VdqGyp+2VeciJOBW/wVHXh3HUbAcycvLERRlCLg==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.8.3.tgz", + "integrity": "sha512-nU7fy2iU8snxATlsks0MjMyv97QJWQmOVwTjDc+KZ4+nue8CLcgm4LA4dsTBqvxeCQIoEtt3n72GwXcaqiJSjQ==", "requires": { - "@algolia/cache-common": "4.5.1", - "@algolia/logger-common": "4.5.1", - "@algolia/requester-common": "4.5.1" + "@algolia/cache-common": "4.8.3", + "@algolia/logger-common": "4.8.3", + "@algolia/requester-common": "4.8.3" } }, "@babel/code-frame": { @@ -128,35 +128,23 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==" }, "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -175,11 +163,11 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -211,24 +199,23 @@ } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", - "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz", + "integrity": "sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.11.5" + "@babel/helper-module-imports": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", "semver": "^5.5.0" }, "dependencies": { @@ -240,26 +227,24 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -273,11 +258,11 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-function-name": { @@ -307,41 +292,43 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.7" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz", + "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.7" } }, "@babel/helper-plugin-utils": { @@ -349,51 +336,41 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -409,10 +386,15 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/template": "^7.10.4", @@ -421,13 +403,13 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { @@ -453,127 +435,127 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", + "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -586,9 +568,9 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -618,9 +600,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -674,314 +656,342 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", + "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-define-map": "^7.10.4", "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", - "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", + "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.7.tgz", + "integrity": "sha512-YFlTi6MEsclFAPIDNZYiCRbneg1MFGao9pPG9uD5htwE0vDbPaMUMeYd6itWjw7K4kro4UbdQf3ljmFl9y48dQ==", "requires": { "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.12.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", - "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz", + "integrity": "sha512-Rs3ETtMtR3VLXFeYRChle5SsP/P9Jp/6dsewBQfokDSzKJThlsuFcnzLTDRALiUmTC48ej19YD9uN1mupEeEDg==", "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.11.5", + "@babel/helper-builder-react-jsx-experimental": "^7.12.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", + "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", + "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-runtime": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", - "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" @@ -995,99 +1005,98 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typescript": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", + "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" + "@babel/plugin-syntax-typescript": "^7.12.1" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.7.tgz", + "integrity": "sha512-OnNdfAr1FUQg7ksb7bmbKoby4qFOHw6DKWWUNB9KqnnCldxhxJlP+21dpyaWFmf2h0rTbOkXJtAGevY3XW1eew==", "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -1097,45 +1106,42 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", + "@babel/types": "^7.12.7", + "core-js-compat": "^3.7.0", "semver": "^5.5.0" }, "dependencies": { @@ -1159,75 +1165,76 @@ } }, "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.7.tgz", + "integrity": "sha512-wKeTdnGUP5AEYCYQIMeXMMwU7j+2opxrG0WzuZfxuuW9nhKvvALBjl67653CWamZJVefuJGI219G591RSldrqQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.7", + "@babel/plugin-transform-react-jsx-development": "^7.12.7", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" } }, "@babel/preset-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz", - "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz", + "integrity": "sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.10.4" + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-transform-typescript": "^7.12.1" } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", + "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz", + "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", + "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -1256,51 +1263,53 @@ } }, "@docusaurus/core": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.64.tgz", - "integrity": "sha512-lIFAaBz5SvN/vIMrljHwUiT+EGglqmCbKWUXsGwg8FZ86SqkD0T5hPtpaQBIDkerSMzOqntokUEcXB46AQsieQ==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.69.tgz", + "integrity": "sha512-dJGbZ91QH9I5Nrhm0W6ZHe4j8Qv0RBclQkx3WayExxFSHgQUlBM0hBReJxAbTKc1uSJgG7OPpEWnzbZjyK9t/Q==", "requires": { - "@babel/core": "^7.9.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.3", + "@babel/core": "^7.12.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.9.0", - "@babel/preset-env": "^7.9.0", - "@babel/preset-react": "^7.9.4", - "@babel/preset-typescript": "^7.9.0", - "@babel/runtime": "^7.9.2", - "@babel/runtime-corejs3": "^7.10.4", - "@docusaurus/types": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", - "@docusaurus/utils-validation": "2.0.0-alpha.64", + "@babel/plugin-transform-runtime": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@babel/preset-typescript": "^7.12.1", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.5", + "@docusaurus/cssnano-preset": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", + "@docusaurus/utils-validation": "2.0.0-alpha.69", "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", - "@hapi/joi": "^17.1.1", "@svgr/webpack": "^5.4.0", - "babel-loader": "^8.1.0", - "babel-plugin-dynamic-import-node": "^2.3.0", + "babel-loader": "^8.2.1", + "babel-plugin-dynamic-import-node": "2.3.0", "boxen": "^4.2.0", "cache-loader": "^4.1.0", "chalk": "^3.0.0", - "chokidar": "^3.3.0", + "chokidar": "^3.4.3", + "clean-css": "^4.2.3", "commander": "^4.0.1", - "copy-webpack-plugin": "^6.0.3", + "copy-webpack-plugin": "^6.3.0", "core-js": "^2.6.5", "css-loader": "^3.4.2", "del": "^5.1.0", "detect-port": "^1.3.0", - "eta": "^1.1.1", + "eta": "^1.11.0", "express": "^4.17.1", - "file-loader": "^6.0.0", - "fs-extra": "^8.1.0", + "file-loader": "^6.2.0", + "fs-extra": "^9.0.1", "globby": "^10.0.1", - "html-minifier-terser": "^5.0.5", + "html-minifier-terser": "^5.1.1", "html-tags": "^3.1.0", - "html-webpack-plugin": "^4.0.4", - "import-fresh": "^3.2.1", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.2.2", "inquirer": "^7.2.0", "is-root": "^2.1.0", + "joi": "^17.2.1", "leven": "^3.1.0", - "lodash": "^4.5.2", + "lodash": "^4.17.20", "lodash.flatmap": "^4.5.0", "lodash.has": "^4.5.2", "lodash.isplainobject": "^4.0.6", @@ -1308,17 +1317,17 @@ "mini-css-extract-plugin": "^0.8.0", "nprogress": "^0.2.0", "null-loader": "^3.0.0", - "optimize-css-assets-webpack-plugin": "^5.0.3", + "optimize-css-assets-webpack-plugin": "^5.0.4", "pnp-webpack-plugin": "^1.6.4", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "react-dev-utils": "^10.2.1", - "react-helmet": "^6.0.0-beta", + "react-helmet": "^6.1.0", "react-loadable": "^5.5.0", "react-loadable-ssr-addon": "^0.3.0", - "react-router": "^5.1.2", + "react-router": "^5.2.0", "react-router-config": "^5.1.1", - "react-router-dom": "^5.1.2", + "react-router-dom": "^5.2.0", "resolve-pathname": "^3.0.0", "semver": "^6.3.0", "serve-handler": "^6.1.3", @@ -1326,8 +1335,8 @@ "std-env": "^2.2.1", "terser-webpack-plugin": "^4.1.0", "update-notifier": "^4.1.0", - "url-loader": "^4.1.0", - "wait-file": "^1.0.5", + "url-loader": "^4.1.1", + "wait-on": "^5.2.0", "webpack": "^4.44.1", "webpack-bundle-analyzer": "^3.6.1", "webpack-dev-server": "^3.11.0", @@ -1335,67 +1344,59 @@ "webpackbar": "^4.0.0" } }, + "@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.69.tgz", + "integrity": "sha512-Gv75LL4e2XnApNMPQ1mYVotH+0RKsg3WewPh7zSfEJvyzD6F+SHxIcu+tNSwkRMexlCLy6BHgOyEwvhom+VoaA==", + "requires": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-combine-duplicated-selectors": "^9.1.0", + "postcss-sort-media-queries": "^1.7.26" + } + }, "@docusaurus/mdx-loader": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.64.tgz", - "integrity": "sha512-kEBhKq/pQAdks9uri9IALAYuz60sid2f0mXTM/7NZyYTgDeVmeUBlLAMNGQTsMj4KfK3mHyS/ehF04MDnyiv9g==", - "requires": { - "@babel/parser": "^7.9.4", - "@babel/traverse": "^7.9.0", - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", - "@mdx-js/mdx": "^1.5.8", - "@mdx-js/react": "^1.5.8", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.69.tgz", + "integrity": "sha512-yieXX7RhzLasN1bBj/tMj43l+DRu3VEyFRC63khYwfAZyhKtlMEL9eEaKMN3eqvnZD2u6G+nxXafwpqLdqNAWg==", + "requires": { + "@babel/parser": "^7.12.5", + "@babel/traverse": "^7.12.5", + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", "escape-html": "^1.0.3", - "file-loader": "^6.0.0", - "fs-extra": "^8.1.0", + "file-loader": "^6.2.0", + "fs-extra": "^9.0.1", "github-slugger": "^1.3.0", "gray-matter": "^4.0.2", - "loader-utils": "^1.2.3", + "loader-utils": "^2.0.0", "mdast-util-to-string": "^1.1.0", "remark-emoji": "^2.1.0", "stringify-object": "^3.3.0", "unist-util-visit": "^2.0.2", - "url-loader": "^4.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "url-loader": "^4.1.1", + "webpack": "^4.44.1" } }, "@docusaurus/plugin-content-blog": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.64.tgz", - "integrity": "sha512-BfQFgosFXxGdmsY9jzzXYA4JvPoqCd3QQtRx8RP/BFwiUgRZK9l0hD8yEBJb0f4m2KU0ZNsMT4VbAoimzCpGEA==", - "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/mdx-loader": "2.0.0-alpha.64", - "@docusaurus/types": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", - "@docusaurus/utils-validation": "2.0.0-alpha.64", - "@hapi/joi": "^17.1.1", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.69.tgz", + "integrity": "sha512-zN3c8ZiYpOid5f6YbxGZhVN8E5a4HmkyVJWTXts5tE0pdeiTuk0cfB5Iko4rnIDTztz7pJJCToIzKu07DcImww==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/mdx-loader": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", + "@docusaurus/utils-validation": "2.0.0-alpha.69", "chalk": "^3.0.0", - "feed": "^4.1.0", - "fs-extra": "^8.1.0", + "feed": "^4.2.1", + "fs-extra": "^9.0.1", "globby": "^10.0.1", + "joi": "^17.2.1", "loader-utils": "^1.2.3", - "lodash.kebabcase": "^4.1.1", + "lodash": "^4.17.20", "reading-time": "^1.2.0", "remark-admonitions": "^1.2.1", "webpack": "^4.44.1" @@ -1422,21 +1423,21 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.64.tgz", - "integrity": "sha512-3O2tHZd0OKLuGPfMTo3R5iMX/tM+QxB81uN0YBgyhwV7kKL46LpE+AYKYqk+oSCH0MfMBREcLgEyni4KgJNbHg==", - "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/mdx-loader": "2.0.0-alpha.64", - "@docusaurus/types": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", - "@docusaurus/utils-validation": "2.0.0-alpha.64", - "@hapi/joi": "17.1.1", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.69.tgz", + "integrity": "sha512-u+2juUJWFd/v/x8NU4UzQf6k5tc21oZj6s/IFQDTse/5QeHkMrkw0aqUeHbGWet4foBRnx+021vmrPPqxeV/dQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/mdx-loader": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", + "@docusaurus/utils-validation": "2.0.0-alpha.69", "chalk": "^3.0.0", "execa": "^3.4.0", - "fs-extra": "^8.1.0", + "fs-extra": "^9.0.1", "globby": "^10.0.1", - "import-fresh": "^3.2.1", + "import-fresh": "^3.2.2", + "joi": "^17.2.1", "loader-utils": "^1.2.3", "lodash": "^4.17.19", "lodash.flatmap": "^4.5.0", @@ -1514,17 +1515,17 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.64.tgz", - "integrity": "sha512-dPtFSELCRgZeB3bhEkTurY4yRKdpV0xjLhBejsdhCmwtsjQ4jf9ouzNuD55zSKUdAt7t4Magj8OqI51Z2AlFkQ==", - "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/mdx-loader": "2.0.0-alpha.64", - "@docusaurus/types": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", - "@docusaurus/utils-validation": "2.0.0-alpha.64", - "@hapi/joi": "17.1.1", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.69.tgz", + "integrity": "sha512-RmEuhKFGagLyH42ggTweWHjaf82qbD9Xp7rXx10iHAUW2bJsMyGioag6gAw0Q+DeMMeHtMJdPsU99cuYqUdTpw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/mdx-loader": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", + "@docusaurus/utils-validation": "2.0.0-alpha.69", "globby": "^10.0.1", + "joi": "^17.2.1", "loader-utils": "^1.2.3", "minimatch": "^3.0.4", "remark-admonitions": "^1.2.1", @@ -1553,109 +1554,121 @@ } }, "@docusaurus/plugin-debug": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.64.tgz", - "integrity": "sha512-3RKtMyQQN1NQaZoCxMnTbbGw7ldG/IT49fDi8jz8UJy8U/lN+cxAI2Js8EqI4EzkZs+pjazqdXDrW8BM33tiBA==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.69.tgz", + "integrity": "sha512-wvLBvntbuh25RCkKEeuwLl2h9OzMXZLIQWNa6FvAtmc8Xaomn3JkYnWn/fAKiBiOExN1ZEf9XomKVLNIUJ9xOg==", "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/types": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", "react-json-view": "^1.19.1" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.64.tgz", - "integrity": "sha512-WiyF+OQYo/PqM376BObA5Js9eDAlYD4rMf3D7B59WKpCg+f532EABFFuurgkHAE7O73j6bbCpQ5HuunOgxvpDw==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.69.tgz", + "integrity": "sha512-CrGy8DeJqMZdNmbLNyfgLtjMcapOoqY8jbJiKYCELI8SZ8Ns28i8Yh5W9qe4KxGqSQXvVWHg36xJVG/xAF/6jA==", "requires": { - "@docusaurus/core": "2.0.0-alpha.64" + "@docusaurus/core": "2.0.0-alpha.69" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.64.tgz", - "integrity": "sha512-5wz4ciVBXKHyz5kkyDaDLAoSSMabuNBW413hDjh0CD4JdhJzyADW6FKypTx1dd3wELsEOUFWE+ltkKI/AA1cog==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.69.tgz", + "integrity": "sha512-mDAKBRkB3UJMuAUPqC43mNr8PPu3QuUbCLisJIvg7VMp9XoAcOImNZWmY2Smd+Law2tJkW3cBFPvm3fcVvJ1vA==", "requires": { - "@docusaurus/core": "2.0.0-alpha.64" + "@docusaurus/core": "2.0.0-alpha.69" } }, "@docusaurus/plugin-sitemap": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.64.tgz", - "integrity": "sha512-7IoR9/CpfA0IOMbORIz7esQUTETB6w6iRkmdGNnnvpi9onvm7vQe9LpLCDOHEFuip1GNZO9XSlyYmG9J7xqjLg==", - "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/types": "2.0.0-alpha.64", - "@hapi/joi": "17.1.1", - "fs-extra": "^8.1.0", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.69.tgz", + "integrity": "sha512-DqrXm1PiWWNN5wbY1iVg0sdkCL3KZEj7uyjmZfXIfMQaEF2ErqJDY07QAwANrl27huPQmmc9tYwW3FqgKbVlbA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "fs-extra": "^9.0.1", + "joi": "^17.2.1", "sitemap": "^3.2.2" } }, "@docusaurus/preset-classic": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.64.tgz", - "integrity": "sha512-j2L7WzLXRLQyDub/hALNZGfL/mNMuMpG+GhWgfHWi/Fb8BRppGMikVp9VqrnlJ8D8OWhkkVcruUkjFO0ODfXmQ==", - "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/plugin-content-blog": "2.0.0-alpha.64", - "@docusaurus/plugin-content-docs": "2.0.0-alpha.64", - "@docusaurus/plugin-content-pages": "2.0.0-alpha.64", - "@docusaurus/plugin-debug": "2.0.0-alpha.64", - "@docusaurus/plugin-google-analytics": "2.0.0-alpha.64", - "@docusaurus/plugin-google-gtag": "2.0.0-alpha.64", - "@docusaurus/plugin-sitemap": "2.0.0-alpha.64", - "@docusaurus/theme-classic": "2.0.0-alpha.64", - "@docusaurus/theme-search-algolia": "2.0.0-alpha.64" + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.69.tgz", + "integrity": "sha512-4RiLXB+1vYzgTxGRnZqrYU/7gSsqUWYbofy7Ce5i4NF+L65B0mnBGaBhU0j1ZQJUMuozByRbf54wExZB25Re0A==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.69", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.69", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.69", + "@docusaurus/plugin-debug": "2.0.0-alpha.69", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.69", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.69", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.69", + "@docusaurus/theme-classic": "2.0.0-alpha.69", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.69" } }, "@docusaurus/theme-classic": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.64.tgz", - "integrity": "sha512-w1wUCV9hQU45ZfbWrOknsRxUF+VMZpyALQHbEYCFJdOFxVUMwukDHchDd4rt8Ur0TJy3MIFMVTNoasuJwQCM4w==", - "requires": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/plugin-content-blog": "2.0.0-alpha.64", - "@docusaurus/plugin-content-docs": "2.0.0-alpha.64", - "@docusaurus/plugin-content-pages": "2.0.0-alpha.64", - "@docusaurus/types": "2.0.0-alpha.64", - "@docusaurus/utils-validation": "2.0.0-alpha.64", - "@hapi/joi": "^17.1.1", - "@mdx-js/mdx": "^1.5.8", - "@mdx-js/react": "^1.5.8", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.69.tgz", + "integrity": "sha512-BterTyQvGrHS4oC/USXDG6GHt90oWUFyDg7oQ8WAa2zfkZTgcM3LiZeUYbn8vwy/HVU7hOWCixPTtY3R9iNZ9Q==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.69", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.69", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.69", + "@docusaurus/theme-common": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69", + "@docusaurus/utils-validation": "2.0.0-alpha.69", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", "@types/react-toggle": "^4.0.2", "clsx": "^1.1.1", "copy-text-to-clipboard": "^2.2.0", - "infima": "0.2.0-alpha.12", + "infima": "0.2.0-alpha.18", + "joi": "^17.2.1", "lodash": "^4.17.19", - "parse-numeric-range": "^0.0.2", - "prism-react-renderer": "^1.1.0", - "prismjs": "^1.20.0", + "parse-numeric-range": "^1.2.0", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.22.0", "prop-types": "^15.7.2", - "react-router-dom": "^5.1.2", - "react-toggle": "^4.1.1", - "use-onclickoutside": "^0.3.1" + "react-router-dom": "^5.2.0", + "react-toggle": "^4.1.1" + } + }, + "@docusaurus/theme-common": { + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.69.tgz", + "integrity": "sha512-6Pq+gmmYOey86z0HaOOyIWMg+ftcl8KR0bamNQD3wkBtiEy7ymcHMlck887W+fFxttWLPo4+/HzfYFUqSoCHkQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.69", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.69", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.69", + "@docusaurus/types": "2.0.0-alpha.69" } }, "@docusaurus/theme-search-algolia": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.64.tgz", - "integrity": "sha512-cxFOzxOoXC+UrfaZ65PqrvfEu8supZevcBzVhI8cD+TJGZmtHzys0XveSAYJORPqEm6abh+BdSDQY7Wn4nhqYA==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.69.tgz", + "integrity": "sha512-hPg54EwZudgqjs7D6QbWMbG3XmI10XtcqED9VMg6R3LPBG3317UhtuEGa1jJrF6hDN/HHbzWZOQ00LLBHpf9+Q==", "requires": { "@docsearch/react": "^1.0.0-alpha.27", - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/utils": "2.0.0-alpha.64", - "@hapi/joi": "^17.1.1", + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/utils": "2.0.0-alpha.69", "algoliasearch": "^4.0.0", "algoliasearch-helper": "^3.1.1", "clsx": "^1.1.1", - "eta": "^1.1.1", + "eta": "^1.11.0", + "joi": "^17.2.1", "lodash": "^4.17.19" } }, "@docusaurus/types": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.64.tgz", - "integrity": "sha512-YBTRXHbZDWxGQ14ES62s5UnMA3MM9BuLS5EDseOPd8/GwMz6pws+N9QeLCUCEQQTbdTb2MZsQjdSGaHOMjbiEA==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.69.tgz", + "integrity": "sha512-8TgHmUMH5q+5D93nyugk/dtUeGPblRE++gxxrwjNYnJucRUNDKRC8kJhEozODGcSfXddTeMalPvbRKSz9Pxj2g==", "requires": { "@types/webpack": "^4.41.0", "commander": "^4.0.1", @@ -1664,12 +1677,14 @@ } }, "@docusaurus/utils": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.64.tgz", - "integrity": "sha512-rvRNTSNL0BQnO15/dZRO3MsZwcnglvm1aBl/9qbPVBVS82/VdoUB8YZ5QGrCQewXugQBkYqZU2cx+khDhNICvw==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.69.tgz", + "integrity": "sha512-RpxqcjPT0L+MxLyS/4QOHp/2hlKPcPoDyvfqtTJiS9DPtUzkH573a5/yMbfzz8IbPeYWRCPL2qxWtmN7XCZ/sQ==", "requires": { + "@docusaurus/types": "2.0.0-alpha.69", + "chalk": "^3.0.0", "escape-string-regexp": "^2.0.0", - "fs-extra": "^8.1.0", + "fs-extra": "^9.0.1", "gray-matter": "^4.0.2", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", @@ -1684,13 +1699,13 @@ } }, "@docusaurus/utils-validation": { - "version": "2.0.0-alpha.64", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.64.tgz", - "integrity": "sha512-WO1v10/Dga5pR3e5XGwuv8Wb+vjp4d8MZ4h0x+6MBOMX9HXgoUN2pmdXq0HcolNV2RMNdXAgkT8NZhCV5Wea1A==", + "version": "2.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.69.tgz", + "integrity": "sha512-kjSZS8WOCVlqCLHOhbIDqztmSAPkBva51oT/oohs4WaNdvT6e0PdLycUA2Dg3pXLw1FXsiMxluCYyC8BGX0B+Q==", "requires": { - "@docusaurus/utils": "2.0.0-alpha.64", - "@hapi/joi": "17.1.1", - "chalk": "^3.0.0" + "@docusaurus/utils": "2.0.0-alpha.69", + "chalk": "^3.0.0", + "joi": "^17.2.1" } }, "@endiliey/static-site-generator-webpack-plugin": { @@ -1715,46 +1730,11 @@ "resolved": "https://registry.npmjs.org/@francoischalifour/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.0.0-alpha.28.tgz", "integrity": "sha512-bprfNmYt1opFUFEtD2XfY/kEsm13bzHQgU80uMjhuK0DJ914IjolT1GytpkdM6tJ4MBvyiJPP+bTtWO+BZ7c7w==" }, - "@hapi/address": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz", - "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/formula": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", - "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==" - }, "@hapi/hoek": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" }, - "@hapi/joi": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", - "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", - "requires": { - "@hapi/address": "^4.0.1", - "@hapi/formula": "^2.0.0", - "@hapi/hoek": "^9.0.0", - "@hapi/pinpoint": "^2.0.0", - "@hapi/topo": "^5.0.0" - } - }, - "@hapi/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==" - }, "@hapi/topo": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", @@ -1764,23 +1744,23 @@ } }, "@mdx-js/mdx": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.18.tgz", - "integrity": "sha512-RXtdFBP3cnf/RILx/ipp5TsSY1k75bYYmjorv7jTaPcHPQwhQdI6K4TrVUed/GL4f8zX5TN2QwO5g+3E/8RsXA==", + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", "requires": { - "@babel/core": "7.11.6", - "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.18", - "babel-plugin-apply-mdx-type-prop": "1.6.18", - "babel-plugin-extract-import-names": "1.6.18", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", "camelcase-css": "2.0.1", - "detab": "2.0.3", + "detab": "2.0.4", "hast-util-raw": "6.0.1", "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "9.1.1", + "mdast-util-to-hast": "10.0.1", "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.18", + "remark-mdx": "1.6.22", "remark-parse": "8.0.3", "remark-squeeze-paragraphs": "4.0.0", "style-to-object": "0.3.0", @@ -1790,14 +1770,14 @@ } }, "@mdx-js/react": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.18.tgz", - "integrity": "sha512-aFHsZVu7r9WamlP+WO/lyvHHZAubkQjkcRYlvS7fQElypfJvjKdHevjC3xiqlsQpasx/4KqRMoEIb++wNtd+6w==" + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==" }, "@mdx-js/util": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.18.tgz", - "integrity": "sha512-axMe+NoLF55OlXPbhRn4GNCHcL1f5W3V3c0dWzg05S9JXm3Ecpxzxaht3g3vTP0dcqBL/yh/xCvzK0ZpO54Eug==" + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -1846,6 +1826,24 @@ } } }, + "@sideway/address": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.0.tgz", + "integrity": "sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1887,14 +1885,14 @@ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" }, "@svgr/babel-plugin-transform-svg-component": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.4.0.tgz", - "integrity": "sha512-zLl4Fl3NvKxxjWNkqEcpdSOpQ3LGVH2BNFQ6vjaK6sFo2IrSznrhURIPI0HAphKiiIwNYjAfE0TNoQDSZv0U9A==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" }, "@svgr/babel-preset": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.4.0.tgz", - "integrity": "sha512-Gyx7cCxua04DBtyILTYdQxeO/pwfTBev6+eXTbVbxe4HTGhOUW6yo7PSbG2p6eJMl44j6XSequ0ZDP7bl0nu9A==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -1903,60 +1901,60 @@ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.4.0" + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" } }, "@svgr/core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.4.0.tgz", - "integrity": "sha512-hWGm1DCCvd4IEn7VgDUHYiC597lUYhFau2lwJBYpQWDirYLkX4OsXu9IslPgJ9UpP7wsw3n2Ffv9sW7SXJVfqQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "requires": { - "@svgr/plugin-jsx": "^5.4.0", - "camelcase": "^6.0.0", - "cosmiconfig": "^6.0.0" + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" } }, "@svgr/hast-util-to-babel-ast": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.4.0.tgz", - "integrity": "sha512-+U0TZZpPsP2V1WvVhqAOSTk+N+CjYHdZx+x9UBa1eeeZDXwH8pt0CrQf2+SvRl/h2CAPRFkm+Ey96+jKP8Bsgg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", "requires": { - "@babel/types": "^7.9.5" + "@babel/types": "^7.12.6" } }, "@svgr/plugin-jsx": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.4.0.tgz", - "integrity": "sha512-SGzO4JZQ2HvGRKDzRga9YFSqOqaNrgLlQVaGvpZ2Iht2gwRp/tq+18Pvv9kS9ZqOMYgyix2LLxZMY1LOe9NPqw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", "requires": { - "@babel/core": "^7.7.5", - "@svgr/babel-preset": "^5.4.0", - "@svgr/hast-util-to-babel-ast": "^5.4.0", + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", "svg-parser": "^2.0.2" } }, "@svgr/plugin-svgo": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.4.0.tgz", - "integrity": "sha512-3Cgv3aYi1l6SHyzArV9C36yo4kgwVdF3zPQUC6/aCDUeXAofDYwE5kk3e3oT5ZO2a0N3lB+lLGvipBG6lnG8EA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", "requires": { - "cosmiconfig": "^6.0.0", - "merge-deep": "^3.0.2", + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", "svgo": "^1.2.2" } }, "@svgr/webpack": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.4.0.tgz", - "integrity": "sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg==", - "requires": { - "@babel/core": "^7.9.0", - "@babel/plugin-transform-react-constant-elements": "^7.9.0", - "@babel/preset-env": "^7.9.5", - "@babel/preset-react": "^7.9.4", - "@svgr/core": "^5.4.0", - "@svgr/plugin-jsx": "^5.4.0", - "@svgr/plugin-svgo": "^5.4.0", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", "loader-utils": "^2.0.0" } }, @@ -1973,11 +1971,6 @@ "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -1996,9 +1989,9 @@ } }, "@types/html-minifier-terser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", - "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" }, "@types/json-schema": { "version": "7.0.6", @@ -2019,9 +2012,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "14.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.1.tgz", - "integrity": "sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw==" + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -2044,9 +2037,9 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@types/react": { - "version": "16.9.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", - "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.0.tgz", + "integrity": "sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -2071,9 +2064,9 @@ "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==" }, "@types/uglify-js": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz", - "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", + "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", "requires": { "source-map": "^0.6.1" }, @@ -2091,9 +2084,9 @@ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, "@types/webpack": { - "version": "4.41.22", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", - "integrity": "sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ==", + "version": "4.41.25", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", + "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", "requires": { "@types/anymatch": "*", "@types/node": "*", @@ -2111,9 +2104,9 @@ } }, "@types/webpack-sources": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz", - "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", "requires": { "@types/node": "*", "@types/source-list-map": "*", @@ -2304,9 +2297,9 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "acorn-walk": { "version": "7.2.0", @@ -2328,9 +2321,9 @@ } }, "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2349,30 +2342,30 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "algoliasearch": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.5.1.tgz", - "integrity": "sha512-b6yT1vWMlBdVObQipKxvt0M6SEvGetVj+FFFlo0Fy06gkdj6WCJaS4t10Q/hC3I2VG9QmpCqlK3Esgg1y1E+uw==", - "requires": { - "@algolia/cache-browser-local-storage": "4.5.1", - "@algolia/cache-common": "4.5.1", - "@algolia/cache-in-memory": "4.5.1", - "@algolia/client-account": "4.5.1", - "@algolia/client-analytics": "4.5.1", - "@algolia/client-common": "4.5.1", - "@algolia/client-recommendation": "4.5.1", - "@algolia/client-search": "4.5.1", - "@algolia/logger-common": "4.5.1", - "@algolia/logger-console": "4.5.1", - "@algolia/requester-browser-xhr": "4.5.1", - "@algolia/requester-common": "4.5.1", - "@algolia/requester-node-http": "4.5.1", - "@algolia/transporter": "4.5.1" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.8.3.tgz", + "integrity": "sha512-pljX9jEE2TQ3i1JayhG8afNdE8UuJg3O9c7unW6QO67yRWCKr6b0t5aKC3hSVtjt7pA2TQXLKoAISb4SHx9ozQ==", + "requires": { + "@algolia/cache-browser-local-storage": "4.8.3", + "@algolia/cache-common": "4.8.3", + "@algolia/cache-in-memory": "4.8.3", + "@algolia/client-account": "4.8.3", + "@algolia/client-analytics": "4.8.3", + "@algolia/client-common": "4.8.3", + "@algolia/client-recommendation": "4.8.3", + "@algolia/client-search": "4.8.3", + "@algolia/logger-common": "4.8.3", + "@algolia/logger-console": "4.8.3", + "@algolia/requester-browser-xhr": "4.8.3", + "@algolia/requester-common": "4.8.3", + "@algolia/requester-node-http": "4.8.3", + "@algolia/transporter": "4.8.3" } }, "algoliasearch-helper": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.2.2.tgz", - "integrity": "sha512-/3XvE33R+gQKaiPdy3nmHYqhF8hqIu8xnlOicVxb1fD6uMFmxW8rGLzzrRfsPfxgAfm+c1NslLb3TzQVIB8aVA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.3.3.tgz", + "integrity": "sha512-1MKryf/yLQK9qgCaHtM+OBmG+R3qD6wxN8NnZstlCB8LijCZjoX1mgdema3+cBaa/zfmsD2q6/aP9kUKQmH4DQ==", "requires": { "events": "^1.1.1" }, @@ -2461,11 +2454,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "are-passive-events-supported": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/are-passive-events-supported/-/are-passive-events-supported-1.1.1.tgz", - "integrity": "sha512-5wnvlvB/dTbfrCvJ027Y4L4gW/6Mwoy1uFSavney0YO++GU+0e/flnjiBBwH+1kh7xNCgCOGvmJC3s32joYbww==" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2584,6 +2572,11 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -2603,6 +2596,14 @@ "postcss-value-parser": "^4.1.0" } }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -2656,14 +2657,13 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { @@ -2688,26 +2688,26 @@ } }, "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.18.tgz", - "integrity": "sha512-lcpbj/GatKQp48jsJ8Os/ZXv381ZYFNKA27EPllcpFMpqiS696XkoK+xie/2GjzQSe5IIbo3srsXpd6/ik8PsQ==", + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.18" + "@mdx-js/util": "1.6.22" } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-extract-import-names": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.18.tgz", - "integrity": "sha512-2EyZia3Ezl3UdhBcgDl6KZTNkYa2VhmAHHbJdhCroa1pZD/E56BulVsSKIhm/kza9agnabDR2VEHO+ZnqpfxbQ==", + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4" } @@ -2778,9 +2778,9 @@ "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -2808,6 +2808,15 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -2954,19 +2963,12 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } } }, "browserify-sign": { @@ -3001,14 +3003,15 @@ } }, "browserslist": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.3.tgz", - "integrity": "sha512-GcZPC5+YqyPO4SFnz48/B0YaCwS47Q9iPChRGi6t7HhflKBcINzFrJvRfC+jp30sRMKxF+d4EHGs27Z0XP1NaQ==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.15.0.tgz", + "integrity": "sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ==", "requires": { - "caniuse-lite": "^1.0.30001131", - "electron-to-chromium": "^1.3.570", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001164", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.612", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" } }, "buffer": { @@ -3111,25 +3114,6 @@ "schema-utils": "^2.0.0" }, "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -3147,43 +3131,6 @@ "emojis-list": "^3.0.0", "json5": "^1.0.1" } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } } } }, @@ -3221,6 +3168,15 @@ } } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -3255,18 +3211,18 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, "camelcase-css": { "version": "2.0.1", @@ -3285,14 +3241,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001131", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", - "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==" + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==" }, "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" }, "chalk": { "version": "3.0.0", @@ -3304,11 +3260,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -3386,12 +3341,53 @@ "lodash.reduce": "^4.4.0", "lodash.reject": "^4.4.0", "lodash.some": "^4.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -3400,7 +3396,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "chownr": { @@ -3414,6 +3410,13 @@ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "requires": { "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "ci-info": { @@ -3518,33 +3521,11 @@ "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "is-buffer": "^1.1.5" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -3599,12 +3580,12 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -3621,9 +3602,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3747,16 +3728,6 @@ "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - } } }, "connect-history-api-fallback": { @@ -3844,9 +3815,9 @@ "integrity": "sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==" }, "copy-webpack-plugin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.1.0.tgz", - "integrity": "sha512-aWjIuLt1OVQxaDVffnt3bnGmLA8zGgAJaFwPA+a+QYVPh1vhIKjVfh3SbOFLV0kRPvGBITbw17n5CsmiBS4LQQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.0.tgz", + "integrity": "sha512-p4eIA0ZWk4UI+xewyxOBTDCSDfjK6nCkr3zhDenoi7SFd+NgDNH/D14IZeFaCEFcK/psNDcAUMOB+sAxZ3SsAA==", "requires": { "cacache": "^15.0.5", "fast-glob": "^3.2.4", @@ -3856,30 +3827,11 @@ "loader-utils": "^2.0.0", "normalize-path": "^3.0.0", "p-limit": "^3.0.2", - "schema-utils": "^2.7.1", - "serialize-javascript": "^4.0.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", "webpack-sources": "^1.4.3" }, "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "globby": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", @@ -3893,74 +3845,37 @@ "slash": "^3.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - } + "yocto-queue": "^0.1.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "requires": { - "find-up": "^4.0.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", + "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.15.0", "semver": "7.0.0" }, "dependencies": { @@ -3972,9 +3887,9 @@ } }, "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.1.tgz", + "integrity": "sha512-Se+LaxqXlVXGvmexKGPvnUIYC1jwXu1H6Pkyb3uBM5d8/NELMYCHs/4/roD7721NxrTLyv7e5nXd5/QLBO+10g==" }, "core-util-is": { "version": "1.0.2", @@ -3982,15 +3897,15 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "create-ecdh": { @@ -4169,14 +4084,14 @@ } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "css-select-base-adapter": { @@ -4201,9 +4116,9 @@ } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "cssdb": { "version": "4.4.0", @@ -4262,6 +4177,19 @@ } } }, + "cssnano-preset-advanced": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz", + "integrity": "sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw==", + "requires": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.7", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + } + }, "cssnano-preset-default": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", @@ -4323,26 +4251,26 @@ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "source-map": { "version": "0.6.1", @@ -4352,9 +4280,9 @@ } }, "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" }, "cyclist": { "version": "1.0.1", @@ -4362,11 +4290,11 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -4520,9 +4448,9 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz", - "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", "requires": { "repeat-string": "^1.5.4" } @@ -4612,12 +4540,19 @@ } }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" + } } }, "domain-browser": { @@ -4639,21 +4574,21 @@ } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0", "domelementtype": "1" } }, "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "dot-prop": { @@ -4720,9 +4655,9 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" }, "electron-to-chromium": { - "version": "1.3.570", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz", - "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==" + "version": "1.3.617", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.617.tgz", + "integrity": "sha512-yHXyI0fHnU0oLxdu21otLYpW3qwkbo8EBTpqeS9w14fwNjFy65SG6unrS3Gg+wX1JKWlAFCcNt13fG0nsCo/1A==" }, "elliptic": { "version": "6.5.3", @@ -4835,9 +4770,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, "errno": { "version": "0.1.7", @@ -4853,23 +4788,30 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + } } }, "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", + "is-callable": "^1.2.2", "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -4885,9 +4827,9 @@ } }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "2.1.1", @@ -4944,9 +4886,9 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eta": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.10.0.tgz", - "integrity": "sha512-ZgGKZjScl7pqNlA/eFzK1/HObHBUHtwfPK7hlExaZI23cEkZtkmFd42qNcKUZ0ehsijRGnybQadqbHcJo4VGnA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.1.tgz", + "integrity": "sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA==" }, "etag": { "version": "1.8.1", @@ -5242,9 +5184,9 @@ } }, "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", "requires": { "reusify": "^1.0.4" } @@ -5308,14 +5250,32 @@ } }, "file-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.0.tgz", - "integrity": "sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "requires": { "loader-utils": "^2.0.0", - "schema-utils": "^2.7.1" + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "filesize": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", @@ -5359,21 +5319,22 @@ } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flatten": { @@ -5424,23 +5385,33 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, "fork-ts-checker-webpack-plugin": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", @@ -5639,13 +5610,14 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs-minipass": { @@ -5708,15 +5680,25 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -5882,6 +5864,13 @@ "requires": { "duplexer": "^0.1.1", "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } } }, "handle-thing": { @@ -6001,9 +5990,9 @@ } }, "hast-to-hyperscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", - "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", "requires": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", @@ -6015,22 +6004,22 @@ } }, "hast-util-from-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", - "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", "requires": { "@types/parse5": "^5.0.0", - "ccount": "^1.0.0", - "hastscript": "^5.0.0", + "hastscript": "^6.0.0", "property-information": "^5.0.0", "vfile": "^4.0.0", + "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" } }, "hast-util-parse-selector": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", - "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==" + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" }, "hast-util-raw": { "version": "6.0.1", @@ -6062,10 +6051,11 @@ } }, "hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", "requires": { + "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", @@ -6198,9 +6188,9 @@ "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" }, "html-webpack-plugin": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.4.1.tgz", - "integrity": "sha512-nEtdEIsIGXdXGG7MjTTZlmhqhpHU9pJFc1OYxcP36c5/ZKP6b0BJMww2QTvJGQYA9aMxUnjDujpZdYcVOXiBCQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", "requires": { "@types/html-minifier-terser": "^5.0.0", "@types/tapable": "^1.0.5", @@ -6253,6 +6243,13 @@ "entities": "^1.1.1", "inherits": "^2.0.1", "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } } }, "http-cache-semantics": { @@ -6448,9 +6445,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "iferr": { "version": "0.1.5", @@ -6476,9 +6473,9 @@ } }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6511,6 +6508,46 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } } }, "imurmurhash": { @@ -6534,9 +6571,9 @@ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "infima": { - "version": "0.2.0-alpha.12", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.12.tgz", - "integrity": "sha512-in5n36oE2sdiB/1rzuzdmKyuNRMVUO9P+qUidUG8leHeDU+WMQ7oTP7MXSqtAAxduiPb7HHi0/ptQLLUr/ge4w==" + "version": "0.2.0-alpha.18", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.18.tgz", + "integrity": "sha512-ndSEffXzjgM/eiSm5jpLTX6ON9MmylzxqBnV2bTiC3kCSyDYdvzTs+bSwf+C4TWayuqnRTnBK1JUePo3m6Bnfg==" }, "inflight": { "version": "1.0.6", @@ -6588,11 +6625,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -6655,14 +6691,6 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -6716,14 +6744,17 @@ } }, "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } }, "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "is-binary-path": { "version": "2.1.0", @@ -6739,9 +6770,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" }, "is-ci": { "version": "2.0.0", @@ -6771,6 +6802,14 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -6864,9 +6903,9 @@ } }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-npm": { "version": "4.0.0", @@ -7026,9 +7065,9 @@ } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7050,15 +7089,27 @@ } } }, + "joi": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.3.0.tgz", + "integrity": "sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -7103,11 +7154,19 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } } }, "keyv": { @@ -7145,24 +7204,11 @@ "package-json": "^6.3.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -7189,12 +7235,11 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -7365,9 +7410,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", - "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" }, "loose-envify": { "version": "1.4.0", @@ -7378,11 +7423,11 @@ } }, "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { - "tslib": "^1.10.0" + "tslib": "^2.0.3" } }, "lowercase-keys": { @@ -7399,19 +7444,11 @@ } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "semver": "^6.0.0" } }, "map-cache": { @@ -7451,21 +7488,21 @@ } }, "mdast-util-definitions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", - "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", "requires": { "unist-util-visit": "^2.0.0" } }, "mdast-util-to-hast": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.1.tgz", - "integrity": "sha512-vpMWKFKM2mnle+YbNgDXxx95vv0CoLU0v/l3F5oFAG5DV7qwkZVWA206LsAdOnEVyf5vQcLnb3cWJywu7mUxsQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", "requires": { "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.3", - "mdast-util-definitions": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", "mdurl": "^1.0.0", "unist-builder": "^2.0.0", "unist-util-generated": "^1.0.0", @@ -7516,37 +7553,17 @@ "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "is-buffer": "^1.1.5" + "safe-buffer": "~5.1.0" } } } @@ -7630,11 +7647,11 @@ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "mini-create-react-context": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", - "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", "requires": { - "@babel/runtime": "^7.5.5", + "@babel/runtime": "^7.12.1", "tiny-warning": "^1.0.3" } }, @@ -7667,6 +7684,17 @@ "json5": "^1.0.1" } }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -7779,22 +7807,6 @@ } } }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -7850,6 +7862,12 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -7903,12 +7921,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node-emoji": { @@ -7990,9 +8008,9 @@ } }, "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==" + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" }, "normalize-path": { "version": "3.0.0", @@ -8005,15 +8023,9 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" }, "npm-run-path": { "version": "2.0.2", @@ -8121,37 +8133,17 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "object-keys": { @@ -8168,43 +8160,24 @@ } }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.18.0-next.1" } }, "object.pick": { @@ -8216,34 +8189,14 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "obuf": { @@ -8281,9 +8234,9 @@ } }, "open": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.2.1.tgz", - "integrity": "sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -8355,11 +8308,11 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -8434,12 +8387,12 @@ } }, "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "parent-module": { @@ -8487,9 +8440,9 @@ } }, "parse-numeric-range": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", - "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz", + "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg==" }, "parse5": { "version": "6.0.1", @@ -8502,12 +8455,12 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "pascalcase": { @@ -8526,9 +8479,9 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -8578,9 +8531,9 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pinkie": { "version": "2.0.4", @@ -8596,11 +8549,11 @@ } }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" } }, "pkg-up": { @@ -8609,6 +8562,38 @@ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } } }, "pnp-webpack-plugin": { @@ -8630,9 +8615,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -8645,9 +8630,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.34", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", - "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -8699,9 +8684,9 @@ } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -8774,6 +8759,15 @@ } } }, + "postcss-combine-duplicated-selectors": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/postcss-combine-duplicated-selectors/-/postcss-combine-duplicated-selectors-9.4.0.tgz", + "integrity": "sha512-rMnO1H3wgR1T6QSlK3i8Slz9p3xD+0yOi4J7qwh/5PGR3z8jbgYvRlNKAIvXDtGBQbJKoWs4df5skL3a/fdUEA==", + "requires": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^6.0.0" + } + }, "postcss-convert-values": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", @@ -8891,6 +8885,28 @@ "postcss": "^7.0.0" } }, + "postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "requires": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, "postcss-double-position-gradients": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", @@ -8926,9 +8942,9 @@ } }, "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", "requires": { "postcss": "^7.0.2" } @@ -8970,9 +8986,9 @@ } }, "postcss-load-config": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.1.tgz", - "integrity": "sha512-D2ENobdoZsW0+BHy4x1CAkXtbXtYWYRIxL/JbtRBqrRGOPtJ2zoga/bEZWhV/ShWB5saVxJMzbMdSyA/vv4tXw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" @@ -9071,6 +9087,24 @@ "postcss": "^7.0.2" } }, + "postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "requires": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, "postcss-merge-longhand": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", @@ -9359,11 +9393,6 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", @@ -9499,6 +9528,22 @@ } } }, + "postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, "postcss-reduce-initial": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", @@ -9555,13 +9600,23 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "requires": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" } }, "postcss-svgo": { @@ -9607,18 +9662,28 @@ "uniq": "^1.0.1" } }, + "postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, "pretty-time": { @@ -9632,9 +9697,9 @@ "integrity": "sha512-MgMhSdHuHymNRqD6KM3eGS0PNqgK9q4QF5P0yoQQvpB6jNjeSAi3jcSAz0Sua/t9fa4xDOMar9HJbLa08gl9ug==" }, "prismjs": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", - "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.22.0.tgz", + "integrity": "sha512-lLJ/Wt9yy0AiSYBf212kK3mM5L8ycwlyTlSxHBAneXLR0nzFMlZ5y7riFPF3E33zXOF2IH95xdY5jIyZbM9z/w==", "requires": { "clipboard": "^2.0.0" } @@ -9673,9 +9738,9 @@ } }, "property-information": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", - "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", "requires": { "xtend": "^4.0.0" } @@ -9750,9 +9815,9 @@ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" }, "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "requires": { "escape-goat": "^2.0.0" } @@ -9841,9 +9906,9 @@ } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10062,15 +10127,6 @@ } } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -10175,14 +10231,6 @@ "json5": "^1.0.1" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -10208,19 +10256,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -10229,11 +10264,6 @@ "pify": "^3.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -10266,9 +10296,9 @@ } }, "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10277,9 +10307,9 @@ } }, "react-error-overlay": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", - "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.8.tgz", + "integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==" }, "react-fast-compare": { "version": "3.2.0", @@ -10335,9 +10365,9 @@ } }, "react-player": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.6.2.tgz", - "integrity": "sha512-Wi9DynNSVgddKxac5OzsH0Upk6VRYssvLLGgCRw6vsjzqMX6S5N26WDRNYnLaHykxFNtpPSDc53fXDe52hMaCg==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.7.2.tgz", + "integrity": "sha512-4MqikwtVAxjDlgYp5Kgnz6Uptj/VpYE4VKvg2hOXlgz4zxorsxjBUE8Y3GUY6vpolEMPjpYIxSr1CP4TNrD1WA==", "requires": { "deepmerge": "^4.0.0", "load-script": "^1.0.0", @@ -10401,9 +10431,9 @@ } }, "react-side-effect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.0.tgz", - "integrity": "sha512-IgmcegOSi5SNX+2Snh1vqmF0Vg/CbkycU9XZbOHJlZ6kMzTmi3yc254oB1WCkgA7OQtIAoLmcSFuHTc/tlcqXg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==" }, "react-textarea-autosize": { "version": "6.1.0", @@ -10432,17 +10462,17 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "requires": { "picomatch": "^2.2.1" } }, "reading-time": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.2.0.tgz", - "integrity": "sha512-5b4XmKK4MEss63y0Lw0vn0Zn6G5kiHP88mUnD8UeEsyORj3sh1ghTH0/u6m1Ax9G2F4wUZrknlp6WlIsCvoXVA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.2.1.tgz", + "integrity": "sha512-a27kU9sCJzx4JklmKFMXgMoCWlhBi75DFTbU7+M3rjh5SXRWyacYt02il3muYaA+SUQ7tg5gMQn7GC8zOxTt/g==" }, "rechoir": { "version": "0.6.2", @@ -10461,9 +10491,9 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -10524,19 +10554,19 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -10557,9 +10587,9 @@ } }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "requires": { "rc": "^1.2.8" } @@ -10614,6 +10644,17 @@ "xtend": "^4.0.1" } }, + "hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -10671,15 +10712,15 @@ "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" }, "remark-mdx": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.18.tgz", - "integrity": "sha512-xNhjv4kJZ8L6RV68yK8fQ6XWlvSIFOE5VPmM7wMKSwkvwBu6tlUJy0gRF2WiZ4fPPOj6jpqlVB9QakipvZuEqg==", + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", "requires": { - "@babel/core": "7.11.6", + "@babel/core": "7.12.9", "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.11.0", - "@babel/plugin-syntax-jsx": "7.10.4", - "@mdx-js/util": "1.6.18", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", "is-alphabetical": "1.0.4", "remark-parse": "8.0.3", "unified": "9.2.0" @@ -10722,15 +10763,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", + "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", "requires": { "css-select": "^1.1.0", "dom-converter": "^0.2", "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -10738,6 +10779,31 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -10758,11 +10824,6 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10784,10 +10845,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -10886,9 +10948,9 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" }, "run-queue": { "version": "1.0.3", @@ -10898,17 +10960,19 @@ "aproba": "^1.1.1" } }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" - }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "requires": { "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "safe-buffer": { @@ -11037,9 +11101,9 @@ } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "requires": { "randombytes": "^2.1.0" } @@ -11190,32 +11254,6 @@ "safe-buffer": "^5.0.1" } }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11255,13 +11293,6 @@ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } } }, "sitemap": { @@ -11406,9 +11437,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -11423,6 +11454,11 @@ } } }, + "sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==" + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -11710,61 +11746,21 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string_decoder": { @@ -11899,31 +11895,6 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } } } }, @@ -11953,9 +11924,9 @@ } }, "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" }, "terser": { "version": "4.8.0", @@ -11980,18 +11951,18 @@ } }, "terser-webpack-plugin": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.1.tgz", - "integrity": "sha512-D0IZQNl1ZN/JivFNDFzOeU2Bk2LdQQESHJhKTHsodpUmISkaeRwVFk7gzHzX4OuQwanDGelOxIEsBt1SZ+s6nA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "requires": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.3.0", + "jest-worker": "^26.5.0", "p-limit": "^3.0.2", - "schema-utils": "^2.7.1", + "schema-utils": "^3.0.0", "serialize-javascript": "^5.0.1", "source-map": "^0.6.1", - "terser": "^5.3.1", + "terser": "^5.3.4", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -12000,86 +11971,22 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "find-up": "^4.0.0" + "yocto-queue": "^0.1.0" } }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "requires": { - "randombytes": "^2.1.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "source-map": { @@ -12088,13 +11995,20 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "terser": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.2.tgz", - "integrity": "sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } } } } @@ -12148,9 +12062,9 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } @@ -12281,9 +12195,9 @@ "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" }, "trim-trailing-lines": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", - "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" }, "trough": { "version": "1.0.5", @@ -12301,9 +12215,9 @@ "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" }, "tty-browserify": { "version": "0.0.0", @@ -12389,9 +12303,9 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "is-plain-obj": { "version": "2.1.0", @@ -12451,14 +12365,14 @@ "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" }, "unist-util-generated": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.5.tgz", - "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" }, "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz", + "integrity": "sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==" }, "unist-util-position": { "version": "3.1.0", @@ -12466,9 +12380,9 @@ "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" }, "unist-util-remove": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", - "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.1.tgz", + "integrity": "sha512-YtuetK6o16CMfG+0u4nndsWpujgsHDHHLyE0yGpJLLn5xSjKeyGyzEBOI2XbmoUHCYabmNgX52uxlWoQhcvR7Q==", "requires": { "unist-util-is": "^4.0.0" } @@ -12500,18 +12414,18 @@ } }, "unist-util-visit-parents": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", - "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" }, "unpipe": { "version": "1.0.0", @@ -12565,9 +12479,9 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-notifier": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", - "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", "requires": { "boxen": "^4.2.0", "chalk": "^3.0.0", @@ -12614,13 +12528,25 @@ } }, "url-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.0.tgz", - "integrity": "sha512-IzgAAIC8wRrg6NYkFIJY09vtktQcsvU8V6HhtQj9PTefbYImzLB1hufqo4m+RyM5N3mLx5BqJKccgxJS+W3kqw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { "loader-utils": "^2.0.0", - "mime-types": "^2.1.26", - "schema-utils": "^2.6.5" + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "url-parse": { @@ -12652,28 +12578,6 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, - "use-isomorphic-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.0.0.tgz", - "integrity": "sha512-JMwJ7Vd86NwAt1jH7q+OIozZSIxA4ND0fx6AsOe2q1H8ooBUp5aN6DvVCqZiIaYU6JaMRJGyR0FO7EBCIsb/Rg==" - }, - "use-latest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.1.0.tgz", - "integrity": "sha512-gF04d0ZMV3AMB8Q7HtfkAWe+oq1tFXP6dZKwBHQF5nVXtGsh2oAYeeqma5ZzxtlpOcW8Ro/tLcfmEodjDeqtuw==", - "requires": { - "use-isomorphic-layout-effect": "^1.0.0" - } - }, - "use-onclickoutside": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/use-onclickoutside/-/use-onclickoutside-0.3.1.tgz", - "integrity": "sha512-aahvbW5+G0XJfzj31FJeLsvc6qdKbzeTsQ8EtkHHq5qTg6bm/qkJeKLcgrpnYeHDDbd7uyhImLGdkbM9BRzOHQ==", - "requires": { - "are-passive-events-supported": "^1.1.0", - "use-latest": "^1.0.0" - } - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -12706,19 +12610,19 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -12761,28 +12665,27 @@ "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" }, "vfile": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz", - "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" }, "dependencies": { "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" } } }, "vfile-location": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz", - "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" }, "vfile-message": { "version": "2.0.4", @@ -12798,62 +12701,33 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, - "wait-file": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/wait-file/-/wait-file-1.0.5.tgz", - "integrity": "sha512-udLpJY/eOxlrMm3+XD1RLuF2oT9B7J7wiyR5/9xrvQymS6YR6trWvVhzOldHrVbLwyiRmLj9fcvsjzpSXeZHkw==", + "wait-on": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.2.0.tgz", + "integrity": "sha512-U1D9PBgGw2XFc6iZqn45VBubw02VsLwnZWteQ1au4hUVHasTZuFSKRzlTB2dqgLhji16YVI8fgpEpwUdCr8B6g==", "requires": { - "@hapi/joi": "^15.1.0", - "fs-extra": "^8.1.0", - "rx": "^4.1.0" - }, - "dependencies": { - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "requires": { - "@hapi/hoek": "^8.3.0" - } - } + "axios": "^0.19.2", + "joi": "^17.1.1", + "lodash": "^4.17.19", + "minimist": "^1.2.5", + "rxjs": "^6.5.5" } }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" + "watchpack-chokidar2": "^2.0.1" } }, "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "optional": true, "requires": { "chokidar": "^2.1.8" @@ -12983,7 +12857,11 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", @@ -13245,6 +13123,24 @@ } } }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -13286,6 +13182,15 @@ "json5": "^1.0.1" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -13294,6 +13199,15 @@ "yallist": "^3.0.2" } }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -13314,6 +13228,32 @@ "to-regex": "^3.0.2" } }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -13332,6 +13272,19 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13398,9 +13351,9 @@ }, "dependencies": { "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "chalk": { "version": "2.4.2", @@ -13624,7 +13577,11 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } }, "glob-parent": { "version": "3.1.0", @@ -13720,6 +13677,11 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -13892,11 +13854,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } } @@ -13918,9 +13879,9 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-fetch": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", - "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz", + "integrity": "sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==" }, "whatwg-url": { "version": "7.1.0", @@ -14039,9 +14000,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, "yallist": { "version": "4.0.0", @@ -14070,6 +14031,36 @@ "yargs-parser": "^13.1.2" }, "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -14098,6 +14089,11 @@ } } }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/package.json b/package.json index e254416ed9a..c5e45a4c51e 100644 --- a/package.json +++ b/package.json @@ -18,13 +18,14 @@ "serve": "docusaurus serve" }, "dependencies": { - "@docusaurus/core": "2.0.0-alpha.64", - "@docusaurus/preset-classic": "2.0.0-alpha.64", - "@mdx-js/react": "^1.5.8", + "@docusaurus/core": "2.0.0-alpha.69", + "@docusaurus/preset-classic": "2.0.0-alpha.69", + "@mdx-js/react": "^1.6.22", "clsx": "^1.1.1", - "react": "^16.8.4", - "react-dom": "^16.8.4", - "react-player": "^2.6.2" + "color": "^3.1.3", + "react": "^16.14.0", + "react-dom": "^16.14.0", + "react-player": "^2.7.2" }, "browserslist": { "production": [ diff --git a/sidebars.js b/sidebars.js index bed15de737c..f80d0b03133 100644 --- a/sidebars.js +++ b/sidebars.js @@ -1,281 +1,317 @@ module.exports = { - camundaCloud: { - Guides: [ - "guides/introcution-to-camunda-cloud", - "guides/getting-started-with-camunda-cloud", - { - "Getting started with Camunda Cloud": [ - "guides/getting-started/create-camunda-cloud-account", - "guides/getting-started/create-cluster", - "guides/getting-started/setup-client-connection-credentials", - "guides/getting-started/connect-to-your-cluster", - "guides/getting-started/model-your-first-process", - "guides/getting-started/deploy-your-process-and-start-process-instance", - "guides/getting-started/implement-service-task", - "guides/getting-started/implement-decision-gateway", - "guides/getting-started/involve-humans", - "guides/getting-started/monitor-your-process-in-operate", - ], - }, - "guides/operating-the-camunda-cloud-stack-on-kubernetes", - ], - "Product Manuals": [ - "product-manuals/overview", - { - Clients: [ - { - NodeJS: [ - "product-manuals/clients/nodejs/install-the-nodejs-client", - ], - }, - "product-manuals/clients/build-your-own-client", - ], - "Cloud Console": [ - "product-manuals/cloud-console/overview", - { - "Manage your Cloud Account": [ - "guides/getting-started/create-camunda-cloud-account", - "product-manuals/cloud-console/manage-cloud-account/administrate-account", - ], - }, - { - "Manage Clusters": [ - "product-manuals/cloud-console/manage-clusters/create-cluster", - "product-manuals/cloud-console/manage-clusters/manage-client-connections", - "reference/cloud-console-api/cloud-console-api-reference", - ], - }, - { - "Manage your Plan": [ - "product-manuals/cloud-console/manage-plan/available-plans", - "product-manuals/cloud-console/manage-plan/trial-plan", - "product-manuals/cloud-console/manage-plan/professional-plan", + Guides: [ + "guides/introduction-to-camunda-cloud", + { + "Getting started with Camunda Cloud": [ + "guides/getting-started/create-camunda-cloud-account", + "guides/getting-started/create-cluster", + "guides/getting-started/setup-client-connection-credentials", + "guides/getting-started/connect-to-your-cluster", + "guides/getting-started/model-your-first-process", + "guides/getting-started/deploy-your-process-and-start-process-instance", + "guides/getting-started/implement-service-task", + "guides/getting-started/implement-decision-gateway", + // "guides/getting-started/involve-humans", + "guides/getting-started/monitor-your-process-in-operate", + ], + }, + "guides/setting-up-development-project", + ], + "Product Manuals": [ + "product-manuals/overview", + { + Concepts: [ + "product-manuals/concepts/what-is-camunda-cloud", + "product-manuals/concepts/workflows", + "product-manuals/concepts/job-workers", + "product-manuals/concepts/workflow-instance-creation", + "product-manuals/concepts/messages", + "product-manuals/concepts/incidents", + "product-manuals/concepts/variables", + "product-manuals/concepts/expressions", + ], + Clients: [ + "product-manuals/clients/overview", + { + "Java client": [ + "product-manuals/clients/java-client/index", + "product-manuals/clients/java-client/get-started", + "product-manuals/clients/java-client/logging", + "product-manuals/clients/java-client/testing", + { + "Examples": [ + "product-manuals/clients/java-client-examples/index", + "product-manuals/clients/java-client-examples/workflow-deploy", + "product-manuals/clients/java-client-examples/workflow-instance-create", + "product-manuals/clients/java-client-examples/workflow-instance-create-nonblocking", + "product-manuals/clients/java-client-examples/workflow-instance-create-with-result", + "product-manuals/clients/java-client-examples/job-worker-open", + "product-manuals/clients/java-client-examples/data-pojo", + "product-manuals/clients/java-client-examples/cluster-topology-request", + ], + }, + ], + }, + { + "Go client": [ + "product-manuals/clients/go-client/index", + "product-manuals/clients/go-client/get-started", + ] + }, + { + "CLI client": [ + "product-manuals/clients/cli-client/index", + "product-manuals/clients/cli-client/get-started" + ] + }, + { + "Community clients": [ + "product-manuals/clients/other-clients/index", + "product-manuals/clients/other-clients/c-sharp", + "product-manuals/clients/other-clients/javascript", + "product-manuals/clients/other-clients/python", + "product-manuals/clients/other-clients/ruby", + "product-manuals/clients/other-clients/rust", + ], + }, + "product-manuals/clients/build-your-own-client", + ], + "Cloud Console": [ + "product-manuals/cloud-console/introduction", + { + "Manage your organization": [ + "product-manuals/cloud-console/manage-organization/organization-settings", + "product-manuals/cloud-console/manage-organization/manage-users", + "product-manuals/cloud-console/manage-organization/view-organization-activity", + "product-manuals/cloud-console/manage-organization/manage-cloud-management-api-clients", + "product-manuals/cloud-console/manage-organization/update-billing-reservations", + "product-manuals/cloud-console/manage-organization/switch-organization", + ], + }, + { + "Manage clusters": [ + "product-manuals/cloud-console/manage-clusters/create-cluster", + "product-manuals/cloud-console/manage-clusters/rename-cluster", + "product-manuals/cloud-console/manage-clusters/delete-cluster", + "product-manuals/cloud-console/manage-clusters/manage-api-clients", + ], + }, + { + "Manage your plan": [ + "product-manuals/cloud-console/manage-plan/available-plans", + "product-manuals/cloud-console/manage-plan/trial-plan", + { + "Professional Plan": [ + "product-manuals/cloud-console/manage-plan/professional-plan/overview", + "product-manuals/cloud-console/manage-plan/professional-plan/upgrade-to-professional-plan", + "product-manuals/cloud-console/manage-plan/professional-plan/billing-parameters", + ], + }, + ], + }, + { + Troubleshooting: [ + "product-manuals/cloud-console/troubleshooting/common-pitfalls", + "product-manuals/cloud-console/troubleshooting/feedback-and-support", + ], + }, + ], + Modeler: [ + "product-manuals/modeler/overview", + { + "Cloud Modeler": [ + "product-manuals/modeler/cloud-modeler/launch-cloud-modeler", + "product-manuals/modeler/cloud-modeler/model-your-first-diagram", + "product-manuals/modeler/cloud-modeler/import-diagram", + "product-manuals/modeler/cloud-modeler/save-and-deploy", + "product-manuals/modeler/cloud-modeler/start-instance", + ], + "Zeebe Modeler": [ + "product-manuals/modeler/zeebe-modeler/install-the-zeebe-modeler", + "product-manuals/modeler/zeebe-modeler/model-your-first-diagram", + "product-manuals/modeler/zeebe-modeler/connect-to-camunda-cloud", + "product-manuals/modeler/zeebe-modeler/deploy-to-cloud", + "product-manuals/modeler/zeebe-modeler/start-instance", + ], + }, + ], + Zeebe: [ + "product-manuals/zeebe/zeebe-overview", + { + "Technical concepts": [ + "product-manuals/zeebe/technical-concepts/index", + "product-manuals/zeebe/technical-concepts/architecture", + "product-manuals/zeebe/technical-concepts/clustering", + "product-manuals/zeebe/technical-concepts/partitions", + "product-manuals/zeebe/technical-concepts/internal-processing", + "product-manuals/zeebe/technical-concepts/workflow-lifecycles", + "product-manuals/zeebe/technical-concepts/protocols", + "product-manuals/zeebe/technical-concepts/exporters", + ], + }, + { + "Deployment guide": [ + "product-manuals/zeebe/deployment-guide/index", + { + "Local installation": [ + "product-manuals/zeebe/deployment-guide/local/install", + "product-manuals/zeebe/deployment-guide/local/quickstart", + ] + }, + "product-manuals/zeebe/deployment-guide/docker/install", + { + "Kubernetes deployment": [ + "product-manuals/zeebe/deployment-guide/kubernetes/index", + { + "Helm charts": [ + "product-manuals/zeebe/deployment-guide/kubernetes/helm/index", + "product-manuals/zeebe/deployment-guide/kubernetes/helm/prerequisites", + "product-manuals/zeebe/deployment-guide/kubernetes/helm/installing-helm", + "product-manuals/zeebe/deployment-guide/kubernetes/helm/accessing-operate", + ] + }, + "product-manuals/zeebe/deployment-guide/kubernetes/operator/zeebe-operator", + ], + }, + { + "Getting started tutorial": [ + "product-manuals/zeebe/deployment-guide/getting-started/index", + "product-manuals/zeebe/deployment-guide/getting-started/tutorial-setup", + "product-manuals/zeebe/deployment-guide/getting-started/create-a-workflow", + "product-manuals/zeebe/deployment-guide/getting-started/deploy-a-workflow", + "product-manuals/zeebe/deployment-guide/getting-started/create-workflow-instance", + "product-manuals/zeebe/deployment-guide/getting-started/next-steps-resources", + ], + }, + { + Configuration: [ + "product-manuals/zeebe/deployment-guide/configuration/configuration", + "product-manuals/zeebe/deployment-guide/configuration/logging", + "product-manuals/zeebe/deployment-guide/configuration/gateway-health-probes", + "product-manuals/zeebe/deployment-guide/configuration/environment-variables", + ] + }, + { + Security: [ + "product-manuals/zeebe/deployment-guide/security/security", + "product-manuals/zeebe/deployment-guide/security/authentication", + "product-manuals/zeebe/deployment-guide/security/authorization", + ], + }, + { + Operation: [ + "product-manuals/zeebe/deployment-guide/operations/index", + "product-manuals/zeebe/deployment-guide/operations/resource-planning", + "product-manuals/zeebe/deployment-guide/operations/network-ports", + "product-manuals/zeebe/deployment-guide/operations/setting-up-a-cluster", + "product-manuals/zeebe/deployment-guide/operations/metrics", + "product-manuals/zeebe/deployment-guide/operations/health", + "product-manuals/zeebe/deployment-guide/operations/backpressure", + "product-manuals/zeebe/deployment-guide/operations/disk-space", + "product-manuals/zeebe/deployment-guide/operations/upgrade-zeebe", + ], + }, + ] + }, + { + "Open Source community": [ + "product-manuals/zeebe/open-source/community-contributions", + "product-manuals/zeebe/open-source/get-help-get-involved", + "product-manuals/zeebe/open-source/release-cycle", + "product-manuals/zeebe/open-source/deprecated-features", + ] + }, + { + Appendix: [ + + ], + }, + ], + Operate: [ + "product-manuals/operate/index",{ + "User guide":[ + "product-manuals/operate/userguide/basic-operate-navigation", + "product-manuals/operate/userguide/resolve-incidents-update-variables", + "product-manuals/operate/userguide/selections-operations", + "product-manuals/operate/userguide/operate-feedback-and-questions" ], - }, - ], - Modeler: ["product-manuals/modeler/install-the-modeler"], - "Zeebe Engine": [ - "product-manuals/zeebe/zeebe-overview", - { - "Introduction": [ - "product-manuals/zeebe/introduction/index", - "product-manuals/zeebe/introduction/what-is-zeebe", - "product-manuals/zeebe/introduction/install", - "product-manuals/zeebe/introduction/quickstart", - "product-manuals/zeebe/introduction/community-contributions", - "product-manuals/zeebe/introduction/get-help-get-involved", - "product-manuals/zeebe/introduction/release-cycle", + "Deployment guide": [ + "product-manuals/operate/deployment/install-and-start", + "product-manuals/operate/deployment/configuration", + "product-manuals/operate/deployment/data-retention", + "product-manuals/operate/deployment/schema-and-migration", + "product-manuals/operate/deployment/importer-and-archiver", + "product-manuals/operate/deployment/authentication" ], - }, - { - "Basics": [ - "product-manuals/zeebe/basics/index", - "product-manuals/zeebe/basics/architecture", - "product-manuals/zeebe/basics/workflows", - "product-manuals/zeebe/basics/job-workers", - "product-manuals/zeebe/basics/partitions", - "product-manuals/zeebe/basics/protocols", - "product-manuals/zeebe/basics/internal-processing", - "product-manuals/zeebe/basics/exporters", - "product-manuals/zeebe/basics/clustering", - ] - }, - { - "Getting Started Tutorial": [ - "product-manuals/zeebe/getting-started/index", - "product-manuals/zeebe/getting-started/tutorial-setup", - "product-manuals/zeebe/getting-started/create-a-workflow", - "product-manuals/zeebe/getting-started/deploy-a-workflow", - "product-manuals/zeebe/getting-started/create-workflow-instance", - "product-manuals/zeebe/getting-started/next-steps-resources", - ] - }, - { - "BPMN Workflow": [ - "product-manuals/zeebe/bpmn-workflows/bpmn-primer", - "product-manuals/zeebe/bpmn-workflows/bpmn-coverage", - "product-manuals/zeebe/bpmn-workflows/data-flow", - { - "Tasks": [ - "product-manuals/zeebe/bpmn-workflows/tasks", - "product-manuals/zeebe/bpmn-workflows/service-tasks/service-tasks", - "product-manuals/zeebe/bpmn-workflows/receive-tasks/receive-tasks", - ] - }, - { - "Gateways": [ - "product-manuals/zeebe/bpmn-workflows/gateways", - "product-manuals/zeebe/bpmn-workflows/exclusive-gateways/exclusive-gateways", - "product-manuals/zeebe/bpmn-workflows/parallel-gateways/parallel-gateways", - "product-manuals/zeebe/bpmn-workflows/event-based-gateways/event-based-gateways", - ] - }, - { - "Events": [ - "product-manuals/zeebe/bpmn-workflows/events", - "product-manuals/zeebe/bpmn-workflows/none-events/none-events", - "product-manuals/zeebe/bpmn-workflows/message-events/message-events", - "product-manuals/zeebe/bpmn-workflows/timer-events/timer-events", - "product-manuals/zeebe/bpmn-workflows/error-events/error-events", - ] - }, - { - "Subprocesses": [ - "product-manuals/zeebe/bpmn-workflows/subprocesses", - "product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/embedded-subprocesses", - "product-manuals/zeebe/bpmn-workflows/call-activities/call-activities", - "product-manuals/zeebe/bpmn-workflows/event-subprocesses/event-subprocesses", - ] - }, - { - "Markers": [ - "product-manuals/zeebe/bpmn-workflows/markers", - "product-manuals/zeebe/bpmn-workflows/multi-instance/multi-instance", - ] - } - ] - }, - { - "YAML Workflows": [ - "product-manuals/zeebe/yaml-workflows/index", - "product-manuals/zeebe/yaml-workflows/tasks", - "product-manuals/zeebe/yaml-workflows/control-flow", - "product-manuals/zeebe/yaml-workflows/data-flow", - ] - }, - { - "Reference": [ - "product-manuals/zeebe/reference/index", - "product-manuals/zeebe/reference/workflow-instance-creation", - "product-manuals/zeebe/reference/workflow-lifecycles", - "product-manuals/zeebe/reference/variables", - "product-manuals/zeebe/reference/expressions", - "product-manuals/zeebe/reference/message-correlation/message-correlation", - "product-manuals/zeebe/reference/incidents", - "product-manuals/zeebe/reference/grpc", - "product-manuals/zeebe/reference/exporters", - ] - }, - { - "Zeebe Client Libraries": [ - "product-manuals/zeebe/clients/index", - { - "Zeebe Java Client" : [ - "product-manuals/zeebe/clients/java-client/index", - "product-manuals/zeebe/clients/java-client/setup", - "product-manuals/zeebe/clients/java-client/get-started", - "product-manuals/zeebe/clients/java-client/logging", - "product-manuals/zeebe/clients/java-client/testing", - { - "Example Code using the Zeebe Java Client": [ - "product-manuals/zeebe/clients/java-client-examples/index", - "product-manuals/zeebe/clients/java-client-examples/workflow-deploy", - "product-manuals/zeebe/clients/java-client-examples/workflow-instance-create", - "product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-nonblocking", - "product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-with-result", - "product-manuals/zeebe/clients/java-client-examples/job-worker-open", - "product-manuals/zeebe/clients/java-client-examples/data-pojo", - "product-manuals/zeebe/clients/java-client-examples/cluster-topology-request", - ] - } - ] - }, - { - "Zeebe Go Client": [ - "product-manuals/zeebe/clients/go-client/index", - "product-manuals/zeebe/clients/go-client/get-started", - ] - }, - { - "Community Supported Clients": [ - "product-manuals/zeebe/clients/other-clients/index", - "product-manuals/zeebe/clients/other-clients/c-sharp", - "product-manuals/zeebe/clients/other-clients/javascript", - "product-manuals/zeebe/clients/other-clients/python", - "product-manuals/zeebe/clients/other-clients/ruby", - "product-manuals/zeebe/clients/other-clients/rust", - ] - } - ] - }, - { - "Zeebe Operations": [ - "product-manuals/zeebe/operations/index", - "product-manuals/zeebe/operations/configuration", - "product-manuals/zeebe/operations/resource-planning", - "product-manuals/zeebe/operations/network-ports", - "product-manuals/zeebe/operations/setting-up-a-cluster", - "product-manuals/zeebe/operations/metrics", - "product-manuals/zeebe/operations/kubernetes", - { - "Security": [ - "product-manuals/zeebe/operations/security", - "product-manuals/zeebe/operations/authentication", - "product-manuals/zeebe/operations/authorization", - ] - }, - "product-manuals/zeebe/operations/health", - "product-manuals/zeebe/operations/backpressure", - "product-manuals/zeebe/operations/disk-space", - "product-manuals/zeebe/operations/upgrade-zeebe", - ] - }, - { - "Zeebe on Kubernetes": [ - "product-manuals/zeebe/kubernetes/index", - "product-manuals/zeebe/kubernetes/prerequisites", - "product-manuals/zeebe/kubernetes/installing-helm", - "product-manuals/zeebe/kubernetes/accessing-operate", - "product-manuals/zeebe/kubernetes/zeebe-operator", - ] - }, - { - "Appendix": [ - "product-manuals/zeebe/appendix/glossary", - "product-manuals/zeebe/appendix/broker-config-template", - "product-manuals/zeebe/appendix/gateway-config-template", - "product-manuals/zeebe/appendix/gateway-health-probes", - "product-manuals/zeebe/appendix/environment-variables", - "product-manuals/zeebe/appendix/deprecated-features", - ] - } - ], - Operate: [{ - "Deployment Guide": [ - "product-manuals/operate/deployment/configuration", - "product-manuals/operate/deployment/data-retention", - "product-manuals/operate/deployment/schema-and-migration", - "product-manuals/operate/deployment/importer-and-archiver", - "product-manuals/operate/deployment/authentication" + } + ], + Tasklist: [ + "product-manuals/tasklist/introduction",{ + "User guide": [ + "product-manuals/tasklist/userguide/overview", ], - "User Guide":[ - "product-manuals/operate/userguide/index", - "product-manuals/operate/userguide/install-and-start", - "product-manuals/operate/userguide/basic-operate-navigation", - "product-manuals/operate/userguide/resolve-incidents-update-variables", - "product-manuals/operate/userguide/selections-batch-operations", - "product-manuals/operate/userguide/operate-feedback-and-questions" - ] - }], - Tasklist: [{ - "Deployment Guide": [ + "Deployment guide": [ + "product-manuals/tasklist/deployment/install-and-start", "product-manuals/tasklist/deployment/configuration", - "product-manuals/tasklist/deployment/authentication" + "product-manuals/tasklist/deployment/authentication", + "product-manuals/tasklist/deployment/api-client", ], - "User Guide":[ - ] - }] - }, - ], - Reference: [ - "reference/overview", - { - "Console API": [ - "reference/cloud-console-api/cloud-console-api-clients", - "reference/cloud-console-api/cloud-console-api-reference", - ], - }, - ], - Samples: ["samples/overview"], - }, + }, + ], + }, + ], + Reference: [ + "reference/overview", + "reference/cloud-console-api-clients", + "reference/cloud-console-api-reference", + "reference/grpc", + require("./docs/reference/tasklist-api/sidebar-schema"), + { + "BPMN workflows": [ + "reference/bpmn-workflows/bpmn-primer", + "reference/bpmn-workflows/bpmn-coverage", + "reference/bpmn-workflows/data-flow", + { + Tasks: [ + "reference/bpmn-workflows/tasks", + "reference/bpmn-workflows/service-tasks/service-tasks", + "reference/bpmn-workflows/receive-tasks/receive-tasks", + ], + }, + { + Gateways: [ + "reference/bpmn-workflows/gateways", + "reference/bpmn-workflows/exclusive-gateways/exclusive-gateways", + "reference/bpmn-workflows/parallel-gateways/parallel-gateways", + "reference/bpmn-workflows/event-based-gateways/event-based-gateways", + ], + }, + { + Events: [ + "reference/bpmn-workflows/events", + "reference/bpmn-workflows/none-events/none-events", + "reference/bpmn-workflows/message-events/message-events", + "reference/bpmn-workflows/timer-events/timer-events", + "reference/bpmn-workflows/error-events/error-events", + ], + }, + { + Subprocesses: [ + "reference/bpmn-workflows/subprocesses", + "reference/bpmn-workflows/embedded-subprocesses/embedded-subprocesses", + "reference/bpmn-workflows/call-activities/call-activities", + "reference/bpmn-workflows/event-subprocesses/event-subprocesses", + ], + }, + { + Markers: [ + "reference/bpmn-workflows/markers", + "reference/bpmn-workflows/multi-instance/multi-instance", + ], + }, + ], + }, + require("./docs/reference/feel/sidebar-schema"), + "reference/glossary", + ] }; diff --git a/src/css/custom.css b/src/css/custom.css index 6a99aba5027..04295dd8183 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -7,13 +7,13 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #EB256D; - --ifm-color-primary-dark: rgb(33, 175, 144); - --ifm-color-primary-darker: rgb(31, 165, 136); - --ifm-color-primary-darkest: rgb(26, 136, 112); - --ifm-color-primary-light: rgb(70, 203, 174); - --ifm-color-primary-lighter: rgb(102, 212, 189); - --ifm-color-primary-lightest: rgb(146, 224, 208); + --ifm-color-primary: #FF1F00; + --ifm-color-primary-dark: #FF3800; + --ifm-color-primary-darker: #FF4700; + --ifm-color-primary-darkest: #FF5400; + --ifm-color-primary-light: #FF7000; + --ifm-color-primary-lighter: #FF7D00; + --ifm-color-primary-lightest: #FF8B00; --ifm-code-font-size: 95%; } @@ -23,3 +23,11 @@ margin: 0 calc(-1 * var(--ifm-pre-padding)); padding: 0 var(--ifm-pre-padding); } + +body{ + font-family: IBM Plex Sans,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen-sans,ubuntu,cantarell,Helvetica Neue,sans-serif; +} + +.alert--primary { + background-color: #14d890; +} \ No newline at end of file diff --git a/src/pages/contact.md b/src/pages/contact.md index a1826aedbe9..bf3ede43c08 100644 --- a/src/pages/contact.md +++ b/src/pages/contact.md @@ -13,6 +13,4 @@ There are various channels where you can reach us. - For **security-related issues**, please e-mail us at [this address](mailto:cloud-security@camunda.com) so we can solve the problem as quickly as possible. -- **Feebdack and Support** can be submitted or requested via the corresponding entry in the navigation menu. If you have a **license agreement** with us you will be redirected to the [Support queue](https://jira.camunda.com/projects/SUPPORT/) at Camunda. In the Free Plan, contact can be made using the internal form: - -![feedback-dialog](./img/contact-feedback-and-support.png) +- **Feebdack and Support** can be submitted or requested via the corresponding entry in the [Cloud Console navigation menu](../../docs/product-manuals/cloud-console/troubleshooting/feedback-and-support). If you have a **license agreement** with us you will be redirected to the [Support queue](https://jira.camunda.com/projects/SUPPORT/) at Camunda. In the Free Plan, contact can be made using the internal form: diff --git a/src/pages/img/contact-feedback-and-support.png b/src/pages/img/contact-feedback-and-support.png deleted file mode 100644 index 5ebe05c1f8c..00000000000 Binary files a/src/pages/img/contact-feedback-and-support.png and /dev/null differ diff --git a/src/pages/index.js b/src/pages/index.js index ffee7b32de2..c384a2a7cf0 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -9,16 +9,15 @@ import styles from './styles.module.css'; const features = [ { title: 'Camunda Cloud', - imageUrl: 'img/camunda-cloud-logo.png', + imageUrl: 'img/camunda-cloud-gradient.png', description: ( - <> - Camunda Cloud delivers a scalable, on-demand workflow platform + <>A scalable, on-demand workflow platform ), }, { title: 'Zeebe', - imageUrl: 'img/workflow-engine-on-gradient.png', + imageUrl: 'img/camunda-workflow-engine-gradient.png', description: ( <> A workflow engine for microservices orchestration @@ -27,7 +26,7 @@ const features = [ }, { title: 'Operate', - imageUrl: 'img/cockpit-on-gradient.png', + imageUrl: 'img/camunda-operate-gradient.png', description: ( <> Visibility, Monitoring, and Management diff --git a/src/theme/DocVersionSuggestions/index.js b/src/theme/DocVersionSuggestions/index.js new file mode 100644 index 00000000000..697bf7511c8 --- /dev/null +++ b/src/theme/DocVersionSuggestions/index.js @@ -0,0 +1,81 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import React from "react"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import Link from "@docusaurus/Link"; +import { + useActivePlugin, + useActiveVersion, + useDocVersionSuggestions, +} from "@theme/hooks/useDocs"; +import { useDocsPreferredVersion } from "@docusaurus/theme-common"; + +const getVersionMainDoc = (version) => + version.docs.find((doc) => doc.id === version.mainDocId); + +function DocVersionSuggestions() { + const { + siteConfig: { title: siteTitle }, + } = useDocusaurusContext(); + const { pluginId } = useActivePlugin({ + failfast: true, + }); + const { savePreferredVersionName } = useDocsPreferredVersion(pluginId); + const activeVersion = useActiveVersion(pluginId); + const { + latestDocSuggestion, + latestVersionSuggestion, + } = useDocVersionSuggestions(pluginId); // No suggestion to be made + + if (!latestVersionSuggestion) { + return <>; + } // try to link to same doc in latest version (not always possible) + // fallback to main doc of latest version + + const latestVersionSuggestedDoc = + latestDocSuggestion ?? getVersionMainDoc(latestVersionSuggestion); + return <>; + // @urbanisierung: removed old version banner, should be configurable in future + // https://github.com/facebook/docusaurus/issues/3013 + // Command to separate components: https://v2.docusaurus.io/docs/cli/#docusaurus-swizzle + // For this component: node_modules/@docusaurus/core/bin/docusaurus.js swizzle @docusaurus/theme-classic DocVersionSuggestions --danger + // + // return ( + //
    + // { + // // TODO need refactoring + // activeVersion.name === 'current' ? ( + //
    + // This is unreleased documentation for {siteTitle}{' '} + // {activeVersion.label} version. + //
    + // ) : ( + //
    + // This is documentation for {siteTitle}{' '} + // {activeVersion.label}, which is no longer actively + // maintained. + //
    + // ) + // } + //
    + // For up-to-date documentation, see the{' '} + // + // + // savePreferredVersionName(latestVersionSuggestion.name) + // }> + // latest version + // + // {' '} + // ({latestVersionSuggestion.label}). + //
    + //
    + // ); +} + +export default DocVersionSuggestions; diff --git a/static/img/camunda-cloud-gradient.png b/static/img/camunda-cloud-gradient.png new file mode 100644 index 00000000000..eb47811af2d Binary files /dev/null and b/static/img/camunda-cloud-gradient.png differ diff --git a/static/img/camunda-cloud-logo.png b/static/img/camunda-cloud-logo.png deleted file mode 100644 index 36093a0925a..00000000000 Binary files a/static/img/camunda-cloud-logo.png and /dev/null differ diff --git a/static/img/camunda-cloud-on-gradient.png b/static/img/camunda-cloud-on-gradient.png deleted file mode 100644 index 83828719d68..00000000000 Binary files a/static/img/camunda-cloud-on-gradient.png and /dev/null differ diff --git a/static/img/camunda-operate-gradient.png b/static/img/camunda-operate-gradient.png new file mode 100644 index 00000000000..366669775bc Binary files /dev/null and b/static/img/camunda-operate-gradient.png differ diff --git a/static/img/camunda-workflow-engine-gradient.png b/static/img/camunda-workflow-engine-gradient.png new file mode 100644 index 00000000000..a9f4df2a954 Binary files /dev/null and b/static/img/camunda-workflow-engine-gradient.png differ diff --git a/static/img/cockpit-on-gradient.png b/static/img/cockpit-on-gradient.png deleted file mode 100644 index 912f2838eaf..00000000000 Binary files a/static/img/cockpit-on-gradient.png and /dev/null differ diff --git a/static/img/favicon.ico b/static/img/favicon.ico index 84c734cc360..62b6ede0262 100644 Binary files a/static/img/favicon.ico and b/static/img/favicon.ico differ diff --git a/static/img/workflow-engine-on-gradient.png b/static/img/workflow-engine-on-gradient.png deleted file mode 100644 index 41193d6e0b2..00000000000 Binary files a/static/img/workflow-engine-on-gradient.png and /dev/null differ diff --git a/versioned_docs/version-0.25/guides/OWNERS b/versioned_docs/version-0.25/guides/OWNERS new file mode 100644 index 00000000000..c719a6a5104 --- /dev/null +++ b/versioned_docs/version-0.25/guides/OWNERS @@ -0,0 +1,13 @@ +approvers: +- camundacloud +- operate +- tasklist +- zeebe + +reviewers: +- camundacloud +- devrel +- operate +- productmanagement +- tasklist +- zeebe diff --git a/versioned_docs/version-0.25/guides/getting-started/bpmn/gettingstarted_quickstart.bpmn b/versioned_docs/version-0.25/guides/getting-started/bpmn/gettingstarted_quickstart.bpmn new file mode 100644 index 00000000000..bbe3a4b6898 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/bpmn/gettingstarted_quickstart.bpmn @@ -0,0 +1,26 @@ + + + + + SequenceFlow_1jbw0ni + + + + SequenceFlow_1jbw0ni + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/guides/getting-started/bpmn/gettingstarted_quickstart_advanced.bpmn b/versioned_docs/version-0.25/guides/getting-started/bpmn/gettingstarted_quickstart_advanced.bpmn new file mode 100644 index 00000000000..5f69a34f0e5 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/bpmn/gettingstarted_quickstart_advanced.bpmn @@ -0,0 +1,80 @@ + + + + + Flow_15yg3k5 + + + + + + + Flow_15yg3k5 + Flow_13k1knz + + + Flow_13k1knz + Flow_0qhnfdq + Flow_1vlnqoi + + + + Flow_0qhnfdq + + + =return="Pong" + + + Flow_1vlnqoi + + + =return!="Pong" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/guides/getting-started/connect-to-your-cluster.md b/versioned_docs/version-0.25/guides/getting-started/connect-to-your-cluster.md new file mode 100644 index 00000000000..fad499b8528 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/connect-to-your-cluster.md @@ -0,0 +1,38 @@ +--- +id: connect-to-your-cluster +title: Connect to your Cluster +--- + +## Installation + +Install the appropriate package. + +```bash +npm i -g zbctl +``` + +## First connection + +After creating a client and downloading the connection file, you will now need to source it to make it available in your environment. If these are known to the system, a client can communicate directly with its own cluster in the cloud without further configuration. + +```bash +source ~/Downloads/CamundaCloudMgmtAPI-Client-test-client.txt +``` + +```bash +zbctl status +``` + +As a result you will get a similar result: + +```bash +Cluster size: 1 +Partitions count: 2 +Replication factor: 1 +Gateway version: unavailable +Brokers: + Broker 0 - zeebe-0.zeebe-broker-service.456637ef-8832-428b-a2a4-82b531b25635-zeebe.svc.cluster.local:26501 + Version: unavailable + Partition 1 : Leader + Partition 2 : Leader +``` diff --git a/versioned_docs/version-0.25/guides/getting-started/create-camunda-cloud-account.md b/versioned_docs/version-0.25/guides/getting-started/create-camunda-cloud-account.md new file mode 100644 index 00000000000..edc0f7ec592 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/create-camunda-cloud-account.md @@ -0,0 +1,26 @@ +--- +id: create-camunda-cloud-account +title: Create Camunda Cloud Account +--- + +## Sign up for Camunda Cloud + +Create a Camunda Cloud account for yourself, so that you can create clusters, deploy workflows and create a new instance. + +### Visit [https://accounts.cloud.camunda.io/signup](https://accounts.cloud.camunda.io/signup) + +The **Sign Up** screen appears: + +![signup](./img/signup.png) + +### Fill in the form and submit + +After you've filled in and sent the form, you'll receive a confirmation e-mail. Click on the link to verify your e-mail address and set your password. + +## Login to your Camunda Cloud account + +### Visit [https://camunda.io](https://camunda.io) + +Log in with your e-mail address and password: + +![login](./img/login.png) diff --git a/versioned_docs/version-0.25/guides/getting-started/create-cluster.md b/versioned_docs/version-0.25/guides/getting-started/create-cluster.md new file mode 100644 index 00000000000..4ea213ad968 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/create-cluster.md @@ -0,0 +1,20 @@ +--- +id: create-cluster +title: Create a Cluster +--- + +After login you'll see the console overview page. Since you haven't created a cluster, the overview will be empty. + +![cluster-creating](./img/cluster-overview-empty.png) + +In the upper right area you'll find the button _Create New Cluster_. Click on it to create a new cluster. After you've assigned a name and created the cluster, a new entry appears in the overview: + +![cluster-creating](./img/cluster-overview-new-cluster-creating.png) + +For this Getting Started Tutorial, close the dialog box that pops up immediately after creating a new cluster. + +The cluster is now being set up. During this phase, its state is _Creating_. After one or two minutes the cluster is ready for use and changes its state to _healthy_: + +![cluster-healthy](./img/cluster-overview-new-cluster-healthy.png) + +After the cluster has been created, you can jump into the cluster detail page by clicking on the cluster name. diff --git a/versioned_docs/version-0.25/guides/getting-started/deploy-your-process-and-start-process-instance.md b/versioned_docs/version-0.25/guides/getting-started/deploy-your-process-and-start-process-instance.md new file mode 100644 index 00000000000..61ad3394792 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/deploy-your-process-and-start-process-instance.md @@ -0,0 +1,64 @@ +--- +id: deploy-your-process-and-start-process-instance +title: Deploy your process and start a process instance +--- + + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + + + + + + +You can now use the "Save & Deploy" button to deploy the newly created process to your cluster + +![console-modeler-deploy](./img/cloud-modeler-deploy.png) + +Deployment can take a few seconds, but you should get a confirmation for successfull deployment. + +![console-modeler-deploy-successfull](./img/cloud-modeler-deploy-successfull.png) + +You can now start a new process instance. For this example you can just start an instance with an empty payload. + +![console-modeler-start-instance](./img/cloud-modeler-start-instance.png) + +Once the instance is started, you'll get a confirmation with a link to jump into Operate directly. + +![console-modeler-start-instance-done](./img/cloud-modeler-start-instance-done.png) + + + + + + + +On the right side of the navigation menu there are buttons for deploying and starting workflows. + +![zeebe-modeler-deploy](./img/zeebe-modeler-deploy.png) + +In the deployment dialog, the connection information must now be specified: Cluster Id, Client Id and Client Secret. + + Client Id and Cluster Id can be retrieved by clicking on the _View_ link on the client in the _API_-Tab. + + +![cluster-details-created-client-view](./img/cluster-details-created-client-view.png) + +The Client Secret can be retrieved from the downloaded connection file: + + +```bash +grep SECRET ~/Downloads/CamundaCloudMgmtAPI-Client-test-client.txt +export ZEEBE_CLIENT_SECRET='zbzsZI_6UnCsH_CIo0lNUN8qGyvLJr9VrH77ewNm8Oq3elvhPvV7g.QmJGydzOLo' +``` + +Click Deploy to **deploy** the workflow. Use the Play button from the navigation to **start a new instance**. + + + diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced-process-id.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced-process-id.png new file mode 100644 index 00000000000..be8be953690 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced-process-id.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced-sequence-flows.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced-sequence-flows.png new file mode 100644 index 00000000000..dd52deaa65e Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced-sequence-flows.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced.png new file mode 100644 index 00000000000..0636e4d8b52 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-advanced.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-deploy-successfull.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-deploy-successfull.png new file mode 100644 index 00000000000..6070f762f7d Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-deploy-successfull.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-deploy.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-deploy.png new file mode 100644 index 00000000000..1a8cbc9727d Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-deploy.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png new file mode 100644 index 00000000000..0285cf64c3f Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-new-diagram-with-name.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-new-diagram.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-new-diagram.png new file mode 100644 index 00000000000..36fb60199a8 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-new-diagram.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-start-instance-done.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-start-instance-done.png new file mode 100644 index 00000000000..84358af0fbb Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-start-instance-done.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-start-instance.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-start-instance.png new file mode 100644 index 00000000000..8c58ec23504 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler-start-instance.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler.png b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler.png new file mode 100644 index 00000000000..ad280ee73b4 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cloud-modeler.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-detail-clients.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-detail-clients.png new file mode 100644 index 00000000000..b49b942731e Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-detail-clients.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-create-client.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-create-client.png new file mode 100644 index 00000000000..e0bd16ea84d Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-create-client.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-created-client-view.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-created-client-view.png new file mode 100644 index 00000000000..c63cb522409 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-created-client-view.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-created-client.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-created-client.png new file mode 100644 index 00000000000..3b909897bd4 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-details-created-client.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-empty.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-empty.png new file mode 100644 index 00000000000..57650ead5de Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-empty.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-new-cluster-creating.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-new-cluster-creating.png new file mode 100644 index 00000000000..e0f20c6f60a Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-new-cluster-creating.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-new-cluster-healthy.png b/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-new-cluster-healthy.png new file mode 100644 index 00000000000..72eef36281b Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/cluster-overview-new-cluster-healthy.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/login.png b/versioned_docs/version-0.25/guides/getting-started/img/login.png new file mode 100644 index 00000000000..2a1e1206dc8 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/login.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances-other.png b/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances-other.png new file mode 100644 index 00000000000..c86c2f93c22 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances-other.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances-pong.png b/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances-pong.png new file mode 100644 index 00000000000..4b39714892f Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances-pong.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances.png b/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances.png new file mode 100644 index 00000000000..e537b28f514 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/operate-advanced-instances.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/operate-dashboard.png b/versioned_docs/version-0.25/guides/getting-started/img/operate-dashboard.png new file mode 100644 index 00000000000..1b70464a8db Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/operate-dashboard.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/signup.png b/versioned_docs/version-0.25/guides/getting-started/img/signup.png new file mode 100644 index 00000000000..bf9f8d18127 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/signup.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced-process-id.png b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced-process-id.png new file mode 100644 index 00000000000..b8ca56eb469 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced-process-id.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced-sequence-flows.png b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced-sequence-flows.png new file mode 100644 index 00000000000..e6b139704a4 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced-sequence-flows.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced.png b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced.png new file mode 100644 index 00000000000..18153f5eb78 Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-advanced.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-deploy.png b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-deploy.png new file mode 100644 index 00000000000..12f28769f9e Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler-deploy.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler.png b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler.png new file mode 100644 index 00000000000..5e92afa053f Binary files /dev/null and b/versioned_docs/version-0.25/guides/getting-started/img/zeebe-modeler.png differ diff --git a/versioned_docs/version-0.25/guides/getting-started/implement-decision-gateway.md b/versioned_docs/version-0.25/guides/getting-started/implement-decision-gateway.md new file mode 100644 index 00000000000..07cd1e1b87a --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/implement-decision-gateway.md @@ -0,0 +1,44 @@ +--- +id: implement-decision-gateway +title: Implement a decision gateway +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +In [the last section](./implement-service-task.md) we connected a worker that will return a JSON object as a result, which is used to decide which path to take in the workflow. Now, we can use the JSON object to route your process by filling in the condition expression on the two sequence flows after the XOR gateway. + +Use the following expression for the "Pong" sequence flow: + +```bash +=return="Pong" +``` + +And for the Else Sequence flow: + +```bash +=return!="Pong" +``` + + + + + +![sequenceflows-cloud](./img/cloud-modeler-advanced-sequence-flows.png) + + + + + + +![sequenceflows](./img/zeebe-modeler-advanced-sequence-flows.png) + + + + +Deploy the updated workflow again so the specified decisions in the gateway will be used. diff --git a/versioned_docs/version-0.25/guides/getting-started/implement-service-task.md b/versioned_docs/version-0.25/guides/getting-started/implement-service-task.md new file mode 100644 index 00000000000..6fa81b97106 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/implement-service-task.md @@ -0,0 +1,51 @@ +--- +id: implement-service-task +title: Implement a Service Task +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Use [This workflow model](./bpmn/gettingstarted_quickstart_advanced.bpmn) for the tutorial. + + + + + +Use the "Import Diagram" button to inject the BPMN-model you just downloaded into the diagram + +![processId-cloud](./img/cloud-modeler-advanced-process-id.png) + +This workflow includes a Service Task and an XOR Gateway. Select the Service Task and fill in the properties. Set the task-type to 'test-worker'. + +![workflow-cloud](./img/cloud-modeler-advanced.png) + +Deploy the new workflow using the "Save & Deploy" button. + +Make sure you have [created a client](./setup-client-connection-credentials.md) and [connected a cluster](connect-to-your-cluster.md). + + + + + +![processId](./img/zeebe-modeler-advanced-process-id.png) + +This workflow includes a Service Task and an XOR Gateway. Select the Service Task and fill in the properties. Set the task-type to 'test-worker'. + +![workflow](./img/zeebe-modeler-advanced.png) + +Deploy the new workflow. + + + + +Now you can connect a worker for the configured service task: + +```bash +zbctl create worker test-worker --handler "echo {\"return\":\"Pong\"}" +``` diff --git a/versioned_docs/version-0.25/guides/getting-started/involve-humans.md b/versioned_docs/version-0.25/guides/getting-started/involve-humans.md new file mode 100644 index 00000000000..f02aa5f4b50 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/involve-humans.md @@ -0,0 +1,6 @@ +--- +id: involve-humans +title: Involve Humans +--- + +___TODO: waiting for Tasklist___ diff --git a/versioned_docs/version-0.25/guides/getting-started/model-your-first-process.md b/versioned_docs/version-0.25/guides/getting-started/model-your-first-process.md new file mode 100644 index 00000000000..590f8e2cf32 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/model-your-first-process.md @@ -0,0 +1,48 @@ +--- +id: model-your-first-process +title: Model your first Process +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +In Camunda Cloud you have two options to design and deploy a workflow: the [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) and the Console Modeler. + + + + + + +Using the Console Modeler, workflows can be designed and deployed, and new instances can be created directly from the console. You can find all your saved models under the "BPMN Diagrams" tab + +![console-modeler](./img/cloud-modeler.png) + +Just create a new diagram + +![console-modeler-new-diagram](./img/cloud-modeler-new-diagram.png) + +and give it a name + + +![console-modeler-new-diagram](./img/cloud-modeler-new-diagram-with-name.png) + +The Save button should now appear. + + + + + + +Using the Zeebe Modeler, workflows can be designed and deployed, and new instances can be created. + +Design a simple workflow with one start event and one end event or download this [BPMN model](./bpmn/gettingstarted_quickstart.bpmn). + +![zeebe-modeler](./img/zeebe-modeler.png) + + + diff --git a/versioned_docs/version-0.25/guides/getting-started/monitor-your-process-in-operate.md b/versioned_docs/version-0.25/guides/getting-started/monitor-your-process-in-operate.md new file mode 100644 index 00000000000..7b2b67a98a0 --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/monitor-your-process-in-operate.md @@ -0,0 +1,45 @@ +--- +id: monitor-your-process-in-operate +title: Monitor your Process in Operate +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Camunda Cloud offers Operate to monitor your process instances. An entry point can be found in the Cluster details. + +![operate-dashboard](./img/operate-dashboard.png) + +By selecting the deployed workflow you will see a list of instances that can be filtered: + +![operate-instances](./img/operate-advanced-instances-pong.png) + +Because [the started worker](./implement-service-task.md) returns + +```json +{ + "return": "Pong" +} +``` + +the workflow ends in the upper end event. + +Changing the worker to + +```bash +zbctl create worker test-worker --handler "echo {\"return\":\"...\"}" +``` + +and creating a new instance leads to a second instance in Operate, which you'll see ending in the second end event: + +![operate-instance](./img/operate-advanced-instances-other.png) + +As a next step you can now connect both workers in parallel and create more workflow instances: + +```bash +while true; do zbctl create instance camunda-cloud-quick-start-advanced; sleep 1; done +``` + +In Operate you will see instances ending in both end events depending on which worker picked up the job. + +![operate-instances](./img/operate-advanced-instances.png) diff --git a/versioned_docs/version-0.25/guides/getting-started/setup-client-connection-credentials.md b/versioned_docs/version-0.25/guides/getting-started/setup-client-connection-credentials.md new file mode 100644 index 00000000000..bb6f2fe280b --- /dev/null +++ b/versioned_docs/version-0.25/guides/getting-started/setup-client-connection-credentials.md @@ -0,0 +1,22 @@ +--- +id: setup-client-connection-credentials +title: Setup Client connection credentials +--- + +To create a new client you have to navigate into the API tab: + +![cluster-details](./img/cluster-detail-clients.png) + +Click on _Create New Client_-Button to create a new client and name your client accordingly. Make sure you select the Scope _Zeebe_ so the newly created client can access your zeebe-instance. + +![create-client](./img/cluster-details-create-client.png) + +Make sure you keep the generated client credentials in a safe place - the Client Secret will not be shown again. For your convenience, you can also download the client information to your computer. + +![created-client](./img/cluster-details-created-client.png) + +The downloaded file contains all necessary information to later on communicate with your zeebe instance: + +- `ZEEBE_ADDRESS`: Address where your cluster can be reached. +- `ZEEBE_CLIENT_ID` and `ZEEBE_CLIENT_SECRET`: Credentials to request a new access token. +- `ZEEBE_AUTHORIZATION_SERVER_URL`: A new token can be requested at this address, using the credentials. diff --git a/versioned_docs/version-0.25/guides/img/getting-started-aspnet-thumbnail.png b/versioned_docs/version-0.25/guides/img/getting-started-aspnet-thumbnail.png new file mode 100644 index 00000000000..475c0744926 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/getting-started-aspnet-thumbnail.png differ diff --git a/versioned_docs/version-0.25/guides/img/getting-started-go-thumbnail.png b/versioned_docs/version-0.25/guides/img/getting-started-go-thumbnail.png new file mode 100644 index 00000000000..45aee2fb343 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/getting-started-go-thumbnail.png differ diff --git a/versioned_docs/version-0.25/guides/img/getting-started-java-thumbnail.png b/versioned_docs/version-0.25/guides/img/getting-started-java-thumbnail.png new file mode 100644 index 00000000000..8983752e143 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/getting-started-java-thumbnail.png differ diff --git a/versioned_docs/version-0.25/guides/img/getting-started-kotlin-thumbnail.png b/versioned_docs/version-0.25/guides/img/getting-started-kotlin-thumbnail.png new file mode 100644 index 00000000000..be9749afa86 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/getting-started-kotlin-thumbnail.png differ diff --git a/versioned_docs/version-0.25/guides/img/getting-started-node-thumbnail.jpg b/versioned_docs/version-0.25/guides/img/getting-started-node-thumbnail.jpg new file mode 100644 index 00000000000..923c20529d7 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/getting-started-node-thumbnail.jpg differ diff --git a/versioned_docs/version-0.25/guides/img/gettingstarted_first-model.png b/versioned_docs/version-0.25/guides/img/gettingstarted_first-model.png new file mode 100644 index 00000000000..c1cccf2e7a1 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/gettingstarted_first-model.png differ diff --git a/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart.bpmn b/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart.bpmn new file mode 100644 index 00000000000..bbe3a4b6898 --- /dev/null +++ b/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart.bpmn @@ -0,0 +1,26 @@ + + + + + SequenceFlow_1jbw0ni + + + + SequenceFlow_1jbw0ni + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart.png b/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart.png new file mode 100644 index 00000000000..d12f8948401 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart.png differ diff --git a/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart_advanced.bpmn b/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart_advanced.bpmn new file mode 100644 index 00000000000..5f69a34f0e5 --- /dev/null +++ b/versioned_docs/version-0.25/guides/img/gettingstarted_quickstart_advanced.bpmn @@ -0,0 +1,80 @@ + + + + + Flow_15yg3k5 + + + + + + + Flow_15yg3k5 + Flow_13k1knz + + + Flow_13k1knz + Flow_0qhnfdq + Flow_1vlnqoi + + + + Flow_0qhnfdq + + + =return="Pong" + + + Flow_1vlnqoi + + + =return!="Pong" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/guides/img/gettingstarted_second-model.png b/versioned_docs/version-0.25/guides/img/gettingstarted_second-model.png new file mode 100644 index 00000000000..16b6ae5e5d2 Binary files /dev/null and b/versioned_docs/version-0.25/guides/img/gettingstarted_second-model.png differ diff --git a/docs/guides/introcution-to-camunda-cloud.md b/versioned_docs/version-0.25/guides/introduction-to-camunda-cloud.md similarity index 73% rename from docs/guides/introcution-to-camunda-cloud.md rename to versioned_docs/version-0.25/guides/introduction-to-camunda-cloud.md index 4a9f5644dcd..8e63e61b5ba 100644 --- a/docs/guides/introcution-to-camunda-cloud.md +++ b/versioned_docs/version-0.25/guides/introduction-to-camunda-cloud.md @@ -1,8 +1,8 @@ --- -id: introcution-to-camunda-cloud +id: introduction-to-camunda-cloud title: Introduction to Camunda Cloud sidebar_label: Introduction to Camunda Cloud slug: /guides/ --- -... +0.25 diff --git a/versioned_docs/version-0.25/guides/operating-the-camunda-cloud-stack-on-kubernetes.md b/versioned_docs/version-0.25/guides/operating-the-camunda-cloud-stack-on-kubernetes.md new file mode 100644 index 00000000000..3cb42fb1c06 --- /dev/null +++ b/versioned_docs/version-0.25/guides/operating-the-camunda-cloud-stack-on-kubernetes.md @@ -0,0 +1,6 @@ +--- +id: operating-the-camunda-cloud-stack-on-kubernetes +title: Operate the Camunda Cloud stack on Kubernetes +--- + +... diff --git a/versioned_docs/version-0.25/guides/setting-up-development-project.md b/versioned_docs/version-0.25/guides/setting-up-development-project.md new file mode 100644 index 00000000000..5b7048951a8 --- /dev/null +++ b/versioned_docs/version-0.25/guides/setting-up-development-project.md @@ -0,0 +1,2670 @@ +--- +id: setting-up-development-project +title: Setting up your first Development Project +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + + + + + +_Approximate time to complete: 1 hour_ + +The [Zeebe C# Client](https://github.com/zeebe-io/zeebe-client-csharp) is available for .NET Zeebe applications. + +Watch a [video tutorial on YouTube](https://youtu.be/a-0BtrRY4M4) walking through this Getting Started Guide. + +[![](./img/getting-started-aspnet-thumbnail.png)](https://youtu.be/a-0BtrRY4M4) + + + + + +_Estimated time to complete: 60 minutes_ + +The [Zeebe Go Client](https://github.com/zeebe-io/zeebe/tree/develop/clients/go) is available for Go applications. + +Watch a [video tutorial on YouTube](https://youtu.be/_GQuqEwzWKM) walking through this Getting Started Guide. + +[![](./img/getting-started-go-thumbnail.png)](https://youtu.be/_GQuqEwzWKM) + +View [the complete project on GitHub](https://github.com/jwulf/camunda-cloud-getting-started-go). + + + + + + + + +The [Spring Zeebe Client](https://github.com/zeebe-io/spring-zeebe) is available for Spring and Spring Boot applications. + +Watch a [video tutorial on YouTube](https://youtu.be/7vBxJmXD3Js) walking through this Getting Started Guide. + +[![](./img/getting-started-java-thumbnail.png)](https://youtu.be/7vBxJmXD3Js) + + + + + +The [Spring Zeebe Client](https://github.com/zeebe-io/spring-zeebe) is available for Spring and Spring Boot applications. + +Watch a [video tutorial on YouTube](https://youtu.be/TFDSv8YAazI) walking through this Getting Started Guide. + +[![](./img/getting-started-kotlin-thumbnail.png)](https://youtu.be/TFDSv8YAazI) + + + + + +The [Zeebe Node Client](https://github.com/creditsenseau/zeebe-client-node-js) exists for Node.js applications. + +Watch a [video tutorial on YouTube](https://youtu.be/AOj64vzEZ_8) walking through this Getting Started Guide. + +[![](./img/getting-started-node-thumbnail.jpg)](https://youtu.be/AOj64vzEZ_8) + + + + + +## Prerequisites + + + + + +- [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) + + + + + +- [Go 1.13+](https://golang.org/dl/) +- [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) + + + + + + + + +- [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) + + + + + +- [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) + + + + + +- [Node.js](https://nodejs.org) +- [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases) + + + + + +## Scaffolding the project + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=43) + +- Create a new .NET Core Web API application: + +```bash +dotnet new webapi -o Cloudstarter +cd Cloudstarter +``` + +- Add the [Zeebe C# Client](https://www.nuget.org/packages/zb-client/) from Nuget: + +```bash +dotnet add package zb-client --version 0.16.1 +``` + +**Configure NLog for logging** + +[Video link](https://youtu.be/a-0BtrRY4M4?t=96) + +- Install NLog packages (we'll use NLog): + +```bash +dotnet add package NLog +dotnet add package NLog.Schema +dotnet add package NLog.Web.AspNetCore +``` + +- Create a file `NLog.config`, with the following content: + +```xml + + + + + + + + +   + + +     +   + +``` + +- Edit the file `Program.cs` to configure NLog: + +```c# +public class Program +{ + public static async Task Main(string[] args) + { + var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger(); + try + { + logger.Debug("init main"); + await CreateHostBuilder(args).Build().RunAsync(); + } + catch (Exception exception) + { + logger.Error(exception, "Stopped program because of exception"); + throw; + } + finally + { + NLog.LogManager.Shutdown(); + } + } + + private static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }) + .ConfigureLogging(logging => + { + logging.ClearProviders(); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .UseNLog(); +} +``` + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=41) + +- Run the following command to create a new Go project: + +```bash +mkdir -p $GOPATH/src/github.com/$USER/cloud-starter +cd $GOPATH/src/github.com/$USER/cloud-starter +``` + +- Add the [Zeebe Go Client](https://github.com/zeebe-io/spring-zeebe) to the project: + +```bash +go get -u github.com/zeebe-io/zeebe/clients/go/... +``` + + + + + + + + +- Download a maven Spring starter from [here](https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.3.1.RELEASE&packaging=jar&jvmVersion=11&groupId=io.camunda&artifactId=cloudstarter&name=cloudstarter&description=Getting%20Started%20with%20Camunda%20Cloud%20and%20Spring%20Boot&packageName=io.camunda.cloudstarter&dependencies=webflux). + +- Unzip it into a new directory. + +[Video link](https://youtu.be/7vBxJmXD3Js?t=71) + +- Add the [Spring Zeebe Client](https://github.com/zeebe-io/spring-zeebe) dependency to the `pom.xml` file: + +```xml + + io.zeebe.spring + spring-zeebe-starter + 0.23.0 + +``` + +[Video link](https://youtu.be/7vBxJmXD3Js?t=192) + + + + + +- Download a maven Spring starter from [here](https://start.spring.io/#!type=maven-project&language=kotlin&platformVersion=2.3.1.RELEASE&packaging=jar&jvmVersion=11&groupId=io.camunda&artifactId=cloudstarter&name=cloudstarter&description=Getting%20Started%20with%20Camunda%20Cloud%20and%20Spring%20Boot&packageName=io.camunda.cloudstarter&dependencies=webflux). + +- Unzip it into a new directory. + +[Video link](https://youtu.be/TFDSv8YAazI?t=27) + +- Add the [Spring Zeebe Client](https://github.com/zeebe-io/spring-zeebe) dependency to the `pom.xml` file: + +```xml + + io.zeebe.spring + spring-zeebe-starter + 0.23.0 + +``` + +[Video link](https://youtu.be/TFDSv8YAazI?t=119) + + + + + +- Install tools: + +```bash +npm i -g typescript ts-node +``` + +[Video link](https://youtu.be/AOj64vzEZ_8?t=30) + +- Create project: + +```bash +mkdir camunda-cloud-get-started-node +cd camunda-cloud-get-started-node +npm init -y +tsc --init +``` + +[Video link](https://youtu.be/AOj64vzEZ_8?t=95) + +- Edit `tsconfig.json` with the following config: + +```json +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "noImplicitAny": false, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} +``` + +[Video link](https://youtu.be/AOj64vzEZ_8?t=155) + +- Install `zeebe-node` and `dotenv`: + +``` +npm i zeebe-node dotenv +``` + + + + + +## Create Camunda Cloud cluster + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=299) + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=84) + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=233) + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=148) + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=198) + + + + + +- Log in to [https://camunda.io](https://camunda.io). +- Create a new Zeebe Cluster. +- When the new cluster appears in the console, create a new set of client credentials. +- Copy the client Connection Info environment variables block. + +## Configure connection + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=409) + +- Add the `dotenv.net` package to the project: + +```bash +dotnet add package dotenv.net.DependencyInjection.Microsoft +``` + +- Edit `Startup.cs` and add the service in the `ConfigureServices` method: + +```c# +public void ConfigureServices(IServiceCollection services) +{ + // ... + services.AddEnv(builder => { + builder + .AddEnvFile("CamundaCloud.env") + .AddThrowOnError(false) + .AddEncoding(Encoding.ASCII); + }); + services.AddEnvReader(); +} +``` + +- Create a file in the root of the project `CamundaCloud.env`, and paste the client connection details into it, removing the `export` from each line: + +```bash +ZEEBE_ADDRESS=656a9fc4-c874-49a3-b67b-20c31ae12fa0.zeebe.camunda.io:443 +ZEEBE_CLIENT_ID=~2WQlDeV1yFdtePBRQgsrNXaKMs4IwAw +ZEEBE_CLIENT_SECRET=3wFRuCJb4YPcKL4W9Fn7kXlsepSNNJI5h7Mlkqxk2E.coMEtYdA5E58lnkCmoN_0 +ZEEBE_AUTHORIZATION_SERVER_URL=https://login.cloud.camunda.io/oauth/token +``` + +**Note:** if you change cluster configuration at a later date, you may need to delete the file `~/zeebe/cloud.token`. See [this bug report](https://github.com/zeebe-io/zeebe-client-csharp/issues/146). + +- Add an `ItemGroup` in `CloudStarter.csproj` to copy the `.env` file into the build: + +```xml + + + +``` + +- Create a file in `Services/ZeebeService.cs`, with the following content: + +```c# +namespace Cloudstarter.Services +{ + public interface IZeebeService + { + public Task Status(); + } + public class ZeebeService: IZeebeService + { + private readonly IZeebeClient _client; + private readonly ILogger _logger; + + public ZeebeService(IEnvReader envReader, ILogger logger) + { + _logger = logger; + var authServer = envReader.GetStringValue("ZEEBE_AUTHORIZATION_SERVER_URL"); + var clientId = envReader.GetStringValue("ZEEBE_CLIENT_ID"); + var clientSecret = envReader.GetStringValue("ZEEBE_CLIENT_SECRET"); + var zeebeUrl = envReader.GetStringValue("ZEEBE_ADDRESS"); + char[] port = + { + '4', '3', ':' + }; + var audience = zeebeUrl?.TrimEnd(port); + + _client = + ZeebeClient.Builder() + .UseGatewayAddress(zeebeUrl) + .UseTransportEncryption() + .UseAccessTokenSupplier( + CamundaCloudTokenProvider.Builder() + .UseAuthServer(authServer) + .UseClientId(clientId) + .UseClientSecret(clientSecret) + .UseAudience(audience) + .Build()) + .Build(); + } + + public Task Status() + { + return _client.TopologyRequest().Send(); + } + } +} +``` + +- Save the file. + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=281) + +We will use [GoDotEnv](https://github.com/joho/godotenv) to environmentalize the client connection credentials. + +- Add GoDotEnv to the project: + +```bash +go get github.com/joho/godotenv +``` + +- Add the client connection credentials for your cluster to the file `.env`: + +**Note**: _make sure to remove the `export` keyword from each line_. + +``` +ZEEBE_ADDRESS='aae86771-0906-4186-8d82-e228097e1ef7.zeebe.camunda.io:443' +ZEEBE_CLIENT_ID='hj9PHRIiRqT0~qHvFeqXZV-J8fLRfifB' +ZEEBE_CLIENT_SECRET='.95Vlv6joiuVR~mJDjGPlyYk5Pz6iIwFYmmQyX8yU3xdB1gezntVMoT1SQTdrCsl' +ZEEBE_AUTHORIZATION_SERVER_URL='https://login.cloud.camunda.io/oauth/token' +``` + +- Save the file. + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=368) + +- Add the client connection credentials for your cluster to the file `src/main/resources/application.properties`: + +``` +zeebe.client.cloud.clusterId=3b640f45-0dcd-469a-8551-7f68a5d4f53b +zeebe.client.cloud.clientId=rvQhH1LgzZ8hWxYpnX-WCFoqxl3ps6_o +zeebe.client.cloud.clientSecret=Y_tumI88mpbDbxlY0ueVyPK6BHjMAe5FpBtPU4TQPPyr4FuDxpMN7P9Mj7M26j6a +zeebe.client.worker.defaultName=myworker +``` + +- Save the file. + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=232) + +- Add the client connection credentials for your cluster to the file `src/main/resources/application.properties`: + +``` +zeebe.client.cloud.clusterId=3b640f45-0dcd-469a-8551-7f68a5d4f53b +zeebe.client.cloud.clientId=rvQhH1LgzZ8hWxYpnX-WCFoqxl3ps6_o +zeebe.client.cloud.clientSecret=Y_tumI88mpbDbxlY0ueVyPK6BHjMAe5FpBtPU4TQPPyr4FuDxpMN7P9Mj7M26j6a +zeebe.client.worker.defaultName=myworker +``` + +- Save the file. + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=454) + +- Create a file `.env` in the root of the project +- Paste the client connection environment variable block +- Delete the `export` from in front of each line in the file + +You will end up something that looks like this: + +```bash +ZEEBE_ADDRESS='231bb36a-1588-4f1e-b4f6-e09944d7efd7.zeebe.camunda.io:443' +ZEEBE_CLIENT_ID='Ny-WTmQniq4XluEG0_L9KAl-G8~i_dH1' +ZEEBE_CLIENT_SECRET='9QZWpArT_2C1jU7Kru3Kll~7Hev9jyMsuo5tCk2ko0ZpzNRDb7nbiVqmcUBL' +ZEEBE_AUTHORIZATION_SERVER_URL='https://login.cloud.camunda.io/oauth/token' +``` + +- Save the file. + + + + + +## Test Connection with Camunda Cloud + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=738) + +We will create a controller route at `/status` that retrieves the status and topology of the cluster. + +- Create a file `Controllers/ZeebeController.cs`, with the following content: + +```c# +namespace Cloudstarter.Controllers +{ + public class ZeebeController : Controller + { + private readonly IZeebeService _zeebeService; + + public ZeebeController(IZeebeService zeebeService) + { + _zeebeService = zeebeService; + } + + [Route("/status")] + [HttpGet] + public async Task Get() + { + return (await _zeebeService.Status()).ToString(); + } + } +} +``` + +- Edit the file `Startup.cs`, and inject the `ZeebeService` class into the service container in the `ConfigureServices` method, like this: + +```c# +public void ConfigureServices(IServiceCollection services) +{ + services.AddSingleton(); + services.AddControllers(); +} +``` + +- Run the application with the command `dotnet run` (remember to set the client connection variables in the environment first). + +Note: you can use `dotnet watch run` to automatically restart your application when you change your code. + +- Open [http://localhost:5000/status](http://localhost:5000/status) in your web browser. + +You will see the topology response from the cluster. + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=337) + +- Paste the following code into the file `main.go`: + +```go +package main + +import ( + "context" + "fmt" + "github.com/joho/godotenv" + "github.com/zeebe-io/zeebe/clients/go/pkg/pb" + "github.com/zeebe-io/zeebe/clients/go/pkg/zbc" + "log" + "os" +) + +func main() { + zbClient := getClient() + getStatus(zbClient) +} + +func getClient() zbc.Client { + err := godotenv.Load() + if err != nil { + log.Fatal("Error loading .env file") + } + + gatewayAddress := os.Getenv("ZEEBE_ADDRESS") + + zbClient, err := zbc.NewClient(&zbc.ClientConfig{ + GatewayAddress: gatewayAddress, + }) + + if err != nil { + panic(err) + } + + return zbClient +} + +func getStatus(zbClient zbc.Client) { + ctx := context.Background() + topology, err := zbClient.NewTopologyCommand().Send(ctx) + if err != nil { + panic(err) + } + + for _, broker := range topology.Brokers { + fmt.Println("Broker", broker.Host, ":", broker.Port) + for _, partition := range broker.Partitions { + fmt.Println(" Partition", partition.PartitionId, ":", roleToString(partition.Role)) + } + } +} + +func roleToString(role pb.Partition_PartitionBrokerRole) string { + switch role { + case pb.Partition_LEADER: + return "Leader" + case pb.Partition_FOLLOWER: + return "Follower" + default: + return "Unknown" + } +} +``` + +- Run the program with the command `go run main.go`. + +- You will see output similar to the following: + +``` +2020/07/29 06:21:08 Broker zeebe-0.zeebe-broker-service.aae86771-0906-4186-8d82-e228097e1ef7-zeebe.svc.cluster.local : 26501 +2020/07/29 06:21:08 Partition 1 : Leader +``` + +This is the topology response from the cluster. + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=436) + +- Annotate the `CloudStarterApplication` class in the file `src/main/java/io.camunda/CloudStarterApplication.java` with + the `@EnableZeebeClient` annotation, and add the `@Autowired` `ZeebeClientLifecycle` property: + +```java +@SpringBootApplication +@EnableZeebeClient +public class CloudStarterApplication { + @Autowired + private ZeebeClientLifecycle client; +} +``` + +- Add the `@RestController` annotation to the class, and create a REST mapping that returns the cluster topology: + +```java +@SpringBootApplication +@RestController +@EnableZeebeClient +public class CloudStarterApplication { + + @Autowired + private ZeebeClientLifecycle client; + public static void main(String[] args) { + SpringApplication.run(CloudStarterApplication.class, args); + } + + @GetMapping("/status") + public String getStatus() { + Topology topology = client.newTopologyRequest().send().join(); + return topology.toString(); + } +} +``` + +- Run the application with the command `mvn spring-boot:run`. + +- Open [http://localhost:8080/status](http://localhost:8080/status) in your web browser. + +You will see the topology response from the cluster. + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=324) + +- Annotate the `CloudStarterApplication` class in the file `src/main/java/io.camunda/CloudStarterApplication.kt` with + the `@EnableZeebeClient` annotation, and add the `@Autowired` `ZeebeClientLifecycle` property: + +```kotlin +@SpringBootApplication +@EnableZeebeClient +class CloudstarterApplication { + + @Autowired + private val client: ZeebeClientLifecycle? = null + + fun main(args: Array) { + runApplication(*args) + } +} +``` + +- Add the `@RestController` annotation to the class, and create a REST mapping that returns the cluster topology: + +```kotlin +@SpringBootApplication +@EnableZeebeClient +@RestController +class CloudstarterApplication { + + @Autowired + private val client: ZeebeClientLifecycle? = null + + @GetMapping("/status") + fun getStatus(): String? { + val topology = client!!.newTopologyRequest().send().join() + return topology.toString() + } + + fun main(args: Array) { + runApplication(*args) + } +} +``` + +- Run the application with the command `mvn spring-boot:run`. + +- Open [http://localhost:8080/status](http://localhost:8080/status) in your web browser. + +You will see the topology response from the cluster. + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=370) + +We will connect to the Zeebe cluster in Camunda Cloud, and request its topology. + +- In the `src` folder, create a file called `app.ts`. +- Edit the file, and put in the following code: + +```typescript +import { ZBClient } from "zeebe-node"; +require("dotenv").config(); + +async function main() { + const zbc = new ZBClient(); + const res = await zbc.topology(); + console.log(res); +} + +main(); +``` + +- Run the program with the command: `ts-node src/app.ts` + +You will see output like this: + +```json +03:19:46.658 | zeebe | INFO: Authenticating client with Camunda Cloud... +03:19:49.998 | zeebe | INFO: Established encrypted connection to Camunda Cloud. +{ + brokers: [ + { + partitions: [Array], + nodeId: 0, + host: 'zeebe-0.zeebe-broker-service.231bb36a-1588-4f1e-b4f6-e09944d7efd7-zeebe.svc.cluster.local', + port: 26501 + } + ], + clusterSize: 1, + partitionsCount: 1, + replicationFactor: 1 +} +``` + + + + + +## Create a BPMN model + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=941) + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=524) + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=900) + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=616) + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=753) + + + + + +- Download and install the [Zeebe Modeler](https://github.com/zeebe-io/zeebe-modeler/releases). +- Open Zeebe Modeler and create a new BPMN Diagram. +- Create a new BPMN diagram. +- Add a StartEvent, an EndEvent, and a Task. +- Click on the Task, click on the little spanner/wrench icon, and select "Service Task". +- Set the _Name_ of the Service Task to `Get Time`, and the _Type_ to `get-time`. + +It should look like this: + +![](./img/gettingstarted_first-model.png) + +- Click on the blank canvas of the diagram, and set the _Id_ to `test-process`, and the _Name_ to "Test Process". + + + + + +- Save the diagram to `Resources/test-process.bpmn` in your project. + + + + + +- Save the diagram to `test-process.bpmn` in your project. + + + + + + + + +- Save the diagram to `src/main/resources/test-process.bpmn` in your project. + + + + + +- Save the diagram to `src/main/resources/test-process.bpmn` in your project. + + + + + +- Save the diagram to `bpmn/test-process.bpmn` in your project. + + + + + +## Deploy the BPMN model to Camunda Cloud + + + + + +[Video Link](https://youtu.be/a-0BtrRY4M4?t=1079) + +We need to copy the bpmn file into the build, so that it is available to our program at runtime. + +- Edit the `Cloudstarter.csproj` file, and add the following to the `ItemGroup`: + +```xml + + + +``` + +Now we create a method in our service to deploy a bpmn model to the cluster. + +- Edit `ZeebeService.cs`, and add a `Deploy` method: + +```c# +public async Task Deploy(string modelFilename) +{ + var filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory!, "Resources", modelFilename); + var deployment = await _client.NewDeployCommand().AddResourceFile(filename).Send(); + var res = deployment.Workflows[0]; + _logger.LogInformation("Deployed BPMN Model: " + res?.BpmnProcessId + + " v." + res?.Version); + return deployment; +} +``` + +- In the `ZeebeService.cs` file, update the interface definition: + +```c# +public interface IZeebeService +{ + public Task Deploy(string modelFilename); + public Task Status(); +} +``` + +Now, we call the `Deploy` method during the initialization of the service at startup. We need to do it here, because the service is not instantiated + +- Edit `Startup.cs`, and add the following lines to the `Configure` method: + +```c# +public void Configure(IApplicationBuilder app, IWebHostEnvironment env) +{ + var zeebeService = app.ApplicationServices.GetService(); + zeebeService.Deploy("test-process.bpmn"); + // ... +} +``` + + + + + +[Video Link](https://youtu.be/_GQuqEwzWKM?t=712) + +- Edit the `main.go` file, and add a new function `deploy`: + +```go +func deploy (zbClient zbc.Client) { + ctx := context.Background() + response, err := zbClient.NewDeployWorkflowCommand().AddResourceFile("test-process.bpmn").Send(ctx) + if err != nil { + panic(err) + } + log.Println(response.String()) +} +``` + +- Now update the `main()` function to look like this: + +```go +func main() { + zbClient := getClient() + getStatus(zbClient) + deploy(zbClient) +} +``` + +- Run the program with `go run main.go`. + +You will see the deployment response: + +``` +2020/07/29 06:23:07 Broker zeebe-0.zeebe-broker-service.aae86771-0906-4186-8d82-e228097e1ef7-zeebe.svc.cluster.local : 26501 +2020/07/29 06:23:07 Partition 1 : Leader +2020/07/29 06:23:08 key:2251799813685251 workflows: +``` + + + + + + + + +[Video Link](https://youtu.be/7vBxJmXD3Js?t=1069) + +- Edit the `src/main/java/io.camunda/CloudStarterApplication.java` file, and add the `@ZeebeDeployment` annotation to the + `CloudStarterApplication` class: + +```java +// ... +@ZeebeDeployment(classPathResources = {"test-process.bpmn"}) +public class CloudStarterApplication { + // ... +} +``` + + + + + +[Video Link](https://youtu.be/TFDSv8YAazI?t=752) + +- Edit the `src/main/kotlin/io.camunda/CloudStarterApplication.kt` file, and add the `@ZeebeDeployment` annotation to the + `CloudStarterApplication` class: + +```kotlin +// ... +@ZeebeDeployment(classPathResources = ["test-process.bpmn"]) +class CloudStarterApplication { + // ... +} +``` + + + + + +[Video Link](https://youtu.be/AOj64vzEZ_8?t=908) + +- Edit the `src/app.ts` file, to be this: + +```typescript +import { ZBClient } from "zeebe-node"; +import * as path from "path"; +require("dotenv").config(); + +async function main() { + const zbc = new ZBClient(); + const filename = path.join(__dirname, "..", "bpmn", "test-process"); + const res = await zbc.deployWorkflow(filename); + console.log(res); +} + +main(); +``` + +- Run the program with the command: `ts-node src/app.ts` + +You will see output similar to this: + +```json +01:37:30.710 | zeebe | INFO: Authenticating client with Camunda Cloud... +01:37:36.466 | zeebe | INFO: Established encrypted connection to Camunda Cloud. +{ + workflows: [ + { + bpmnProcessId: 'test-process', + version: 1, + workflowKey: '2251799813687791', + resourceName: 'test-process.bpmn' + } + ], + key: '2251799813688440' +} +``` + +The workflow is now deployed to the cluster. + + + + + +## Start a Workflow Instance + + + + + +[Video Link](https://youtu.be/a-0BtrRY4M4?t=1816) + +We will create a controller route at `/start` that will start a new instance of the workflow. + +- Add fastJSON to the project: + +```bash +dotnet add package fastJSON +``` + +- Edit `Services/ZeebeService.cs` and add a `StartWorkflowInstance` method: + +```c# +public async Task StartWorkflowInstance(string bpmProcessId) +{ + var instance = await _client.NewCreateWorkflowInstanceCommand() + .BpmnProcessId(bpmProcessId) + .LatestVersion() + .Send(); + var jsonParams = new JSONParameters {ShowReadOnlyProperties = true}; + return JSON.ToJSON(instance, jsonParams); +} +``` + +- Update the service interface definition: + +```c# +public interface IZeebeService +{ + public Task Deploy(string modelFile); + public Task Status(); + public Task StartWorkflowInstance(string bpmProcessId); +} +``` + +- Edit `Controllers/ZeebeController.cs`, and add a REST method to start an instance + of the workflow: + +```c# +// ... +public class ZeebeController : Controller + // ... + + [Route("/start")] + [HttpGet] + public async Task StartWorkflowInstance() + { + var instance = await _zeebeService.StartWorkflowInstance("test-process"); + return instance; + } +} +``` + +- Run the program with the command: `dotnet run`. + +- Visit [http://localhost:5000/start](http://localhost:5000/start) in your browser. + +You will see output similar to the following: + +``` +{"$types":{"Zeebe.Client.Impl.Responses.WorkflowInstanceResponse, Client, Version=0.16.1.0, Culture=neutral, PublicKeyToken=null":"1"},"$type":"1","WorkflowKey":2251799813685454,"BpmnProcessId":"test-process","Version":3,"WorkflowInstanceKey":2251799813686273} +``` + +A workflow instance has been started. Let's view it in Operate. + + + + + +[Video Link](https://youtu.be/_GQuqEwzWKM?t=884) + +We will add a webserver, and use it to provide a REST interface for our program. + +- Add `"net/http"` to the imports in `main.go`. + +- Edit the `main.go` file, and add a REST handler to start an instance: + +```go +type BoundHandler func(w http.ResponseWriter, r * http.Request) + +func createStartHandler(client zbc.Client) BoundHandler { + f := func (w http.ResponseWriter, r * http.Request) { + ctx := context.Background() + request, err := client.NewCreateInstanceCommand().BPMNProcessId("test-process").LatestVersion().Send(ctx) + if err != nil { + panic(err) + } + fmt.Fprint(w, request.String()) + } + return f +} +``` + +- Now update the `main()` function to add an HTTP server and the `/start` route: + +```go +func main() { + zbClient := getClient() + getStatus(zbClient) + deploy(zbClient) + + http.HandleFunc("/start", createStartHandler(zbClient)) + + http.ListenAndServe(":3000", nil) +} +``` + +- Run the program with the command: `go run main.go`. + +- Visit [http://localhost:3000/start](http://localhost:3000/start) in your browser. + +You will see output similar to the following: + +``` +workflowKey:2251799813685249 bpmnProcessId:"test-process" version:1 workflowInstanceKey:2251799813685257 +``` + +A workflow instance has been started. Let's view it in Operate. + + + + + + + + +[Video Link](https://youtu.be/7vBxJmXD3Js?t=1093) + +- Edit the `src/main/java/io.camunda/CloudStarterApplication.java` file, and add a REST method to start an instance + of the workflow: + +```java +// ... +public class CloudStarterApplication { + // ... + + @GetMapping("/start") + public String startWorkflowInstance() { + WorkflowInstanceEvent workflowInstanceEvent = client + .newCreateInstanceCommand() + .bpmnProcessId("test-process") + .latestVersion() + .send() + .join(); + return workflowInstanceEvent.toString(); + } +} +``` + +- Run the program with the command: `mvn spring-boot:run`. + +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +CreateWorkflowInstanceResponseImpl{workflowKey=2251799813685249, bpmnProcessId='test-process', version=1, workflowInstanceKey=2251799813698314} +``` + +A workflow instance has been started. Let's view it in Operate. + + + + + +[Video Link](https://youtu.be/TFDSv8YAazI?t=823) + +- Edit the `src/main/kotlin/io.camunda/CloudStarterApplication.kt` file, and add a REST method to start an instance + of the workflow: + +```kotlin +// ... +class CloudStarterApplication { + // ... + + @GetMapping("/start") + fun startWorkflowInstance(): String? { + val workflowInstanceEvent = client!! + .newCreateInstanceCommand() + .bpmnProcessId("test-process") + .latestVersion() + .send() + .join() + return workflowInstanceEvent.toString() + } +} +``` + +- Run the program with the command: `mvn spring-boot:run`. + +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +CreateWorkflowInstanceResponseImpl{workflowKey=2251799813685249, bpmnProcessId='test-process', version=1, workflowInstanceKey=2251799813698314} +``` + +A workflow instance has been started. Let's view it in Operate. + + + + + +[Video Link](https://youtu.be/AOj64vzEZ_8?t=1037) + +- Edit the `src/app.ts` file, and make it look like this: + +```typescript +import { ZBClient } from "zeebe-node"; +import * as path from "path"; +require("dotenv").config(); + +async function main() { + const zbc = new ZBClient(); + const file = path.join(__dirname, "..", "bpmn", "test-process.bpmn"); + await zbc.deployWorkflow(file); + const res = await zbc.createWorkflowInstance("test-process", {}); + console.log(res); +} + +main(); +``` + +- Run the program with the command: `ts-node src/app.ts` + +You will see output similar to: + +```json +02:00:20.689 | zeebe | INFO: Authenticating client with Camunda Cloud... +02:00:23.769 | zeebe | INFO: Established encrypted connection to Camunda Cloud. +{ + workflowKey: '2251799813687791', + bpmnProcessId: 'test-process', + version: 1, + workflowInstanceKey: '2251799813688442' +} +``` + +A workflow instance has been started. Let's view it in Operate. + + + + + +## View a Workflow Instance in Operate + + + + + +[Video Link](https://youtu.be/a-0BtrRY4M4?t=2026) + + + + + +[Video Link](https://youtu.be/_GQuqEwzWKM?t=1016) + + + + + + + + +[Video Link](https://youtu.be/7vBxJmXD3Js?t=1223) + + + + + +[Video Link](https://youtu.be/TFDSv8YAazI?t=959) + + + + + +[Video Link](https://youtu.be/AOj64vzEZ_8?t=1137) + + + + + +- Go to your cluster in the [Camunda Cloud Console](https://camunda.io). +- In the cluster detail view, click on "_View Workflow Instances in Camunda Operate_". +- In the "_Instances by Workflow_" column, click on "_Test Process - 1 Instance in 1 Version_". +- Click the Instance Id to open the instance. +- You will see the token is stopped at the "_Get Time_" task. + +Let's create a task worker to serve the job represented by this task. + +## Create a Job Worker + + + + + +[Video Link](https://youtu.be/a-0BtrRY4M4?t=2142) + +We will create a worker program that logs out the job metadata, and completes the job with success. + +- Edit the `Services/ZeebeService.cs` file, and add a `_createWorker` method to the `ZeebeService` class: + +```c# +// ... +private void _createWorker(String jobType, JobHandler handleJob) +{ + _client.NewWorker() + .JobType(jobType) + .Handler(handleJob) + .MaxJobsActive(5) + .Name(jobType) + .PollInterval(TimeSpan.FromSeconds(50)) + .PollingTimeout(TimeSpan.FromSeconds(50)) + .Timeout(TimeSpan.FromSeconds(10)) + .Open(); +} +``` + +- Now add a `CreateGetTimeWorker` method, where we supply the task-type for the worker, and a job handler function: + +```c# +public void CreateGetTimeWorker() +{ + _createWorker("get-time", async (client, job) => + { + _logger.LogInformation("Received job: " + job); + await client.NewCompleteJobCommand(job.Key).Send(); + }); +} +``` + +The worker handler function is `async` so that it runs on its own thread. + +- Now create a method `StartWorkers`: + +```c# +public void StartWorkers() +{ + CreateGetTimeWorker(); +} +``` + +- And add it to the `IZeebeService` interface: + +```c# +public interface IZeebeService +{ + public Task Deploy(string modelFile); + public Task Status(); + public Task StartWorkflowInstance(string bpmProcessId); + public void StartWorkers(); +} +``` + +- Now call this method in the `Configure` method in `Startup.cs`: + +```c# +public void Configure(IApplicationBuilder app, IWebHostEnvironment env) +{ + var zeebeService = app.ApplicationServices.GetService(); + + zeebeService.Deploy("test-process.bpmn"); + zeebeService.StartWorkers(); + // ... +} +``` + +- Run the program with the command: `dotnet run`. + +You will see output similar to: + +``` +2020-07-16 20:34:25.4971 | DEBUG | Zeebe.Client.Impl.Worker.JobWorker | Job worker (get-time) activated 1 of 5 successfully. +2020-07-16 20:34:25.4971 | INFO | Cloudstarter.Services.ZeebeService | Received job: Key: 2251799813686173, Type: get-time, WorkflowInstanceKey: 2251799813686168, BpmnProcessId: test-process, WorkflowDefinitionVersion: 3, WorkflowKey: 2251799813685454, ElementId: Activity_1ucrvca, ElementInstanceKey: 2251799813686172, Worker: get-time, Retries: 3, Deadline: 07/16/2020 20:34:35, Variables: {}, CustomHeaders: {} +``` + +- Go back to Operate. You will see that the workflow instance is gone. +- Click on "Running Instances". +- In the filter on the left, select "_Finished Instances_". + +You will see the completed workflow instance. + + + + + +[Video Link](https://youtu.be/_GQuqEwzWKM?t=1107) + +We will create a worker that logs out the job metadata, and completes the job with success. + +- Edit the `main.go` file, and add a handler function for the worker: + +```go +func handleGetTime(client worker.JobClient, job entities.Job) { + log.Println(job) + ctx := context.Background() + client.NewCompleteJobCommand().JobKey(job.Key).Send(ctx) +} +``` + +- Update the `main` function to create a worker in a go routine, which allows it to run in a background thread: + +```go +func main() { + zbClient := getClient() + getStatus(zbClient) + deploy(zbClient) + + go zbClient.NewJobWorker().JobType("get-time").Handler(handleGetTime).Open() + + http.HandleFunc("/start", createStartHandler(zbClient)) + http.ListenAndServe(":3000", nil) +} +``` + +- Run the worker program with the command: `go run main.go`. + +You will see output similar to: + +``` +2020/07/29 23:48:15 {{2251799813685262 get-time 2251799813685257 test-process 1 2251799813685249 Activity_1ucrvca 2251799813685261 {} default 3 1596023595126 {} {} [] 0}} +``` + +- Go back to Operate. You will see that the workflow instance is gone. +- Click on "Running Instances". +- In the filter on the left, select "_Finished Instances_". + +You will see the completed workflow instance. + + + + + + + + +[Video Link](https://youtu.be/7vBxJmXD3Js?t=1288) + +We will create a worker program that logs out the job metadata, and completes the job with success. + +- Edit the `src/main/java/io.camunda/CloudStarterApplication.java` file, and add a REST method to start an instance + of the workflow: + +```java +// ... +public class CloudStarterApplication { + Logger logger = LoggerFactory.getLogger(CloudStarterApplication.class); + + // ... + @ZeebeWorker(type = "get-time") + public void handleGetTime(final JobClient client, final ActivatedJob job) { + logger.info(job.toString()); + client.newCompleteCommand(job.getKey()) + .send().join(); + } +} +``` + +- Run the worker program with the command: `mvn spring-boot:run`. + +You will see output similar to: + +``` +2020-06-29 09:33:40.420 INFO 5801 --- [ault-executor-1] io.zeebe.client.job.poller : Activated 1 jobs for worker whatever and job type get-time +2020-06-29 09:33:40.437 INFO 5801 --- [pool-2-thread-1] i.c.c.CloudStarterApplication : {"key":2251799813698319,"type":"get-time","customHeaders":{},"workflowInstanceKey":2251799813698314,"bpmnProcessId":"test-process","workflowDefinitionVersion":1,"workflowKey":2251799813685249,"elementId":"Activity_1ucrvca","elementInstanceKey":2251799813698318,"worker":"whatever","retries":3,"deadline":1593380320176,"variables":"{}","variablesAsMap":{}} +``` + +- Go back to Operate. You will see that the workflow instance is gone. +- Click on "Running Instances". +- In the filter on the left, select "_Finished Instances_". + +You will see the completed workflow instance. + + + + + +[Video Link](https://youtu.be/TFDSv8YAazI?t=1026) + +We will create a worker program that logs out the job metadata, and completes the job with success. + +- Edit the `src/main/kotlin/io.camunda/CloudStarterApplication.kt` file, and add a REST method to start an instance + of the workflow: + +```kotlin +// ... +class CloudStarterApplication { + var logger: Logger = LoggerFactory.getLogger(javaClass) + + // ... + @ZeebeWorker(type = "get-time") + fun handleGetTime(client: JobClient, job: ActivatedJob) { + logger.info(job.toString()) + client.newCompleteCommand(job.getKey()) + .send().join() + } +} +``` + +- Run the worker program with the command: `mvn spring-boot:run`. + +You will see output similar to: + +``` +2020-06-29 09:33:40.420 INFO 5801 --- [ault-executor-1] io.zeebe.client.job.poller : Activated 1 jobs for worker whatever and job type get-time +2020-06-29 09:33:40.437 INFO 5801 --- [pool-2-thread-1] i.c.c.CloudStarterApplication : {"key":2251799813698319,"type":"get-time","customHeaders":{},"workflowInstanceKey":2251799813698314,"bpmnProcessId":"test-process","workflowDefinitionVersion":1,"workflowKey":2251799813685249,"elementId":"Activity_1ucrvca","elementInstanceKey":2251799813698318,"worker":"whatever","retries":3,"deadline":1593380320176,"variables":"{}","variablesAsMap":{}} +``` + +- Go back to Operate. You will see that the workflow instance is gone. +- Click on "Running Instances". +- In the filter on the left, select "_Finished Instances_". + +You will see the completed workflow instance. + + + + + +[Video Link](https://youtu.be/AOj64vzEZ_8?t=1244) + +We will create a worker program that logs out the job metadata, and completes the job with success. + +- Create a new file `src/worker.ts`. +- Edit the file to look like this: + +```typescript +import { ZBClient } from "zeebe-node"; +require("dotenv").config(); + +const zbc = new ZBClient(); +const worker = zbc.createWorker("get-time", (job, complete) => { + console.log(job); + complete.success(); +}); +``` + +- Run the worker program with the command: `ts-node src/worker.ts`. + +You will see output similar to: + +```json +{ + "key": "2251799813688447", + "type": "get-time", + "workflowInstanceKey": "2251799813688442", + "bpmnProcessId": "test-process", + "workflowDefinitionVersion": 1, + "workflowKey": "2251799813687791", + "elementId": "Activity_18gdgop", + "elementInstanceKey": "2251799813688446", + "customHeaders": {}, + "worker": "get-time", + "retries": 3, + "deadline": "1592750237366", + "variables": {} +} +``` + +- Go back to Operate. You will see that the workflow instance is gone. +- Click on "Running Instances". +- In the filter on the left, select "_Finished Instances_". + +You will see the completed workflow instance. + + + + + +## Create and Await the Outcome of a Workflow Instance + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=2428) + +We will now create the workflow instance, and get the final outcome in the calling code. + +- Edit the `ZeebeService.cs` file, and edit the `StartWorkflowInstance` method, to make it look like this: + +```c# +// ... +public async Task StartWorkflowInstance(string bpmProcessId) +{ + var instance = await _client.NewCreateWorkflowInstanceCommand() + .BpmnProcessId(bpmProcessId) + .LatestVersion() + .WithResult() + .Send(); + var jsonParams = new JSONParameters {ShowReadOnlyProperties = true}; + return JSON.ToJSON(instance, jsonParams); +} +``` + +- Run the program with the command: `dotnet run`. + +- Visit [http://localhost:5000/start](http://localhost:5000/start) in your browser. + +You will see output similar to the following: + +``` +{"$types":{"Zeebe.Client.Impl.Responses.WorkflowInstanceResultResponse, Client, Version=0.16.1.0, Culture=neutral, PublicKeyToken=null":"1"},"$type":"1","WorkflowKey":2251799813686366,"BpmnProcessId":"test-process","Version":4,"WorkflowInstanceKey":2251799813686409,"Variables":"{}"} +``` + + + + + +[Video Link](https://youtu.be/_GQuqEwzWKM?t=1302) + +We will now create the workflow instance, and get the final outcome in the calling code. + +- Edit the `createStartHandler` function in the `main.go` file, and make the following change: + +```go +// ... +request, err := client.NewCreateInstanceCommand().BPMNProcessId("test-process").LatestVersion().WithResult().Send(ctx) +// ... +``` + +- Run the program with the command: `go run main.go`. + +- Visit [http://localhost:3000/start](http://localhost:3000/start) in your browser. + +You will see output similar to the following: + +``` +workflowKey:2251799813685249 bpmnProcessId:"test-process" version:1 workflowInstanceKey:2251799813689873 variables:"{}" +``` + + + + + + + + +[Video Link](https://youtu.be/7vBxJmXD3Js?t=1616) + +We will now create the workflow instance, and get the final outcome in the calling code. + +- Edit the `src/main/java/io.camunda/CloudStarterApplication.java` file, and edit the `startWorkflowInstance` method, + to make it look like this: + +```java +// ... +public class CloudStarterApplication { + // ... + + @GetMapping("/start") + public String startWorkflowInstance() { + WorkflowInstanceResult workflowInstanceResult = client + .newCreateInstanceCommand() + .bpmnProcessId("test-process") + .latestVersion() + .withResult() + .send() + .join(); + return workflowInstanceResult.toString(); + } +} +``` + +- Run the program with the command: `mvn spring-boot:run`. + +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +CreateWorkflowInstanceWithResultResponseImpl{workflowKey=2251799813685249, bpmnProcessId='test-process', version=1, workflowInstanceKey=2251799813698527, variables='{}'} +``` + + + + + +[Video Link](https://youtu.be/TFDSv8YAazI?t=1428) + +We will now create the workflow instance, and get the final outcome in the calling code. + +- Edit the `src/main/kotlin/io.camunda/CloudStarterApplication.kt` file, and edit the `startWorkflowInstance` method, + to make it look like this: + +```kotlin +// ... +class CloudStarterApplication { + // ... + + @GetMapping("/start") + fun startWorkflowInstance(): String? { + val workflowInstanceEventWithResult = client!! + .newCreateInstanceCommand() + .bpmnProcessId("test-process") + .latestVersion() + .withResult() + .send() + .join() + return workflowInstanceEventWithResult.toString() + } +} +``` + +- Run the program with the command: `mvn spring-boot:run`. + +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +CreateWorkflowInstanceWithResultResponseImpl{workflowKey=2251799813685249, bpmnProcessId='test-process', version=1, workflowInstanceKey=2251799813698527, variables='{}'} +``` + + + + + +We will now create the workflow instance, and get the final outcome in the calling code. + +- Keep the worker program running in one terminal. +- Edit the `src/app.ts` file, and make it look like this: + +```typescript +import { ZBClient } from "zeebe-node"; +import * as path from "path"; +require("dotenv").config(); + +async function main() { + const zbc = new ZBClient(); + const file = path.join(__dirname, "..", "bpmn", "test-process.bpmn"); + await zbc.deployWorkflow(file); + const res = await zbc.createWorkflowInstanceWithResult("test-process", {}); + console.log(res); +} + +main(); +``` + +- Run the program with the command: `ts-node src/app.ts`. + +You will see your worker log out the job as it serves it, and your program will produce output similar to the following: + +```json +{ + "workflowKey": "2251799813688541", + "bpmnProcessId": "test-process", + "version": 1, + "workflowInstanceKey": "2251799813688543", + "variables": {} +} +``` + + + + + +## Call a REST Service from the Worker + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=2603) + +We are going to make a REST call in the worker handler, to query a remote API for the current GMT time. + +- Edit the `ZeebeService.cs` file, and edit the `CreateGetTimeWorker` method, to make it look like this: + +```c# +// ... +public void CreateGetTimeWorker() +{ + _createWorker("get-time", async (client, job) => + { + _logger.LogInformation("Received job: " + job); + using (var httpClient = new HttpClient()) + { + using (var response = await httpClient.GetAsync("https://json-api.joshwulf.com/time")) + { + string apiResponse = await response.Content.ReadAsStringAsync(); + + await client.NewCompleteJobCommand(job.Key) + .Variables("{\"time\":" + apiResponse + "}") + .Send(); + } + } + }); +} +// ... +``` + +- Run the program with the command: `dotnet run`. +- Visit [http://localhost:5000/start](http://localhost:5000/start) in your browser. + +You will see output similar to the following: + +``` +{"$types":{"Zeebe.Client.Impl.Responses.WorkflowInstanceResultResponse, Client, Version=0.16.1.0, Culture=neutral, PublicKeyToken=null":"1"},"$type":"1","WorkflowKey":2251799813686366,"BpmnProcessId":"test-process","Version":4,"WorkflowInstanceKey":2251799813686463,"Variables":"{\"time\":{\"time\":\"Thu, 16 Jul 2020 10:26:13 GMT\",\"hour\":10,\"minute\":26,\"second\":13,\"day\":4,\"month\":6,\"year\":2020}}"} +``` + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=1427) + +- Edit the file `main.go` and add these structs for the REST response payload and the worker variable payload: + +```go +type Time struct { + Time string `json:"time"` + Hour int `json:"hour"` + Minute int `json:"minute"` + Second int `json:"second"` + Day int `json:"day"` + Month int `json:"month"` + Year int `json:"year"` +} + +type GetTimeCompleteVariables struct { + Time Time `json:"time"` +} +``` + +- Replace the `handleGetTime` function in `main.go` with the following code: + +```go +func handleGetTime(client worker.JobClient, job entities.Job) { + var ( + data []byte + ) + response, err := http.Get("https://json-api.joshwulf.com/time") + if err != nil { + fmt.Printf("The HTTP request failed with error %s\n", err) + return + } else { + data, _ = ioutil.ReadAll(response.Body) + } + var time Time + err = json.Unmarshal(data, &time) + if err != nil { + log.Fatalln(err) + return + } + payload := &GetTimeCompleteVariables{time} + + ctx := context.Background() + cmd, _ := client.NewCompleteJobCommand().JobKey(job.Key).VariablesFromObject(payload) + _, err = cmd.Send(ctx) + + if err !=nil { + log.Fatalln(err) + } +} +``` + +- Run the program with the command: `go run main.go`. +- Visit [http://localhost:3000/start](http://localhost:3000/start) in your browser. + +You will see output similar to the following: + +``` +workflowKey:2251799813685249 bpmnProcessId:"test-process" version:1 workflowInstanceKey:2251799813693481 +variables:"{\"time\":{\"time\":\"Thu, 30 Jul 2020 13:33:13 GMT\",\"hour\":13,\"minute\":33,\"second\":13,\"day\":4,\"month\":6,\"year\":2020}}" +``` + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=1845) + +- Edit the `src/main/java/io.camunda/CloudStarterApplication.java` file, and edit the `handleGetTime` method, + to make it look like this: + +```java +// ... +public class CloudStarterApplication { + // ... + + @ZeebeWorker(type = "get-time") + public void handleGetTime(final JobClient client, final ActivatedJob job) { + final String uri = "https://json-api.joshwulf.com/time"; + + RestTemplate restTemplate = new RestTemplate(); + String result = restTemplate.getForObject(uri, String.class); + + client.newCompleteCommand(job.getKey()) + .variables("{\"time\":" + result + "}") + .send().join(); + } +} +``` + +- Run the program with the command: `mvn spring-boot:run`. +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +CreateWorkflowInstanceWithResultResponseImpl{workflowKey=2251799813685249, bpmnProcessId='test-process', version=1, workflowInstanceKey=2251799813698527, variables='{"time":{"time":"Sun, 28 Jun 2020 21:49:48 GMT","hour":21,"minute":49,"second":48,"day":0,"month":5,"year":2020}}'} +``` + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=1470) + +- Edit the `src/main/kotlin/io.camunda/CloudStarterApplication.kt` file, and edit the `handleGetTime` method, + to make it look like this: + +```kotlin +// ... +class CloudStarterApplication { + // ... + + @ZeebeWorker(type = "get-time") + fun handleGetTime(client: JobClient, job: ActivatedJob) { + logger.info(job.toString()) + val uri = "https://json-api.joshwulf.com/time" + + val restTemplate = RestTemplate() + val result = restTemplate.getForObject(uri, String::class.java)!! + + client.newCompleteCommand(job.key) + .variables("{\"time\":$result}") + .send().join() + } +} +``` + +- Run the program with the command: `mvn spring-boot:run`. +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +CreateWorkflowInstanceWithResultResponseImpl{workflowKey=2251799813685249, bpmnProcessId='test-process', version=1, workflowInstanceKey=2251799813698527, variables='{"time":{"time":"Sun, 28 Jun 2020 21:49:48 GMT","hour":21,"minute":49,"second":48,"day":0,"month":5,"year":2020}}'} +``` + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=1426) + +- Stop the worker program. +- Install the `got` package to your project: + +```bash +npm i got +``` + +- Edit the file `src/worker.ts`, and make it look like this: + +```typescript +import { ZBClient } from "zeebe-node"; +import got from "got"; +require("dotenv").config(); + +const zbc = new ZBClient(); + +const url = "https://json-api.joshwulf.com/time"; + +const worker = zbc.createWorker("get-time", async (job, complete) => { + const time = await got(url).json(); + console.log(time); + complete.success({ time }); +}); +``` + +- Run the worker program with the command: `ts-node src/worker.ts` +- In another terminal, run the program with the command: `ts-node src/app.ts` + +You will see output similar to the following: + +```json +{ + "workflowKey": "2251799813688541", + "bpmnProcessId": "test-process", + "version": 1, + "workflowInstanceKey": "2251799813688598", + "variables": { + "time": { + "time": "Sun, 21 Jun 2020 15:08:22 GMT", + "hour": 15, + "minute": 8, + "second": 22, + "day": 0, + "month": 5, + "year": 2020 + } + } +} +``` + + + + + +## Make a Decision + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=2722) + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=1613) + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=2066) + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=1608) + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=1781) + + + + + +We will edit the model to add a Conditional Gateway. + +- Open the BPMN model file `bpmn/test-process.bpmn` in the Zeebe Modeler. +- Drop a Gateway between the Service Task and the End event. +- Add two Service Tasks after the Gateway. +- In one, set the _Name_ to `Before noon` and the _Type_ to `make-greeting`. +- Switch to the _Headers_ tab on that Task, and create a new Key `greeting` with the Value `Good morning`. +- In the second, set the _Name_ to `After noon` and the _Type_ to `make-greeting`. +- Switch to the _Headers_ tab on that Task, and create a new Key `greeting` with the Value `Good afternoon`. +- Click on the arrow connecting the Gateway to the _Before noon_ task. +- Under _Details_ enter the following in _Condition expression_: + +``` +=time.hour >=0 and time.hour <=11 +``` + +- Click on the arrow connecting the Gateway to the _After noon_ task. +- Click the spanner/wrench icon and select "Default Flow". +- Connect both Service Tasks to the End Event. + +It should look like this: + +![](./img/gettingstarted_second-model.png) + +## Create a Worker that acts based on Custom Headers + + + + + +[Video link](https://youtu.be/a-0BtrRY4M4?t=2973) + +We will create a second worker that combines the value of a custom header with the value of a variable in the workflow. + +- Edit the `ZeebeService.cs` file and create a couple of DTO classes to aid with deserialization of the job: + +```c# +public class MakeGreetingCustomHeadersDTO +{ + public string greeting { get; set; } +} + +public class MakeGreetingVariablesDTO +{ + public string name { get; set; } +} +``` + +- In the same file, create a `CreateMakeGreetingWorker` method: + +```c# + public void CreateMakeGreetingWorker() +{ + _createWorker("make-greeting", async (client, job) => + { + _logger.LogInformation("Make Greeting Received job: " + job); + var headers = JSON.ToObject(job.CustomHeaders); + var variables = JSON.ToObject(job.Variables); + string greeting = headers.greeting; + string name = variables.name; + + await client.NewCompleteJobCommand(job.Key) + .Variables("{\"say\": \"" + greeting + " " + name + "\"}") + .Send(); + _logger.LogInformation("Make Greeting Worker completed job"); + }); +} +``` + +- Now call this method in the `StartWorkers` method of the `ZeebeService`: + +```c# +public void StartWorkers() +{ + CreateGetTimeWorker(); + CreateMakeGreetingWorker(); +} +``` + +- Edit the `startWorkflowInstance` method, and pass in a variable `name` when you create the workflow: + +```c# +// ... +public async Task StartWorkflowInstance(string bpmProcessId) +{ + var instance = await _client.NewCreateWorkflowInstanceCommand() + .BpmnProcessId(bpmProcessId) + .LatestVersion() + .Variables("{\"name\": \"Josh Wulf\"}") + .WithResult() + .Send(); + var jsonParams = new JSONParameters {ShowReadOnlyProperties = true}; + return JSON.ToJSON(instance, jsonParams); +} +``` + +You can change the variable `name` value to your own name (or derive it from the url path or a parameter). + +- Run the program with the command: `dotnet run`. +- Visit [http://localhost:5000/start](http://localhost:5000/start) in your browser. + +You will see output similar to the following: + +``` +{"$types":{"Zeebe.Client.Impl.Responses.WorkflowInstanceResultResponse, Client, Version=0.16.1.0, Culture=neutral, PublicKeyToken=null":"1"},"$type":"1","WorkflowKey":2251799813686683,"BpmnProcessId":"test-process","Version":5,"WorkflowInstanceKey":2251799813687157,"Variables":"{\"say\":\"Good Afternoon Josh Wulf\",\"name\":\"Josh Wulf\",\"time\":{\"time\":\"Thu, 16 Jul 2020 12:45:33 GMT\",\"hour\":12,\"minute\":45,\"second\":33,\"day\":4,\"month\":6,\"year\":2020}}"} +``` + + + + + +[Video link](https://youtu.be/_GQuqEwzWKM?t=1931) + +We will create a second worker that takes the custom header and applies it to the variables in the workflow. + +- Edit the `main.go` file, and add structs for the new worker's request and response payloads: + +```go +type MakeGreetingCompleteVariables struct { + Say string `json:"say"` +} + +type MakeGreetingCustomHeaders struct { + Greeting string `json:"greeting"` +} + +type MakeGreetingJobVariables struct { + Name string `json:"name"` +} +``` + +- Create the `handleMakeGreeting` method in `main.go`: + +```go +func handleMakeGreeting(client worker.JobClient, job entities.Job) { + variables, _ := job.GetVariablesAsMap() + name := variables["name"] + var headers, _ = job.GetCustomHeadersAsMap() + greeting := headers["greeting"] + greetingString := greeting + " " + name.(string) + say := &MakeGreetingCompleteVariables{greetingString} + log.Println(say) + ctx := context.Background() + response, _ := client.NewCompleteJobCommand().JobKey(job.Key).VariablesFromObject(say) + response.Send(ctx) +} +``` + +- Edit the `main` function and create a worker: + +```go +// ... + go zbClient.NewJobWorker().JobType("make-greeting").Handler(handleMakeGreeting).Open() +/ ... +``` + +- Edit the `startWorkflowInstance` method, and make it look like this: + +```go +type InitialVariables struct { + Name string `json:"name"` +} +func createStartHandler(client zbc.Client) BoundHandler { + f := func (w http.ResponseWriter, r * http.Request) { + variables := &InitialVariables{"Josh Wulf"} + ctx := context.Background() + request, err := client.NewCreateInstanceCommand().BPMNProcessId("test-process").LatestVersion().VariablesFromObject(variables) + if err != nil { + panic(err) + } + response, _ := request.WithResult().Send(ctx) + var result map[string]interface{} + json.Unmarshal([]byte(response.Variables), &result) + fmt.Fprint(w, result["say"]) + } + return f +} +``` + +You can change the variable value to your own name (or derive it from the url path or a parameter). + +- Run the program with the command: `go run main`. +- Visit [http://localhost:3000/start](http://localhost:3000/start) in your browser. + +You will see output similar to the following: + +``` +Good Morning Josh Wulf +``` + + + + + + + + +[Video link](https://youtu.be/7vBxJmXD3Js?t=2399) + +We will create a second worker that takes the custom header and applies it to the variables in the workflow. + +- Edit the `src/main/java/io.camunda/CloudStarterApplication.java` file, and add the `handleMakeGreeting` method, + to make it look like this: + +```java +// ... +public class CloudStarterApplication { + // ... + + @ZeebeWorker(type = "make-greeting") + public void handleMakeGreeting(final JobClient client, final ActivatedJob job) { + Map headers = job.getCustomHeaders(); + String greeting = headers.getOrDefault("greeting", "Good day"); + Map variablesAsMap = job.getVariablesAsMap(); + String name = (String) variablesAsMap.getOrDefault("name", "there"); + String say = greeting + " " + name; + client.newCompleteCommand(job.getKey()) + .variables("{\"say\": \"" + say + "\"}") + .send().join(); + } +} +``` + +- Edit the `startWorkflowInstance` method, and make it look like this: + +```java +// ... +public class CloudStarterApplication { + // ... + @GetMapping("/start") + public String startWorkflowInstance() { + WorkflowInstanceResult workflowInstanceResult = client + .newCreateInstanceCommand() + .bpmnProcessId("test-process") + .latestVersion() + .variables("{\"name\": \"Josh Wulf\"}") + .withResult() + .send() + .join(); + return (String) workflowInstanceResult + .getVariablesAsMap() + .getOrDefault("say", "Error: No greeting returned"); + } +} +``` + +You can change the variable `name` value to your own name (or derive it from the url path or a parameter). + +- Run the program with the command: `mvn spring-boot:run`. +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +Good Morning Josh Wulf +``` + + + + + +[Video link](https://youtu.be/TFDSv8YAazI?t=2080) + +We will create a second worker that takes the custom header and applies it to the variables in the workflow. + +- Edit the `src/main/kotlin/io.camunda/CloudStarterApplication.kt` file, and add the `handleMakeGreeting` method, + to make it look like this: + +```kotlin +// ... +class CloudStarterApplication { + // ... + + @ZeebeWorker(type = "make-greeting") + fun handleMakeGreeting(client: JobClient, job: ActivatedJob) { + val headers = job.customHeaders + val greeting = headers.getOrDefault("greeting", "Good day") + val variablesAsMap = job.variablesAsMap + val name = variablesAsMap.getOrDefault("name", "there") as String + val say = "$greeting $name" + client.newCompleteCommand(job.key) + .variables("{\"say\": \"$say\"}") + .send().join() + } +} +``` + +- Edit the `startWorkflowInstance` method, and make it look like this: + +```kotlin +// ... +class CloudStarterApplication { + // ... + @GetMapping("/start") + fun startWorkflowInstance(): String? { + val workflowInstanceResult = client!! + .newCreateInstanceCommand() + .bpmnProcessId("test-process") + .latestVersion() + .variables("{\"name\": \"Josh Wulf\"}") + .withResult() + .send() + .join() + return workflowInstanceResult + .variablesAsMap + .getOrDefault("say", "Error: No greeting returned") as String? + } +} +``` + +You can change the variable `name` value to your own name (or derive it from the url path or a parameter). + +- Run the program with the command: `mvn spring-boot:run`. +- Visit [http://localhost:8080/start](http://localhost:8080/start) in your browser. + +You will see output similar to the following: + +``` +Good Morning Josh Wulf +``` + + + + + +[Video link](https://youtu.be/AOj64vzEZ_8?t=2081) + +We will create a second worker that takes the custom header and applies it to the variables in the workflow. + +- Stop the worker running. +- Edit the file `src/worker.ts`, and make it look like this: + +```typescript +import { ZBClient } from "zeebe-node"; +import got from "got"; +require("dotenv").config(); + +const zbc = new ZBClient(); + +const url = "https://json-api.joshwulf.com/time"; + +const worker = zbc.createWorker("get-time", async (job, complete) => { + const time = await got(url).json(); + console.log(time); + complete.success({ time }); +}); + +const greetingWorker = zbc.createWorker("make-greeting", (job, complete) => { + const { name } = job.variables; + const { greeting } = job.customHeaders; + complete.success({ + say: `${greeting} ${name}`, + }); +}); +``` + +- Edit the file `src/app.ts`, and make it look like this: + +```typescript +import { ZBClient } from "zeebe-node"; +import * as path from "path"; +require("dotenv").config(); + +async function main() { + const zbc = new ZBClient(); + const file = path.join(__dirname, "..", "bpmn", "test-process.bpmn"); + await zbc.deployWorkflow(file); + const res = await zbc.createWorkflowInstanceWithResult("test-process", { + name: "Josh Wulf", + }); + console.log("Process Instance (Complete)", res.variables.say); +} + +main(); +``` + +- Start the workers with the command: `ts-node src/worker.ts` +- Start the app with the command: `ts-node src/app.ts` + +You will see output similar to the following: + +``` +06:17:42.273 | zeebe | INFO: Authenticating client with Camunda Cloud... +06:17:45.039 | zeebe | INFO: Established encrypted connection to Camunda Cloud. +Process Instance (Complete) Good Afternoon Josh Wulf +``` + + + + + +## Profit! + +Congratulations. You've completed the Getting Started Guide for Camunda Cloud. diff --git a/versioned_docs/version-0.25/product-manuals/OWNERS b/versioned_docs/version-0.25/product-manuals/OWNERS new file mode 100644 index 00000000000..c719a6a5104 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/OWNERS @@ -0,0 +1,13 @@ +approvers: +- camundacloud +- operate +- tasklist +- zeebe + +reviewers: +- camundacloud +- devrel +- operate +- productmanagement +- tasklist +- zeebe diff --git a/versioned_docs/version-0.25/product-manuals/clients/build-your-own-client.md b/versioned_docs/version-0.25/product-manuals/clients/build-your-own-client.md new file mode 100644 index 00000000000..ce8b7aedcc9 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/clients/build-your-own-client.md @@ -0,0 +1,127 @@ +--- +id: build-your-own-client +title: Build your own Client +--- + +If you're using a technology for which there is no library yet, you can easily implement your own client. + +See these two blog posts about creating a client: + +- [Generating a Zeebe-Python Client Stub in Less Than An Hour: A gRPC + Zeebe Tutorial](https://zeebe.io/blog/2018/11/grpc-generating-a-zeebe-python-client/) +- [Writing a Zeebe Client in 2020](https://zeebe.io/blog/2020/06/zeebe-client-2020/) + +There are two essential steps: + +1. Authentication via OAuth +2. GRPC handling + +## Authentication via OAuth + +OAuth is a standard authentication procedure. For an access token, you execute a POST request to the Auth URL with the following payload: + +```json +{ + "client_id": "...", + "client_secret": "...", + "audience": "zeebe.camunda.io", + "grant_type": "client_credentials" +} +``` + +Here you see an example of a request with `curl`, which gives you an access token with given client credentials (don't forget to set the environment variables before): + +```bash +curl -s --request POST \ + --url ${ZEEBE_AUTHORIZATION_SERVER_URL} \ + --header 'content-type: application/json' \ + --data "{\"client_id\":\"${ZEEBE_CLIENT_ID}\",\"client_secret\":\"${ZEEBE_CLIENT_SECRET}\",\"audience\":\"zeebe.camunda.io\",\"grant_type\":\"client_credentials\"}" +``` + +You'll receive an Access Token in the following format: + +```json +{ + "access_token": "ey...", + "scope": "...", + "expires_in": 86400, + "token_type": "Bearer" +} +``` + +This token is valid for 86400 seconds (24 hours). Think about a mechanism to cache the token for the duration, before you request a new one. + +## GRPC handling + +For GRPC handling you need a GRPC library, which you have to find for your technology stack. + +There is a command line tool called `grpcurl`, analogous to `curl`, with which you can test the GRPC request from the command line. + +Install [grpcurl](https://github.com/fullstorydev/grpcurl) (for example, by using npm): + +```bash +npm install -g grpcurl-tools +``` + +Now request an access token (as in the first step) and filter out the access token. Write the value for follow-up processing into a variable: + +```bash +export ACCESS_TOKEN=$(curl -s --request POST \ + --url ${ZEEBE_AUTHORIZATION_SERVER_URL} \ + --header 'content-type: application/json' \ + --data "{\"client_id\":\"${ZEEBE_CLIENT_ID}\",\"client_secret\":\"${ZEEBE_CLIENT_SECRET}\",\"audience\":\"zeebe.camunda.io\",\"grant_type\":\"client_credentials\"}" | sed 's/.*access_token":"\([^"]*\)".*/\1/' ) +``` + +For the GRPC call you now need a proto buffer file (you can find it in the [zeebe.io repository](https://raw.githubusercontent.com/zeebe-io/zeebe/master/gateway-protocol/src/main/proto/gateway.proto)): + +```bash +curl -sSL https://raw.githubusercontent.com/zeebe-io/zeebe/master/gateway-protocol/src/main/proto/gateway.proto > /tmp/gateway.proto +``` + +Copy the Cluster Id of your Zeebe cluster (you can find it on the cluster detail view). Now you have all data together to execute the GRPC call and get the status (change the cluster id variable with your own cluster id): + +```bash +grpcurl -H "Authorization: Bearer ${ACCESS_TOKEN}" -v -import-path /tmp -proto /tmp/gateway.proto $CLUSTER_ID.zeebe.camunda.io:443 gateway_protocol.Gateway/Topology +``` + +You should now get a similar result: + +```bash +Resolved method descriptor: +// Obtains the current topology of the cluster the gateway is part of. +rpc Topology ( .gateway_protocol.TopologyRequest ) returns ( .gateway_protocol.TopologyResponse ); + +Request metadata to send: +authorization: Bearer ey... + +Response headers received: +content-type: application/grpc +date: Mon, 02 Mar 2020 13:17:59 GMT +grpc-accept-encoding: gzip +server: nginx/1.17.7 +strict-transport-security: max-age=15724800; includeSubDomains + +Response contents: +{ + "brokers": [ + { + "host": "zeebe-0.zeebe-broker-service.e2f9117e-e2cc-422d-951e-939732ef515b-zeebe.svc.cluster.local", + "port": 26501, + "partitions": [ + { + "partitionId": 2 + }, + { + "partitionId": 1 + } + ] + } + ], + "clusterSize": 1, + "partitionsCount": 2, + "replicationFactor": 1 +} + +Response trailers received: +(empty) +Sent 0 requests and received 1 response +``` diff --git a/docs/product-manuals/clients/nodejs/install-the-nodejs-client.md b/versioned_docs/version-0.25/product-manuals/clients/nodejs/install-the-nodejs-client.md similarity index 100% rename from docs/product-manuals/clients/nodejs/install-the-nodejs-client.md rename to versioned_docs/version-0.25/product-manuals/clients/nodejs/install-the-nodejs-client.md diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/OWNERS b/versioned_docs/version-0.25/product-manuals/cloud-console/OWNERS new file mode 100644 index 00000000000..f4691562646 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/cloud-console/OWNERS @@ -0,0 +1,10 @@ +approvers: +- camundacloud + +reviewers: +- camundacloud +- devrel +- operate +- productmanagement +- tasklist +- zeebe diff --git a/docs/product-manuals/cloud-console/manage-cloud-account/administrate-account.md b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/administrate-account.md similarity index 100% rename from docs/product-manuals/cloud-console/manage-cloud-account/administrate-account.md rename to versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/administrate-account.md diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue-multiple-organisations.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue-multiple-organisations.png new file mode 100644 index 00000000000..e53138ce1d1 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue-multiple-organisations.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue.png new file mode 100644 index 00000000000..b3e95540960 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-cloud-account/img/avatar-menue.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/create-cluster.md b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/create-cluster.md new file mode 100644 index 00000000000..c4ce073b2e8 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/create-cluster.md @@ -0,0 +1,18 @@ +--- +id: create-cluster +title: Create a Cluster +--- + +After login you'll see the console overview page. Since you haven't created a cluster, the overview will be empty. + +![cluster-creating](./img/cluster-overview-empty.png) + +In the upper right area you'll find the button _Create New Cluster_. Click on it to create a new cluster. After you've assigned a name and created the cluster, a new entry appears in the overview: + +![cluster-creating](./img/cluster-overview-new-cluster-creating.png) + +The cluster is now being set up. During this phase, its state is _Creating_. After one or two minutes the cluster is ready for use and changes its state to _healthy_: + +![cluster-healthy](./img/cluster-overview-new-cluster-healthy.png) + +After the cluster has been created, you can jump into the cluster detail page by clicking at the newly created cluster. diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/client-auth.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/client-auth.png new file mode 100644 index 00000000000..5e1c3d85e30 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/client-auth.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png new file mode 100644 index 00000000000..476effdc1af Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-empty.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png new file mode 100644 index 00000000000..e0f20c6f60a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-creating.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png new file mode 100644 index 00000000000..72eef36281b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/img/cluster-overview-new-cluster-healthy.png differ diff --git a/docs/product-manuals/cloud-console/manage-clusters/manage-client-connections.md b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/manage-client-connections.md similarity index 100% rename from docs/product-manuals/cloud-console/manage-clusters/manage-client-connections.md rename to versioned_docs/version-0.25/product-manuals/cloud-console/manage-clusters/manage-client-connections.md diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/available-plans.md b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/available-plans.md new file mode 100644 index 00000000000..bd2104f7928 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/available-plans.md @@ -0,0 +1,13 @@ +--- +id: available-plans +title: Available Plans +--- + +Camunda Cloud was released to the world as Beta in September 2019. In order to signup for Camunda Cloud, please go to [the signup page](https://accounts.cloud.camunda.io/signup). + +There are two plans available for Camunda Cloud: + +- **Trial Plan** (Beta) - The Trial Plan allows you to test-drive Camunda Cloud for free and develop your first applications. Go to [Overview of the Trial Plan](./trial-plan.md) for more details. +- **Professional Plan** (Early Access) - The Professional Plan allows you to start using Camunda Cloud for production projects. Go to [Overview of the Professional Plan](./professional-plan.md) for more details. + +In the future, Camunda Cloud will provide an enterprise plan for large projects and enterprises who plan on adoption Camunda Cloud at large scale. diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png new file mode 100644 index 00000000000..2ef7125399f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-paid-request.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-edit.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-edit.png new file mode 100644 index 00000000000..5e7678307b3 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-edit.png differ diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-overview.png b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-overview.png new file mode 100644 index 00000000000..7dbd500b04d Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/img/early-access-reserved-clusters-overview.png differ diff --git a/docs/product-manuals/cloud-console/manage-plan/professional-plan.md b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/professional-plan.md similarity index 100% rename from docs/product-manuals/cloud-console/manage-plan/professional-plan.md rename to versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/professional-plan.md diff --git a/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/trial-plan.md b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/trial-plan.md new file mode 100644 index 00000000000..5fb1dde9047 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/cloud-console/manage-plan/trial-plan.md @@ -0,0 +1,12 @@ +--- +id: trial-plan +title: Trial Plan +--- + +_Note: the terms under which the trial plan is available might change in the future_. + +In order to test drive Camunda Cloud, you can [sign up](https://accounts.cloud.camunda.io/signup) for the trial plan. + +The trial plan is free and provides access to a single Zeebe Cluster to be used for development projects. + +In case you want to use Camunda Cloud in production we recommend switching to the [professional plan](./professional-plan.md). diff --git a/docs/product-manuals/cloud-console/overview.md b/versioned_docs/version-0.25/product-manuals/cloud-console/overview.md similarity index 100% rename from docs/product-manuals/cloud-console/overview.md rename to versioned_docs/version-0.25/product-manuals/cloud-console/overview.md diff --git a/docs/product-manuals/modeler/install-the-modeler.md b/versioned_docs/version-0.25/product-manuals/modeler/install-the-modeler.md similarity index 100% rename from docs/product-manuals/modeler/install-the-modeler.md rename to versioned_docs/version-0.25/product-manuals/modeler/install-the-modeler.md diff --git a/versioned_docs/version-0.25/product-manuals/operate/OWNERS b/versioned_docs/version-0.25/product-manuals/operate/OWNERS new file mode 100644 index 00000000000..af16ccc9ff8 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/OWNERS @@ -0,0 +1,10 @@ +approvers: +- operate + +reviewers: +- camundacloud +- devrel +- operate +- productmanagement +- tasklist +- zeebe diff --git a/versioned_docs/version-0.25/product-manuals/operate/deployment/authentication.md b/versioned_docs/version-0.25/product-manuals/operate/deployment/authentication.md new file mode 100644 index 00000000000..d66fbfd0610 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/deployment/authentication.md @@ -0,0 +1,103 @@ +--- +id: authentication +title: Authentication +--- +## Introduction + +Operate provides three ways for authentication: + +1. Authenticate with user information stored in [Elasticsearch](#user-in-elasticsearch) +2. Authenticate via [Auth0 Single Sign-On provider](#auth0-single-sign-on) +3. Authenticate via [Lightweight Directory Access Protocol (LDAP)](#ldap) + +By default user storage in Elasticsearch is enabled. + +## User in Elasticsearch + +In this mode the user authenticates with username and password, that are stored in Elasticsearch. +**username** and **password** for one user may be set in application.yml: + +``` +camunda.operate: + username: anUser + password: aPassword +``` + +On Operate startup the user will be created if not existed before. + +By default one user with **username**/**password** `demo`/`demo` will be created. + +More users can be added directly to Elasticsearch, to the index `operate-user-_`. Password must be encoded with BCrypt strong hashing function. + +## Auth0 Single Sign-On + +Currently Operate supports Auth0.com implementation of Single Sign-On. + +### Enable Single Sign-On + +Single Sign-On may be enabled only by setting [Spring profile](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-profiles): `sso-auth` + +Example for setting spring profile as environmental variable: +``` +export SPRING_PROFILES_ACTIVE=sso-auth +``` + +### Configure Single Sign-On + +Single Sign-On needs following parameters (all are mandatory): + +Parametername |Description +--------------|------------- +camunda.operate.auth0.domain | Defines the domain which the user sees +camunda.operate.auth0.backendDomain | Defines the domain which provides user information +camunda.operate.auth0.clientId | It's like an user name for the application +camunda.operate.auth0.clientSecret | It's like a password for the application +camunda.operate.auth0.claimName | The claim that will be checked by Operate. It's like a permission name +camunda.operate.auth0.organization | The given organization should be contained in value of claim name + +Example for setting parameters as environment variables: + +``` +export CAMUNDA_OPERATE_AUTH0_DOMAIN=A_DOMAIN +export CAMUNDA_OPERATE_AUTH0_BACKENDDOMAIN=A_BACKEND_DDOMAIN +export CAMUNDA_OPERATE_AUTH0_CLIENTID=A_CLIENT_ID +export CAMUNDA_OPERATE_AUTH0_CLIENTSECRET=A_SECRET +export CAMUNDA_OPERATE_AUTH0_CLAIMNAME=A_CLAIM +export CAMUNDA_OPERATE_AUTH0_ORGANIZATION=AN_ORGANIZATION +``` +## LDAP + +### Enable LDAP + +LDAP can be enabled only by setting [Spring profile](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-profiles): `ldap-auth` + +Example for setting spring profile as environmental variable: +``` +export SPRING_PROFILES_ACTIVE=ldap-auth +``` + +### Configuration of LDAP +A user can authenticate via LDAP. +Following parameters for a connection to a LDAP server should be given: + + Parametername |Description | Example| Required + --------------|------------|---------|-------- + camunda.operate.ldap.url | URL to a LDAP Server | ldaps://camunda.com/ | yes + camunda.operate.ldap.baseDn| Base domain name | dc=camunda,dc=com| yes + camunda.operate.ldap.managerDn| Manager domain, is used by Operate to login into LDAP Server to retrieve user informations | cn=admin,dc=camunda,dc=com| yes + camunda.operate.ldap.managerPassword| Password for manager| |yes + camunda.operate.ldap.userSearchFilter| Filter to retrieve user info, The pattern '{0}' will be replaced by given username in login form| {0} | no, Default is {0} + camunda.operate.ldap.userSearchBase| Starting point for search| ou=Support,dc=camunda,dc=com| no + +### Configuration of Active Directory based LDAP +For **Active Directory** based LDAP server following parameters should be given: + +Note: Only when `camunda.operate.ldap.domain` is given, the Active Directory configuration will be applied. + + Parametername |Description | Required + --------------|------------|--------- + camunda.operate.ldap.url | URL to a Active Directory LDAP Server | yes + camunda.operate.ldap.domain| Domain | yes + camunda.operate.ldap.baseDn| Root domain name | no + camunda.operate.ldap.userSearchFilter| Is used as search filter | no + diff --git a/versioned_docs/version-0.25/product-manuals/operate/deployment/configuration.md b/versioned_docs/version-0.25/product-manuals/operate/deployment/configuration.md new file mode 100644 index 00000000000..0333bd65cbb --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/deployment/configuration.md @@ -0,0 +1,246 @@ +--- +id: configuration +title: Configuration +--- +## Introduction + +Operate is a Spring Boot application. That means all ways to [configure](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config) +a Spring Boot application can be applied. By default the configuration for Operate is stored in a YAML file `application.yml`. All Operate related settings are prefixed +with `camunda.operate`. The following parts are configurable: + + * [Elasticsearch Connection](#elasticsearch) + * [Zeebe Broker connection](#zeebe-broker-connection) + * [Zeebe Elasticsearch Exporter](#zeebe-elasticsearch-exporter) + * [Operation Executor](#operation-executor) + * [Authentication](authentication.md) + * [Scaling Operate](importer-and-archiver.md) + * [Monitoring possibilities](#monitoring-operate) + * [Logging configuration](#logging) + * [Probes](#probes) + +## Configurations + +### Elasticsearch + +Operate stores and reads data in/from Elasticsearch. + +### Settings to connect + +Operate supports [basic authentication](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/setting-up-authentication.html) for elasticsearch. +Set the appropriate username/password combination in the configuration to use it. + +Either set `host` and `port` (deprecated) or `url` (recommended) + +Name | Description | Default value +-----|-------------|-------------- +camunda.operate.elasticsearch.clusterName | Clustername of Elasticsearch | elasticsearch +camunda.operate.elasticsearch.host | Hostname where Elasticsearch is running | localhost +camunda.operate.elasticsearch.port | Port of Elasticsearch REST API | 9200 +camunda.operate.elasticsearch.url | URL of Elasticsearch REST API | http://localhost:9200 +camunda.operate.elasticsearch.username | Username to access Elasticsearch REST API | - +camunda.operate.elasticsearch.password | Password to access Elasticsearch REST API | - + +### Settings for shards and replicas + +Operate creates the template with index settings named `operate-_template` that Elasticsearch will use for all Operate indices. +These settings can be changed. + +Following configuration parameters will define the settings: + +Name|Description|Default value +----|-----------|-------------- +camunda.operate.elasticsearch.numberOfShards| How many shards Elasticsearch uses for all Operate indices| 1 +camunda.operate.elasticsearch.numberOfReplicas| How many replicas Elasticsearch uses for all Operate indices| 0 + +These values are applied only on first startup of Operate or during version upgrade. After Operate +ELS schema is created, settings may be adjusted directly in ELS template and the new settings will be applied +to indices created after adjustment. + +### A snippet from application.yml: + +```yaml +camunda.operate: + elasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + url: http://localhost:9200 +``` + +## Zeebe Broker Connection + +Operate needs a connection to Zeebe Broker to start the import and to execute user operations. + +### Settings to connect + +Name | Description | Default value +-----|-------------|-------------- +camunda.operate.zeebe.brokerContactPoint | Broker contact point to zeebe as hostname and port | localhost:26500 + +### A snippet from application.yml: + +```yaml +camunda.operate: + zeebe: + # Broker contact point + brokerContactPoint: localhost:26500 +``` + +## Zeebe Elasticsearch Exporter + +Operate imports data from Elasticsearch indices created and filled in by [Zeebe Elasticsearch Exporter](https://github.com/zeebe-io/zeebe/tree/develop/exporters/elasticsearch-exporter). +Therefore settings for this Elasticsearch connection must be defined and must correspond to the settings on Zeebe side. + +### Settings to connect and import: + +Name | Description | Default value +-----|-------------|-------------- +camunda.operate.zeebeElasticsearch.clusterName | Cluster name of Elasticsearch | elasticsearch +camunda.operate.zeebeElasticsearch.host | Hostname where Elasticsearch is running | localhost +camunda.operate.zeebeElasticsearch.port | Port of Elasticsearch REST API | 9200 +camunda.operate.zeebeElasticsearch.prefix | Index prefix as configured in Zeebe Elasticsearch exporter | zeebe-record +camunda.operate.zeebeElasticsearch.username | Username to access Elasticsearch REST API | - +camunda.operate.zeebeElasticsearch.password | Password to access Elasticsearch REST API | - + +### A snippet from application.yml: + +```yaml +camunda.operate: + zeebeElasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + host: localhost + # Transport port + port: 9200 + # Index prefix, configured in Zeebe Elasticsearch exporter + prefix: zeebe-record +``` + +## Operation Executor + +Operations are user operations like Cancellation of workflow instance(s) or Updating the variable value. Operations are executed in multi-threaded manner. + +Name | Description | Default value +-----|-------------|-------------- +camunda.operate.operationExecutor.threadsCount| How many threads should be used | 3 + +### A snippet from application.yml + +```yaml +camunda.operate: + operationExecutor: + threadsCount: 3 +``` + +## Monitoring Operate + +Operate includes [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready) inside, that +provides number of monitoring possibilities. + +Operate uses following Actuator configuration by default: +```yaml +# enable health check and metrics endpoints +management.endpoints.web.exposure.include: health,prometheus +# enable Kubernetes health groups: +# https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-kubernetes-probes +management.health.probes.enabled: true +``` + +With this configuration following endpoints are available for use out of the box: + +```:8080/actuator/prometheus``` Prometheus metrics + +```:8080/actuator/health/liveness``` Liveness probe + +```:8080/actuator/health/readiness``` Readiness probe + + +### Versions before 0.25.0 + +In versions before 0.25.0 management endpoints look differently, therefore we recommend to reconfigure for next versions. + +|Name|Before 0.25.0| Starting with 0.25.0| +|----|-------------|--------| +|Readiness|/api/check|/actuator/health/readiness| +|Liveness|/actuator/health|/actuator/health/liveness| + +## Logging + +Operate uses Log4j2 framework for logging. In distribution archive as well as inside a Docker image `config/log4j2.xml` logging configuration files is included, +that can be further adjusted to your needs: + +```xml + + + + %clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx + ${env:OPERATE_LOG_STACKDRIVER_SERVICENAME:-operate} + ${env:OPERATE_LOG_STACKDRIVER_SERVICEVERSION:-} + + + + + + + + + + + + + + + + +``` + +By default Console log appender will be used. + +#### JSON logging configuration + +You can choose to output logs in JSON format (Stackdriver compatible). To enable it, define +the environment variable ```OPERATE_LOG_APPENDER``` like this: + +```sh +OPERATE_LOG_APPENDER=Stackdriver +``` + +## An example of application.yml file + +The following snippet represents the default Operate configuration, which is shipped with the distribution. It can be found inside the `config` folder (`config/application.yml`) + and can be used to adjust Operate to your needs. + +```yaml +# Operate configuration file + +camunda.operate: + # Set operate username and password. + # If user with does not exists it will be created. + # Default: demo/demo + #username: + #password: + # ELS instance to store Operate data + elasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + host: localhost + # Transport port + port: 9200 + # Zeebe instance + zeebe: + # Broker contact point + brokerContactPoint: localhost:26500 + # ELS instance to export Zeebe data to + zeebeElasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + host: localhost + # Transport port + port: 9200 + # Index prefix, configured in Zeebe Elasticsearch exporter + prefix: zeebe-record +``` diff --git a/versioned_docs/version-0.25/product-manuals/operate/deployment/data-retention.md b/versioned_docs/version-0.25/product-manuals/operate/deployment/data-retention.md new file mode 100644 index 00000000000..0166f2899d3 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/deployment/data-retention.md @@ -0,0 +1,28 @@ +--- +id: data-retention +title: Data retention +--- +## How the data is stored and archived + +Operate imports data from Zeebe and stores it in Elasticsearch indices with defined prefix (default: `operate`). Specifically: + * deployed workflows, including the diagrams + * the state of workflow instances, including variables, flow nodes, that were activated within instance execution, incidents etc. + +It additionally stores some Operate specific data: + * operations performed by the user + * list of users + * technical data, like the state of Zeebe import etc. + +The data that represents workflow instance state becomes immutable after workflow instance is finished. At this moment the data may be archived, meaning that +it will be moved to a dated index, e.g. `operate_variables_2020-01-01`, where date represents the date on which given workflow instance was finished. +The same is valid for user operations: after they are finished the related data is moved to dated indices. + +> **Note:** All Operate data present in Elasticsearch (from both "main" and dated indices) will be visible from the UI. + +## Data cleanup + +In case of intensive Zeebe usage the amount of data can grow significantly with the time, therefore you should think about the data cleanup strategy. Dated indices +may be safely removed from Elasticsearch. "Safely" means here, that only finished workflow instances will be deleted together with all related data, and the rest or the data +will stay consistent. You can use Elasticsearch Curator or other tools/scripts to delete old data. + +> **Attention:** Only indices that contain dates in their suffix may be deleted. diff --git a/versioned_docs/version-0.25/product-manuals/operate/deployment/importer-and-archiver.md b/versioned_docs/version-0.25/product-manuals/operate/deployment/importer-and-archiver.md new file mode 100644 index 00000000000..330e38140cc --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/deployment/importer-and-archiver.md @@ -0,0 +1,82 @@ +--- +id: importer-and-archiver +title: Importer & Archiver +--- +Operate consists of three modules: + * **Webapp** - contains the UI and operation executor functionality + * **Importer** - is responsible for importing data from Zeebe + * **Archiver** - is responsible for archiving "old" data (finished workflow instances and user operations) (see [Data retention](data-retention.md)). + +Modules can be run together or separately in any combination and can be scaled. When you run Operate instance, by default, all modules are enabled. +To disable them you can use following configuration parameters: + +Configuration parameter | Description | Default value +-----|-------------|-------------- +camunda.operate.importerEnabled | When true, Importer module is enabled | true +camunda.operate.archiverEnabled | When true, Archiver module is enabled | true +camunda.operate.webappEnabled | When true, Webapp module is enabled | true + +Additionally you can have several importer and archiver nodes to increase throughput. Internally they will spread their work based on Zeebe partitions. + +E.g. if your Zeebe runs 10 partitions and you configure 2 importer nodes, they will import data from 5 partitions each. +Each single importer/archiver node must be configured with the use of following configuration parameters: + + +Configuration parameter | Description | Default value +-----|-------------|-------------- +camunda.operate.clusterNode.partitionIds | Array of Zeebe partition ids, this Importer (or Archiver) node must be responsible for | empty array, meaning all partitions data is loaded +camunda.operate.clusterNode.nodeCount | Total amount of Importer (or Archiver) nodes in the cluster | 1 +camunda.operate.clusterNode.currentNodeId | Id of current Importer (or Archiver) node, starting from 0 | 0 + +It's enough to configure either `partitionIds` or pair of `nodeCount` and `currentNodeId`. In case you provide `nodeCount` and `currentNodeId`, +each node will automatically guess Zeebe partitions it is responsible for. + +>**Note** `nodeCount` always represents the number of nodes of one specific type. + +E.g. configuration of the cluster with 1 Webapp node, 2 Importer nodes and 1 Archiver node could look like this: +``` +Webapp node + +camunda.operate: + archiverEnabled: false + importerEnabled: false + #other configuration... + +Importer node #1 + +camunda.operate: + archiverEnabled: false + webappEnabled: false + clusterNode: + nodeCount: 2 + currentNodeId: 0 + #other configuration... + +Importer node #2 + +camunda.operate: + archiverEnabled: false + webappEnabled: false + clusterNode: + nodeCount: 2 + currentNodeId: 1 + #other configuration... + +Archiver node + +camunda.operate: + webappEnabled: false + importerEnabled: false + +``` + +You can further parallelize archiver and(or) importer within one node by using following configuration parameters: + +Configuration parameter | Description | Default value +-----|-------------|-------------- +camunda.operate.archiver.threadsCount | Number of threads, in which data will be archived | 1 +camunda.operate.importer.threadsCount | Number of threads, in which data will be importe | 3 + +>**Note** Parallelization of import and archiving within one node will also happen based on Zeebe partitions, meaning that only configurations with +> (number of nodes) * (threadsCount) <= (total number of Zeebe partitions) will make sense. Too many threads and nodes will still work, but some of them will be idle. + diff --git a/versioned_docs/version-0.25/product-manuals/operate/deployment/schema-and-migration.md b/versioned_docs/version-0.25/product-manuals/operate/deployment/schema-and-migration.md new file mode 100644 index 00000000000..c4cbbc08b1a --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/deployment/schema-and-migration.md @@ -0,0 +1,125 @@ +--- +id: schema-and-migration +title: Schema & Migration +--- +Operate stores data in Elasticsearch. On first start Operate will create all required indices and templates. + +* [Schema](#schema) +* [Data Migration](#data-migration) +* [How to migrate](#how-to-migrate) +* [Example for migrate in Kubernetes](#example-for-migrate-in-kubernetes) + +## Schema + +Operate uses several Elasticsearch indices that are mostly created by using templates. + +Index names follow the defined pattern: +``` +operate-{datatype}-{schemaversion}_[{date}] + +``` +where `datatype` defines which data is stored in the index, e.g. `user`, `variable` etc., +`schemaversion` represents version of Operate, +`date` represents finished date of archived data (see [Data retention](data-retention.md)). + +Knowing index name pattern, it is possible to customize index settings by creating Elasticsearch templates ([Example of an index template](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/indices-templates.html)) +E.g. to define desired number of shards and replicas, you can define following template: +``` +PUT _template/template_operate +{ + "index_patterns": ["operate-*"], + "settings": { + "number_of_shards": 5, + "number_of_replicas": 2 + } +} +``` + +> **Note:** In order for these settings to work, template must be created before Operate first run. + +## Data migration + +Version of Operate is reflected in Elasticsearch object names, e.g. `operate-user-0.24.0_` index contains user data for Operate 0.24.0. When upgrading from one +version of Operate to another, migration of data must be performed. Operate distribution provides an application to perform data migration from previous versions. + + +### Concept + +The migration uses Elasticsearch [processors](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/ingest-processors.html) and [pipelines](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/pipeline.html) to reindex the data. + +Each version of Operate delivers set of migration steps needed to be applied for corresponding version of Operate. +When upgrading from one version to another necessary migration steps constitute the so-called migration plan. +All known migration steps (both applied and not) are persisted in dedicated Elasticsearch index: `operate-migration-steps-repository`. + + +### How to migrate + +#### Migrate by using standalone application + +Make sure that Elasticsearch which contains the Operate data is running. The migration script will connect to specified connection in Operate +configuration (```/config/application.yml```). + +Execute ```/bin/migrate``` (or ```/bin/migrate.bat``` for Windows). + +What is expected to happen: +* Elasticsearch schema of new version is created +* previous version is detected +* migration plan is built and executed reindexing data for each index +* old indices are deleted + +All known migration steps with metadata will be stored in `operate-migration-steps-repository` index. + +> **Note:** The old indices will be deleted ONLY after successful migration. That might require +>more disk space during migration process. + +> **Important!** You should take care of data backup before performing migration. + +#### Migrate by using built-in automatic upgrade + +When running newer version of Operate against older schema, it will perform data migration on startup. +The migration will happen when exactly ONE previous schema version was detected. + +#### Further notes + +* If migration fails, it is OK to retry it. All applied steps are stored and only those steps will be applied that hasn't been executed yet. +* Operate should not be running, while migration is happening +* In case version upgrade is performed in the cluster with several Operate nodes, only one node ([Webapp module](importer-and-archiver.md)) must execute data migration, the others must be stopped +and started only after migration is fully finished + +#### Configure migration + +Automatic migration is enabled by default. +It can be disabled by setting the configuration key: + +`camunda.operate.migration.migrationEnabled = false` + +You can specify previous ("source") version with the configuration key: + +`camunda.operate.migration.sourceVersion=0.23.0` + +If no *sourceVersion* is defined Operate tries to detect it from Elasticsearch indices. + + +#### Example for migrate in Kubernetes + +To ensure that the migration will be executed *before* Operate will be started you can use +the [init container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) feature of Kubernetes. It makes sure that the 'main' container will only be started +if the initContainer was successfully executed. +The following snippet of a pod description for Kubernetes shows the usage of `migrate` script as initContainer. + +``` +... + labels: + app: operate +spec: + initContainers: + - name: migration + image: camunda/operate:0.24.0 + command: ['/bin/sh','/usr/local/operate/bin/migrate'] + containers: + - name: operate + image: camunda/operate:0.24.0 + env: +... +``` + diff --git a/versioned_docs/version-0.25/product-manuals/operate/userguide/basic-operate-navigation.md b/versioned_docs/version-0.25/product-manuals/operate/userguide/basic-operate-navigation.md new file mode 100644 index 00000000000..361f38b83c4 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/userguide/basic-operate-navigation.md @@ -0,0 +1,36 @@ +--- +id: basic-operate-navigation +title: Getting Familiar With Operate +--- + +This section "Getting Familiar With Operate" and the next section “Incidents and Payloads” assumes that you’ve deployed a workflow to Zeebe and have created at least one workflow instance. + +If you’re not sure how to deploy workflows or create instances, we recommend going through the "Getting Started tutorial". + +In the following sections, we’ll use the same `order-process.bpmn` workflow model from the Getting Started guide. + +## View A Deployed Workflow + +In the “Instances by Workflow” panel in your dashboard, you should see a list of your deployed workflows and running instances. + +![operate-dash-with-workflows](./img/Operate-Dashboard-Deployed-Workflow.png) + +When you click on the name of a deployed workflow in the “Instances by Workflow” panel, you’ll navigate to a view of that workflow model along with all running instances. + +![operate-view-workflow](./img/Operate-View-Workflow.png) + +From this “Running Instances” view, you have the ability to cancel a single running workflow instance. + +![operate-cancel-workflow-instance](./img/Operate-View-Workflow-Cancel.png) + +## Inspect A Workflow Instance + +Running workflow instances appear in the “Instances” section below the workflow model. To inspect a specific instance, you can click on the instance ID. + +![operate-inspect-instance](./img/Operate-Workflow-Instance-ID.png) + +There, you’ll be able to see detail about the workflow instance, including the instance history and the variables attached to the instance. + +![operate-view-instance-detail](./img/Operate-View-Instance-Detail.png) + + diff --git a/docs/product-manuals/operate/userguide/img/Operate-Batch-Cancel-Or-Retry.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Cancel-Or-Retry.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Batch-Cancel-Or-Retry.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Cancel-Or-Retry.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Batch-Create-Selection.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Create-Selection.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Batch-Create-Selection.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Create-Selection.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Batch-Many-Instances-With-Incident.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Many-Instances-With-Incident.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Batch-Many-Instances-With-Incident.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Many-Instances-With-Incident.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Batch-Retry-Successful.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Retry-Successful.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Batch-Retry-Successful.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Retry-Successful.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Batch-Selection-Created.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Selection-Created.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Batch-Selection-Created.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Selection-Created.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Batch-Selection-Saved.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Selection-Saved.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Batch-Selection-Saved.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Batch-Selection-Saved.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Dashboard-Deployed-Workflow.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Dashboard-Deployed-Workflow.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Dashboard-Deployed-Workflow.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Dashboard-Deployed-Workflow.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Dashboard-No-Workflows.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Dashboard-No-Workflows.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Dashboard-No-Workflows.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Dashboard-No-Workflows.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Incident-Resolved.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Incident-Resolved.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Incident-Resolved.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Incident-Resolved.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-View-Instance-Detail.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Detail.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-View-Instance-Detail.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Detail.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-View-Instance-Edit-Icon.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Edit-Icon.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-View-Instance-Edit-Icon.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Edit-Icon.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-View-Instance-Incident.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Incident.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-View-Instance-Incident.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Incident.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-View-Instance-Save-Var-Edit.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Save-Var-Edit.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-View-Instance-Save-Var-Edit.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Instance-Save-Var-Edit.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-View-Workflow-Cancel.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Workflow-Cancel.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-View-Workflow-Cancel.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Workflow-Cancel.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-View-Workflow.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Workflow.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-View-Workflow.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-View-Workflow.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Workflow-Instance-ID.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Workflow-Instance-ID.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Workflow-Instance-ID.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Workflow-Instance-ID.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Workflow-Retry-Incident.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Workflow-Retry-Incident.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Workflow-Retry-Incident.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Workflow-Retry-Incident.png diff --git a/docs/product-manuals/operate/userguide/img/Operate-Workflow-View-Incident.png b/versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Workflow-View-Incident.png similarity index 100% rename from docs/product-manuals/operate/userguide/img/Operate-Workflow-View-Incident.png rename to versioned_docs/version-0.25/product-manuals/operate/userguide/img/Operate-Workflow-View-Incident.png diff --git a/docs/product-manuals/operate/userguide/index.md b/versioned_docs/version-0.25/product-manuals/operate/userguide/index.md similarity index 100% rename from docs/product-manuals/operate/userguide/index.md rename to versioned_docs/version-0.25/product-manuals/operate/userguide/index.md diff --git a/docs/product-manuals/operate/userguide/install-and-start.md b/versioned_docs/version-0.25/product-manuals/operate/userguide/install-and-start.md similarity index 100% rename from docs/product-manuals/operate/userguide/install-and-start.md rename to versioned_docs/version-0.25/product-manuals/operate/userguide/install-and-start.md diff --git a/versioned_docs/version-0.25/product-manuals/operate/userguide/operate-feedback-and-questions.md b/versioned_docs/version-0.25/product-manuals/operate/userguide/operate-feedback-and-questions.md new file mode 100644 index 00000000000..64e63f1c0de --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/userguide/operate-feedback-and-questions.md @@ -0,0 +1,11 @@ +--- +id: operate-feedback-and-questions +title: Giving Feedback And Asking Questions +--- +If you have questions or feedback about Operate, the [Zeebe user forum](https://forum.zeebe.io) is the best way to get in touch with us. Please use the “Operate” tag when you create a post. + +If you’re interested in an Operate enterprise license so that you can use Operate in production, [please contact us](mailto:feedback@zeebe.io) so that we can notify you when an enterprise edition of Operate becomes available. + +Did you find a problem in Operate? Or do you have a suggestion for an improvement? +You can create an issue in the [Operate JIRA](https://jira.camunda.com/browse/OPE) project to let us know. + diff --git a/versioned_docs/version-0.25/product-manuals/operate/userguide/resolve-incidents-update-variables.md b/versioned_docs/version-0.25/product-manuals/operate/userguide/resolve-incidents-update-variables.md new file mode 100644 index 00000000000..7f51af309a8 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/operate/userguide/resolve-incidents-update-variables.md @@ -0,0 +1,116 @@ +--- +id: resolve-incidents-update-variables +title: Variables & Incidents +--- + +Every workflow instance created for the workflow model used in the Getting Started tutorial requires an `orderValue` so that the XOR gateway evaluation will happen properly. + +Let’s look at a case where `orderValue` is present but was set as a string, but our `order-process.bpmn` model requires an integer in order to properly evaluate the `orderValue` and route the instance. + +**Linux** + +``` +./bin/zbctl --insecure create instance order-process --variables '{"orderId": "1234", "orderValue":"99"}' +``` + +**Mac** + +``` +./bin/zbctl.darwin --insecure create instance order-process --variables '{"orderId": "1234", "orderValue":"99"}' +``` + +**Windows (Powershell)** + +``` +./bin/zbctl.exe --insecure create instance order-process --variables '{\"orderId\": \"1234\", \ +"orderValue\": \"99\"}' +``` + +To advance the instance to our XOR gateway, we’ll quickly create a job worker to complete the “Initiate Payment” task: + +**Linux** + +``` +./bin/zbctl --insecure create worker initiate-payment --handler cat +``` + + +**Mac** + +``` +./bin/zbctl.darwin --insecure create worker initiate-payment --handler cat +``` + + +**Windows (Powershell)** + +``` +./bin/zbctl.exe --insecure create worker initiate-payment --handler "findstr .*" +``` + +And we’ll publish a message that will be correlated with the instance so we can advance past the “Payment Received” Intermediate Message Catch Event: + +**Linux** +``` +./bin/zbctl --insecure publish message "payment-received" --correlationKey="1234" +``` + +**Mac** + +``` +./bin/zbctl.darwin --insecure publish message "payment-received" --correlationKey="1234" +``` + +**Windows (Powershell)** + +``` +./bin/zbctl.exe --insecure publish message "payment-received" --correlationKey="1234" +``` + +In the Operate interface, you should now see that the workflow instance has an incident, which means there’s a problem with workflow execution that needs to be fixed before the workflow instance can progress to the next step. + +![operate-incident-workflow-view](./img/Operate-Workflow-View-Incident.png) + +Operate provides tools for diagnosing and resolving incidents. Let’s go through incident diagnosis and resolution step-by-step. + +When we inspect the workflow instance, we can see exactly what our incident is: `Expected to evaluate condition 'orderValue>=100' successfully, but failed because: Cannot compare values of different types: STRING and INTEGER` + +![operate-incident-instance-view](./img/Operate-View-Instance-Incident.png) + +We have enough information to know that to resolve this incident, we need to edit the `orderValue` variable so that it’s an integer. To do so, first click on the edit icon next to the variable you’d like to edit. + +![operate-incident-edit-variable](./img/Operate-View-Instance-Edit-Icon.png) + +Next, edit the variable by removing the quotation marks from the `orderValue` value. Then click on the checkmark icon to save the change. + +We were able to solve this particular problem by _editing_ a variable, but it’s worth noting that you can also _add_ a variable if a variable is missing from a workflow instance altogether. + +![operate-incident-save-variable-edit](./img/Operate-View-Instance-Save-Var-Edit.png) + +There’s one last step we need to take: initiating a “retry” of the workflow instance. There are two places on the workflow instance page where you can initiate a retry: + +![operate-retry-instance](./img/Operate-Workflow-Retry-Incident.png) + +You should now see that the incident has been resolved, and the workflow instance has progressed to the next step. Well done! + +![operate-incident-resolved-instance-view](./img/Operate-Incident-Resolved.png) + +If you’d like to complete the workflow instance, you can create a worker for the “Ship Without Insurance” task: + +**Linux** + +``` +./bin/zbctl --insecure create worker ship-without-insurance --handler cat +``` + +**Mac** + +``` +./bin/zbctl.darwin --insecure create worker ship-without-insurance --handler cat +``` + +**Windows (Powershell)** + +``` +./bin/zbctl.exe --insecure create worker ship-without-insurance --handler "findstr .*" +``` diff --git a/docs/product-manuals/operate/userguide/selections-batch-operations.md b/versioned_docs/version-0.25/product-manuals/operate/userguide/selections-batch-operations.md similarity index 100% rename from docs/product-manuals/operate/userguide/selections-batch-operations.md rename to versioned_docs/version-0.25/product-manuals/operate/userguide/selections-batch-operations.md diff --git a/versioned_docs/version-0.25/product-manuals/overview.md b/versioned_docs/version-0.25/product-manuals/overview.md new file mode 100644 index 00000000000..c610d305026 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/overview.md @@ -0,0 +1,17 @@ +--- +id: overview +title: Overview Product Manuals +sidebar_label: Overview Product Manuals +slug: /product-manuals/ +--- + +This section contains product manual content for each product in Camunda Cloud, including conceptual content. + +- [Clients](clients/nodejs/install-the-nodejs-client.md) - Supported clients for working with Camunda Cloud, including information on building your own. +- [Cloud Console](cloud-console/overview) - More information on working with the Cloud Console. +- [Modeler](modeler/install-the-modeler) - Installation steps for the modeler. +- [Zeebe Engine](zeebe/zeebe-overview) - Complete documentation for Zeebe. +- [Operate](operate/userguide/index.md) - User and deployment guide for Operate. +- [Tasklist](tasklist/deployment/configuration) - Deployment guide for Tasklist. + +While Camunda Cloud is cloud-first, applicable sections, like Zeebe Engine, include on-prem operation steps. diff --git a/versioned_docs/version-0.25/product-manuals/tasklist/OWNERS b/versioned_docs/version-0.25/product-manuals/tasklist/OWNERS new file mode 100644 index 00000000000..71221bbbb97 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/tasklist/OWNERS @@ -0,0 +1,10 @@ +approvers: +- tasklist + +reviewers: +- camundacloud +- devrel +- operate +- productmanagement +- tasklist +- zeebe diff --git a/versioned_docs/version-0.25/product-manuals/tasklist/deployment/authentication.md b/versioned_docs/version-0.25/product-manuals/tasklist/deployment/authentication.md new file mode 100644 index 00000000000..84f4166ae81 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/tasklist/deployment/authentication.md @@ -0,0 +1,66 @@ +--- +id: authentication +title: Authentication +--- +## Introduction + +Tasklist provides two ways for authentication: + +1. Authenticate with user information stored in [Elasticsearch](#user-in-elasticsearch) +2. Authenticate via [Auth0 Single Sign-On provider](#auth0-single-sign-on) + +By default user storage in Elasticsearch is enabled. + +## User in Elasticsearch + +In this mode the user authenticates with username and password, that are stored in Elasticsearch. +**username** and **password** for one user may be set in application.yml: + +``` +zeebe.tasklist: + username: anUser + password: aPassword +``` + +On Tasklist startup the user will be created if not existed before. + +By default one user with **username**/**password** `demo`/`demo` will be created. + +More users can be added directly to Elasticsearch, to the index `tasklist-user-_`. Password must be encoded with BCrypt strong hashing function. + +## Auth0 Single Sign-On + +Currently Tasklist supports Auth0.com implementation of Single Sign-On. + +### Enable Single Sign-On + +Single Sign-On may be enabled only by setting [Spring profile](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-profiles): `sso-auth` + +Example for setting spring profile as environmental variable: +``` +export SPRING_PROFILES_ACTIVE=sso-auth +``` + +### Configure Single Sign-On + +Single Sign-On needs following parameters (all are mandatory): + +Parametername |Description +--------------|------------- +zeebe.tasklist.auth0.domain | Defines the domain which the user sees +zeebe.tasklist.auth0.backendDomain | Defines the domain which provides user information +zeebe.tasklist.auth0.clientId | It's like an user name for the application +zeebe.tasklist.auth0.clientSecret | It's like a password for the application +zeebe.tasklist.auth0.claimName | The claim that will be checked by Tasklist. It's like a permission name +zeebe.tasklist.auth0.organization | The given organization should be contained in value of claim name + +Example for setting parameters as environment variables: + +``` +export ZEEBE_TASKLIST_AUTH0_DOMAIN=A_DOMAIN +export ZEEBE_TASKLIST_AUTH0_BACKENDDOMAIN=A_BACKEND_DDOMAIN +export ZEEBE_TASKLIST_AUTH0_CLIENTID=A_CLIENT_ID +export ZEEBE_TASKLIST_AUTH0_CLIENTSECRET=A_SECRET +export ZEEBE_TASKLIST_AUTH0_CLAIMNAME=A_CLAIM +export ZEEBE_TASKLIST_AUTH0_ORGANIZATION=AN_ORGANIZATION +``` diff --git a/versioned_docs/version-0.25/product-manuals/tasklist/deployment/configuration.md b/versioned_docs/version-0.25/product-manuals/tasklist/deployment/configuration.md new file mode 100644 index 00000000000..cead7331169 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/tasklist/deployment/configuration.md @@ -0,0 +1,236 @@ +--- +id: configuration +title: Configuration +--- +## Introduction + +Tasklist is a Spring Boot application. That means all ways to [configure](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config) +a Spring Boot application can be applied. By default, the configuration for Tasklist is stored in a YAML file `application.yml`. All Tasklist related settings are prefixed +with `zeebe.tasklist`. The following parts are configurable: + + * [Elasticsearch Connection](#elasticsearch) + * [Zeebe Broker connection](#zeebe-broker-connection) + * [Zeebe Elasticsearch Exporter](#zeebe-elasticsearch-exporter) + * [Authentication](authentication.md) + * [Monitoring and health probes](#monitoring-and-health-probes) + * [Logging configuration](#logging) + +## Configurations + +## Elasticsearch + +Tasklist stores and reads data in/from Elasticsearch. + +### Settings to connect + +Tasklist supports [basic authentication](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/setting-up-authentication.html) for elasticsearch. +Set the appropriate username/password combination in the configuration to use it. + +Name | Description | Default value +-----|-------------|-------------- +zeebe.tasklist.elasticsearch.clusterName | Clustername of Elasticsearch | elasticsearch +zeebe.tasklist.elasticsearch.url | URL of Elasticsearch REST API | http://localhost:9200 +zeebe.tasklist.elasticsearch.username | Username to access Elasticsearch REST API | - +zeebe.tasklist.elasticsearch.password | Password to access Elasticsearch REST API | - + +### Settings for shards and replicas + +Tasklist creates the template with index settings named `tasklist-_template` that Elasticsearch will use for all Tasklist indices. +These settings can be changed. + +Following configuration parameters will define the settings: + +Name|Description|Default value +----|-----------|-------------- +zeebe.tasklist.elasticsearch.numberOfShards| How many shards Elasticsearch uses for all Tasklist indices| 1 +zeebe.tasklist.elasticsearch.numberOfReplicas| How many replicas Elasticsearch uses for all Tasklist indices| 0 + +These values are applied only on first startup of Tasklist or during version upgrade. After Tasklist +ELS schema is created, settings may be adjusted directly in ELS template and the new settings will be applied +to indices created after adjustment. + +### A snippet from application.yml: + +```yaml +zeebe.tasklist: + elasticsearch: + # Cluster name + clusterName: elasticsearch + # Url + url: http://localhost:9200 +``` + +## Zeebe Broker Connection + +Tasklist needs a connection to Zeebe Broker to start the import. + +### Settings to connect + +Name | Description | Default value +-----|-------------|-------------- +zeebe.tasklist.zeebe.brokerContactPoint | Broker contact point to zeebe as hostname and port | localhost:26500 + +### A snippet from application.yml: + +```yaml +zeebe.tasklist: + zeebe: + # Broker contact point + brokerContactPoint: localhost:26500 +``` + +## Zeebe Elasticsearch Exporter + +Tasklist imports data from Elasticsearch indices created and filled in by [Zeebe Elasticsearch Exporter](https://github.com/zeebe-io/zeebe/tree/develop/exporters/elasticsearch-exporter). +Therefore settings for this Elasticsearch connection must be defined and must correspond to the settings on Zeebe side. + +### Settings to connect and import: + +Name | Description | Default value +-----|-------------|-------------- +zeebe.tasklist.zeebeElasticsearch.clusterName | Cluster name of Elasticsearch | elasticsearch +zeebe.tasklist.zeebeElasticsearch.host | Hostname where Elasticsearch is running | localhost +zeebe.tasklist.zeebeElasticsearch.port | Port of Elasticsearch REST API | 9200 +zeebe.tasklist.zeebeElasticsearch.prefix | Index prefix as configured in Zeebe Elasticsearch exporter | zeebe-record +zeebe.tasklist.zeebeElasticsearch.username | Username to access Elasticsearch REST API | - +zeebe.tasklist.zeebeElasticsearch.password | Password to access Elasticsearch REST API | - + +### A snippet from application.yml: + +```yaml +zeebe.tasklist: + zeebeElasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + host: localhost + # Transport port + port: 9200 + # Index prefix, configured in Zeebe Elasticsearch exporter + prefix: zeebe-record +``` + +## Monitoring and health probes + +Tasklist includes [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready) inside, that +provides number of monitoring possibilities., e.g. health check (http://localhost:8080/actuator/health) and metrics (http://localhost:8080/actuator/prometheus) endpoints. + +Tasklist uses following Actuator configuration by default: +```yaml +# enable health check and metrics endpoints +management.endpoints.web.exposure.include: health,prometheus +# enable Kubernetes health groups: +# https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-kubernetes-probes +management.health.probes.enabled: true +``` + +With this configuration following endpoints are available for use out of the box: + +```:8080/actuator/prometheus``` Prometheus metrics + +```:8080/actuator/health/liveness``` Liveness probe + +```:8080/actuator/health/readiness``` Readiness probe + +### Example snippets to use Tasklist probes in Kubernetes: + +For details to set Kubernetes probes parameters see: [Kubernetes configure probes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes) + +#### Readiness probe as yaml config: +```yaml +readinessProbe: + httpGet: + path: /actuator/health/readiness + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 30 +``` +#### Liveness probe as yaml config: +```yaml +livenessProbe: + httpGet: + path: /actuator/health/liveness + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 30 +``` + +## Logging + +Tasklist uses Log4j2 framework for logging. In distribution archive as well as inside a Docker image `config/log4j2.xml` logging configuration files is included, +that can be further adjusted to your needs: + +```xml + + + + %clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx + ${env:TASKLIST_LOG_STACKDRIVER_SERVICENAME:-tasklist} + ${env:TASKLIST_LOG_STACKDRIVER_SERVICEVERSION:-} + + + + + + + + + + + + + + + + +``` + +By default, Console log appender will be used. + +#### JSON logging configuration + +You can choose to output logs in JSON format (Stackdriver compatible). To enable it, define +the environment variable ```TASKLIST_LOG_APPENDER``` like this: + +```sh +TASKLIST_LOG_APPENDER=Stackdriver +``` + +## An example of application.yml file + +The following snippet represents the default Tasklist configuration, which is shipped with the distribution. It can be found inside the `config` folder (`config/application.yml`) + and can be used to adjust Tasklist to your needs. + +```yaml +# Tasklist configuration file + +zeebe.tasklist: + # Set Tasklist username and password. + # If user with does not exists it will be created. + # Default: demo/demo + #username: + #password: + # ELS instance to store Tasklist data + elasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + host: localhost + # Transport port + port: 9200 + # Zeebe instance + zeebe: + # Broker contact point + brokerContactPoint: localhost:26500 + # ELS instance to export Zeebe data to + zeebeElasticsearch: + # Cluster name + clusterName: elasticsearch + # Host + host: localhost + # Transport port + port: 9200 + # Index prefix, configured in Zeebe Elasticsearch exporter + prefix: zeebe-record +``` \ No newline at end of file diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/OWNERS b/versioned_docs/version-0.25/product-manuals/zeebe/OWNERS new file mode 100644 index 00000000000..32d9e877df6 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/OWNERS @@ -0,0 +1,10 @@ +approvers: +- zeebe + +reviewers: +- camundacloud +- devrel +- operate +- productmanagement +- tasklist +- zeebe diff --git a/docs/product-manuals/zeebe/appendix/broker-config-template.md b/versioned_docs/version-0.25/product-manuals/zeebe/appendix/broker-config-template.md similarity index 100% rename from docs/product-manuals/zeebe/appendix/broker-config-template.md rename to versioned_docs/version-0.25/product-manuals/zeebe/appendix/broker-config-template.md diff --git a/docs/product-manuals/zeebe/appendix/deprecated-features.md b/versioned_docs/version-0.25/product-manuals/zeebe/appendix/deprecated-features.md similarity index 100% rename from docs/product-manuals/zeebe/appendix/deprecated-features.md rename to versioned_docs/version-0.25/product-manuals/zeebe/appendix/deprecated-features.md diff --git a/docs/product-manuals/zeebe/appendix/environment-variables.md b/versioned_docs/version-0.25/product-manuals/zeebe/appendix/environment-variables.md similarity index 100% rename from docs/product-manuals/zeebe/appendix/environment-variables.md rename to versioned_docs/version-0.25/product-manuals/zeebe/appendix/environment-variables.md diff --git a/docs/product-manuals/zeebe/appendix/gateway-config-template.md b/versioned_docs/version-0.25/product-manuals/zeebe/appendix/gateway-config-template.md similarity index 100% rename from docs/product-manuals/zeebe/appendix/gateway-config-template.md rename to versioned_docs/version-0.25/product-manuals/zeebe/appendix/gateway-config-template.md diff --git a/docs/product-manuals/zeebe/appendix/gateway-health-probes.md b/versioned_docs/version-0.25/product-manuals/zeebe/appendix/gateway-health-probes.md similarity index 100% rename from docs/product-manuals/zeebe/appendix/gateway-health-probes.md rename to versioned_docs/version-0.25/product-manuals/zeebe/appendix/gateway-health-probes.md diff --git a/docs/product-manuals/zeebe/appendix/glossary.md b/versioned_docs/version-0.25/product-manuals/zeebe/appendix/glossary.md similarity index 100% rename from docs/product-manuals/zeebe/appendix/glossary.md rename to versioned_docs/version-0.25/product-manuals/zeebe/appendix/glossary.md diff --git a/docs/product-manuals/zeebe/basics/architecture.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/architecture.md similarity index 100% rename from docs/product-manuals/zeebe/basics/architecture.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/architecture.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/client-server.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/client-server.png new file mode 100644 index 00000000000..67a693a8445 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/client-server.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/cluster.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/cluster.png new file mode 100644 index 00000000000..e7869e7a2ad Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/cluster.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/commit.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/commit.png new file mode 100644 index 00000000000..1b57c518c8f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/commit.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/data-distribution.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/data-distribution.png new file mode 100644 index 00000000000..1c6da68aae1 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/data-distribution.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/exporters-stream.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/exporters-stream.png new file mode 100644 index 00000000000..7f8eff0fe36 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/exporters-stream.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/internal-processing-job.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/internal-processing-job.png new file mode 100644 index 00000000000..3671ba8b5fc Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/internal-processing-job.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/order-process.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/order-process.png new file mode 100644 index 00000000000..ea97e941d39 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/order-process.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/partition.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/partition.png new file mode 100644 index 00000000000..c60deb34726 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/partition.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/task-workers-subscriptions.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/task-workers-subscriptions.png new file mode 100644 index 00000000000..e55e2650c65 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/task-workers-subscriptions.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-conditions.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-conditions.png new file mode 100644 index 00000000000..6b3483e9519 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-conditions.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-data-flow.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-data-flow.png new file mode 100644 index 00000000000..29b0470dd9a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-data-flow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-events.png new file mode 100644 index 00000000000..499e5562651 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-events.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-parallel-gw.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-parallel-gw.png new file mode 100644 index 00000000000..b9208f0ec82 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-parallel-gw.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-parallel-mi.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-parallel-mi.png new file mode 100644 index 00000000000..2ff63f00b68 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-parallel-mi.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-sequence.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-sequence.png new file mode 100644 index 00000000000..55cebecee05 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflow-sequence.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflows-data-based-conditions.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflows-data-based-conditions.png new file mode 100644 index 00000000000..63126a12e57 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflows-data-based-conditions.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflows-parallel-gateway.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflows-parallel-gateway.png new file mode 100644 index 00000000000..e32ce06f1b9 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/workflows-parallel-gateway.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/zeebe-architecture.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/zeebe-architecture.png new file mode 100644 index 00000000000..fadeb2ac4a6 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/zeebe-architecture.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/zeebe-job-workers-graphic.png b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/zeebe-job-workers-graphic.png new file mode 100644 index 00000000000..7c848b00137 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/basics/assets/zeebe-job-workers-graphic.png differ diff --git a/docs/product-manuals/zeebe/basics/clustering.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/clustering.md similarity index 100% rename from docs/product-manuals/zeebe/basics/clustering.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/clustering.md diff --git a/docs/product-manuals/zeebe/basics/exporters.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/exporters.md similarity index 100% rename from docs/product-manuals/zeebe/basics/exporters.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/exporters.md diff --git a/docs/product-manuals/zeebe/basics/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/index.md similarity index 100% rename from docs/product-manuals/zeebe/basics/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/index.md diff --git a/docs/product-manuals/zeebe/basics/internal-processing.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/internal-processing.md similarity index 100% rename from docs/product-manuals/zeebe/basics/internal-processing.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/internal-processing.md diff --git a/docs/product-manuals/zeebe/basics/job-workers.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/job-workers.md similarity index 100% rename from docs/product-manuals/zeebe/basics/job-workers.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/job-workers.md diff --git a/docs/product-manuals/zeebe/basics/partitions.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/partitions.md similarity index 100% rename from docs/product-manuals/zeebe/basics/partitions.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/partitions.md diff --git a/docs/product-manuals/zeebe/basics/protocols.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/protocols.md similarity index 100% rename from docs/product-manuals/zeebe/basics/protocols.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/protocols.md diff --git a/docs/product-manuals/zeebe/basics/workflows.md b/versioned_docs/version-0.25/product-manuals/zeebe/basics/workflows.md similarity index 100% rename from docs/product-manuals/zeebe/basics/workflows.md rename to versioned_docs/version-0.25/product-manuals/zeebe/basics/workflows.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/data-flow-job-worker.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/data-flow-job-worker.png new file mode 100644 index 00000000000..76c1dce170a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/data-flow-job-worker.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/data-flow.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/data-flow.png new file mode 100644 index 00000000000..e526d24a089 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/data-flow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/merging-mapping.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/merging-mapping.png new file mode 100644 index 00000000000..821240dea84 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/merging-mapping.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/order-process.bpmn b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/order-process.bpmn new file mode 100644 index 00000000000..795babfcdcf --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/order-process.bpmn @@ -0,0 +1,80 @@ + + + + + SequenceFlow_0j6tsnn + + + + SequenceFlow_0j6tsnn + SequenceFlow_0baemzs + + + + SequenceFlow_0cu1bs2 + SequenceFlow_19klrd3 + + + SequenceFlow_19klrd3 + + + + + SequenceFlow_0baemzs + SequenceFlow_0cu1bs2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/order-process.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/order-process.png new file mode 100644 index 00000000000..c9185cf96a8 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/order-process.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/parallel-gateway.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/parallel-gateway.png new file mode 100644 index 00000000000..c0601d42b89 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/parallel-gateway.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/sequenceflow.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/sequenceflow.png new file mode 100644 index 00000000000..28e1e0f552d Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/sequenceflow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/sub-process.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/sub-process.gif new file mode 100644 index 00000000000..11d7467db21 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/sub-process.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/variable-scopes.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/variable-scopes.png new file mode 100644 index 00000000000..3caefe67e43 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/variable-scopes.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/workflow.bpmn b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/workflow.bpmn new file mode 100644 index 00000000000..335876fed45 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/workflow.bpmn @@ -0,0 +1,89 @@ + + + + + SequenceFlow_1bq1azi + + + + + + SequenceFlow_0ojoaqz + + + + + + + SequenceFlow_1bq1azi + SequenceFlow_09hqjpg + + + + + + SequenceFlow_09hqjpg + SequenceFlow_1ea1mpb + + + + + + SequenceFlow_1ea1mpb + SequenceFlow_0ojoaqz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/workflow.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/workflow.png new file mode 100644 index 00000000000..8576c92b106 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/workflow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/zeebe-modeler.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/zeebe-modeler.gif new file mode 100644 index 00000000000..1207cd82ab9 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/assets/zeebe-modeler.gif differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/bpmn-coverage.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/bpmn-coverage.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/bpmn-coverage.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/bpmn-coverage.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/bpmn-primer.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/bpmn-primer.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/bpmn-primer.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/bpmn-primer.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif new file mode 100644 index 00000000000..515cd46ccf7 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/bpmn-modeler-call-activity.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png new file mode 100644 index 00000000000..578f51f62f6 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-boundary-events.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-example.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-example.png new file mode 100644 index 00000000000..f765d428bbb Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/assets/call-activities-example.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/call-activities/call-activities.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/call-activities.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/call-activities/call-activities.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/call-activities.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/data-flow.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/data-flow.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/data-flow.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/data-flow.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif new file mode 100644 index 00000000000..321a73efae5 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png new file mode 100644 index 00000000000..369251e6636 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/assets/embedded-subprocess.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/embedded-subprocesses.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif new file mode 100644 index 00000000000..cef0a5d91af Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/bpmn-modeler-error-events.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-events.png new file mode 100644 index 00000000000..485efe55f98 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-events.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-throw-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-throw-events.png new file mode 100644 index 00000000000..d29bf7f811d Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/assets/error-throw-events.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/error-events/error-events.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/error-events.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/error-events/error-events.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/error-events.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif new file mode 100644 index 00000000000..351494ed46c Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png new file mode 100644 index 00000000000..5d97d9b781a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/assets/event-based-gateway.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/event-based-gateways/event-based-gateways.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/event-based-gateways.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/event-based-gateways/event-based-gateways.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/event-based-gateways.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/event-subprocess.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/event-subprocess.png new file mode 100644 index 00000000000..5942d9b7c18 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/event-subprocess.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif new file mode 100644 index 00000000000..65778cfc275 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/assets/zeebe-modeler-event-subprocess.gif differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/event-subprocesses/event-subprocesses.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/event-subprocesses.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/event-subprocesses/event-subprocesses.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/event-subprocesses.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/events.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/events.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/events.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/events.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif new file mode 100644 index 00000000000..c7a82ad2d7b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png new file mode 100644 index 00000000000..8ed0aa57627 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/assets/exclusive-gateway.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/exclusive-gateways.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/exclusive-gateways.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/exclusive-gateways.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/exclusive-gateways.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/gateways.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/gateways.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/gateways.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/gateways.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/markers.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/markers.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/markers.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/markers.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event-example.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event-example.png new file mode 100644 index 00000000000..ab18e08b0df Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event-example.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event.png new file mode 100644 index 00000000000..fe3c90e99a9 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-catch-event.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-event.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-event.gif new file mode 100644 index 00000000000..f2929004cd2 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-event.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-events.png new file mode 100644 index 00000000000..ad725453b3a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/assets/message-events.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/message-events/message-events.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/message-events.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/message-events/message-events.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/message-events.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif new file mode 100644 index 00000000000..6dcc71d791f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/bpmn-modeler-multi-instance.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png new file mode 100644 index 00000000000..40e112ba8ca Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-boundary-event.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-example.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-example.png new file mode 100644 index 00000000000..4d0b1b1ed19 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-example.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png new file mode 100644 index 00000000000..b1bec0a99e4 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-parallel.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png new file mode 100644 index 00000000000..9a40ce49737 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/assets/multi-instance-sequential.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/multi-instance/multi-instance.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/multi-instance.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/multi-instance/multi-instance.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/multi-instance.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/end-event.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/end-event.gif new file mode 100644 index 00000000000..5ca9e152d56 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/end-event.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/none-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/none-events.png new file mode 100644 index 00000000000..e663b785436 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/none-events.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/start-event.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/start-event.gif new file mode 100644 index 00000000000..80630c62aa9 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/assets/start-event.gif differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/none-events/none-events.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/none-events.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/none-events/none-events.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/none-events.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif new file mode 100644 index 00000000000..a6d1f404bd5 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateway.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png new file mode 100644 index 00000000000..5dd17410f98 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/assets/parallel-gateways.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/parallel-gateways/parallel-gateways.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/parallel-gateways.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/parallel-gateways/parallel-gateways.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/parallel-gateways.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-task.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-task.gif new file mode 100644 index 00000000000..f5e3ade7e3b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-task.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-tasks.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-tasks.png new file mode 100644 index 00000000000..ce6abaac16d Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/assets/receive-tasks.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/receive-tasks/receive-tasks.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/receive-tasks.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/receive-tasks/receive-tasks.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/receive-tasks.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.gif new file mode 100644 index 00000000000..7105e52c3e2 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.png new file mode 100644 index 00000000000..2d16cd3debd Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/service-task.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/task-headers.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/task-headers.gif new file mode 100644 index 00000000000..4e0d0acd48d Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/task-headers.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/variable-mappings.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/variable-mappings.gif new file mode 100644 index 00000000000..dbf641387c5 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/assets/variable-mappings.gif differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/service-tasks/service-tasks.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/service-tasks.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/service-tasks/service-tasks.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/service-tasks.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/subprocesses.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/subprocesses.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/subprocesses.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/subprocesses.md diff --git a/docs/product-manuals/zeebe/bpmn-workflows/tasks.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/tasks.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/tasks.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/tasks.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif new file mode 100644 index 00000000000..8049d97df26 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/interrupting-timer-event.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif new file mode 100644 index 00000000000..8ea2392492e Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/non-interrupting-timer-event.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/timer-events.png b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/timer-events.png new file mode 100644 index 00000000000..dc997f9cec4 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/assets/timer-events.png differ diff --git a/docs/product-manuals/zeebe/bpmn-workflows/timer-events/timer-events.md b/versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/timer-events.md similarity index 100% rename from docs/product-manuals/zeebe/bpmn-workflows/timer-events/timer-events.md rename to versioned_docs/version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/timer-events.md diff --git a/docs/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-1.gif b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-1.gif similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-1.gif rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-1.gif diff --git a/docs/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-2.gif b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-2.gif similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-2.gif rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/java-get-started-monitor-2.gif diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/order-process-simple.png b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/order-process-simple.png new file mode 100644 index 00000000000..e21a621bb1e Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/order-process-simple.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/order-process.png b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/order-process.png new file mode 100644 index 00000000000..25edc8f4f7f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/assets/order-process.png differ diff --git a/docs/product-manuals/zeebe/clients/go-client/get-started.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/get-started.md similarity index 100% rename from docs/product-manuals/zeebe/clients/go-client/get-started.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/get-started.md diff --git a/docs/product-manuals/zeebe/clients/go-client/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/index.md similarity index 100% rename from docs/product-manuals/zeebe/clients/go-client/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/go-client/index.md diff --git a/docs/product-manuals/zeebe/clients/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/index.md similarity index 100% rename from docs/product-manuals/zeebe/clients/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/index.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/cluster-topology-request.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/cluster-topology-request.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/cluster-topology-request.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/cluster-topology-request.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/data-pojo.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/data-pojo.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/data-pojo.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/data-pojo.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/index.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/index.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/job-worker-open.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/job-worker-open.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/job-worker-open.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/job-worker-open.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/workflow-deploy.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-deploy.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/workflow-deploy.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-deploy.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-nonblocking.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-nonblocking.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-nonblocking.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-nonblocking.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-with-result.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-with-result.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-with-result.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-with-result.md diff --git a/docs/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-1.gif b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-1.gif new file mode 100644 index 00000000000..ea85f37d050 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-1.gif differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-2.gif b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-2.gif new file mode 100644 index 00000000000..4168440cfe8 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-2.gif differ diff --git a/docs/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-3.gif b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-3.gif similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-3.gif rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/java-get-started-monitor-3.gif diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/order-process-simple.png b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/order-process-simple.png new file mode 100644 index 00000000000..e21a621bb1e Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/order-process-simple.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/order-process.png b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/order-process.png new file mode 100644 index 00000000000..25edc8f4f7f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/assets/order-process.png differ diff --git a/docs/product-manuals/zeebe/clients/java-client/get-started.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/get-started.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/get-started.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/get-started.md diff --git a/docs/product-manuals/zeebe/clients/java-client/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/index.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/index.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/logging.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/logging.md new file mode 100644 index 00000000000..6fe4752282a --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/logging.md @@ -0,0 +1,47 @@ +--- +id: logging +title: "Logging" +--- + +The client uses SLF4J for logging. It logs useful things, such as exception stack traces when a job handler fails execution. Using the SLF4J API, any SLF4J implementation can be plugged in. The following example uses Log4J 2. + +## Maven dependencies + +```xml + + org.apache.logging.log4j + log4j-slf4j-impl + 2.8.1 + + + + org.apache.logging.log4j + log4j-core + 2.8.1 + +``` + +## Configuration + +Add a file called `log4j2.xml` to the classpath of your application. Add the following content: + +```xml + + + + + + + + + + + + + +``` + +This will log every log message to the console. diff --git a/docs/product-manuals/zeebe/clients/java-client/setup.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/setup.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/setup.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/setup.md diff --git a/docs/product-manuals/zeebe/clients/java-client/testing.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/testing.md similarity index 100% rename from docs/product-manuals/zeebe/clients/java-client/testing.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/java-client/testing.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/c-sharp.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/c-sharp.md new file mode 100644 index 00000000000..90bac1e0023 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/c-sharp.md @@ -0,0 +1,10 @@ +--- +id: c-sharp +title: "C#" +--- + +The C# client is a community library maintained by [Christopher Zell](https://github.com/Zelldon). + +* [Source code](https://github.com/zeebe-io/zeebe-client-csharp) +* [Nuget package](https://www.nuget.org/packages/zb-client/) +* [API docs](https://zeebe-io.github.io/zeebe-client-csharp/index.html) diff --git a/docs/product-manuals/zeebe/clients/other-clients/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/index.md similarity index 100% rename from docs/product-manuals/zeebe/clients/other-clients/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/index.md diff --git a/docs/product-manuals/zeebe/clients/other-clients/javascript.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/javascript.md similarity index 100% rename from docs/product-manuals/zeebe/clients/other-clients/javascript.md rename to versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/javascript.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/python.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/python.md new file mode 100644 index 00000000000..72bc25c1d2f --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/python.md @@ -0,0 +1,9 @@ +--- +id: python +title: "Python" +--- + +The Python client is maintained by [Stéphane Ludwig](https://gitlab.com/stephane.ludwig). + +* [Source code](https://gitlab.com/stephane.ludwig/zeebe_python_grpc) +* [Pip package](https://pypi.org/project/zeebe-grpc/) diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/ruby.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/ruby.md new file mode 100644 index 00000000000..940de7cf2a4 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/ruby.md @@ -0,0 +1,9 @@ +--- +id: ruby +title: "Ruby" +--- + +The Ruby client is maintained by [Christian Nicolai](https://github.com/cmur2). + +* [Source code](https://github.com/zeebe-io/zeebe-client-ruby) +* [Ruby gem](https://rubygems.org/gems/zeebe-client) diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/rust.md b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/rust.md new file mode 100644 index 00000000000..ca39f032404 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/clients/other-clients/rust.md @@ -0,0 +1,10 @@ +--- +id: rust +title: "Rust" +--- + +The Rust client, Zeebest, is maintained by [Mackenzie Clark](https://github.com/xmclark). + +* [Source code](https://github.com/xmclark/zeebest) +* [Rust crate](https://docs.rs/zeebest/0.20.0/zeebest/) +* [Podcast interview with Mackenzie Clark](https://zeebe.buzzsprout.com/454051/1478953-zeebe-and-rust-interview-with-mackenzie-clark) diff --git a/docs/product-manuals/zeebe/contributing/building-zeebe.md b/versioned_docs/version-0.25/product-manuals/zeebe/contributing/building-zeebe.md similarity index 100% rename from docs/product-manuals/zeebe/contributing/building-zeebe.md rename to versioned_docs/version-0.25/product-manuals/zeebe/contributing/building-zeebe.md diff --git a/docs/product-manuals/zeebe/contributing/design-principles.md b/versioned_docs/version-0.25/product-manuals/zeebe/contributing/design-principles.md similarity index 100% rename from docs/product-manuals/zeebe/contributing/design-principles.md rename to versioned_docs/version-0.25/product-manuals/zeebe/contributing/design-principles.md diff --git a/docs/product-manuals/zeebe/contributing/transport-protocols.md b/versioned_docs/version-0.25/product-manuals/zeebe/contributing/transport-protocols.md similarity index 100% rename from docs/product-manuals/zeebe/contributing/transport-protocols.md rename to versioned_docs/version-0.25/product-manuals/zeebe/contributing/transport-protocols.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/Operate-Login-Page.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/Operate-Login-Page.png new file mode 100644 index 00000000000..402ad9d1346 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/Operate-Login-Page.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/order-process.bpmn b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/order-process.bpmn new file mode 100644 index 00000000000..2d9bfbf5704 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/order-process.bpmn @@ -0,0 +1,139 @@ + + + + + SequenceFlow_1xi4e3g + + + + + + SequenceFlow_1xi4e3g + SequenceFlow_071nik1 + + + + SequenceFlow_071nik1 + SequenceFlow_15wj1qo + + + + + SequenceFlow_15wj1qo + SequenceFlow_0ujwc35 + SequenceFlow_1girnrf + + + + + + + SequenceFlow_0ujwc35 + SequenceFlow_1rl28fn + + + + + + + SequenceFlow_1girnrf + SequenceFlow_08vb0ur + + + =orderValue>=100 + + + SequenceFlow_1rl28fn + SequenceFlow_08vb0ur + SequenceFlow_1qwc5nn + + + + + SequenceFlow_1qwc5nn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.0-complete-workflow.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.0-complete-workflow.png new file mode 100644 index 00000000000..357242d6fc4 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.0-complete-workflow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.1-initiate-payment-task.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.1-initiate-payment-task.png new file mode 100644 index 00000000000..3a52e57dd1f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.1-initiate-payment-task.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.10-end-event.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.10-end-event.png new file mode 100644 index 00000000000..2f6099187a1 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.10-end-event.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.11-process-id.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.11-process-id.png new file mode 100644 index 00000000000..dd93281eb6c Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.11-process-id.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.2-modeler-message-event.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.2-modeler-message-event.png new file mode 100644 index 00000000000..b5b54f2868f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.2-modeler-message-event.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.3-add-message-name.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.3-add-message-name.png new file mode 100644 index 00000000000..2d1e7b407fa Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.3-add-message-name.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.4-add-correlation-key.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.4-add-correlation-key.png new file mode 100644 index 00000000000..8cdeb2e5bfc Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.4-add-correlation-key.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.5-add-xor-gateway.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.5-add-xor-gateway.png new file mode 100644 index 00000000000..4551f270951 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.5-add-xor-gateway.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.6-label-xor-gateway.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.6-label-xor-gateway.png new file mode 100644 index 00000000000..d80b7cd01fb Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.6-label-xor-gateway.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.7-no-insurance-task.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.7-no-insurance-task.png new file mode 100644 index 00000000000..124fd82dd3b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.7-no-insurance-task.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.8-default-flow.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.8-default-flow.png new file mode 100644 index 00000000000..a7a0f0d664c Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.8-default-flow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.9-condition-expression.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.9-condition-expression.png new file mode 100644 index 00000000000..d3e9316007a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-3.9-condition-expression.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.0-workflow-in-operate.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.0-workflow-in-operate.png new file mode 100644 index 00000000000..6bbd7cd0552 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.0-workflow-in-operate.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png new file mode 100644 index 00000000000..624972e693c Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.1-workflow-instances-first-task.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.2-waiting-at-message.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.2-waiting-at-message.png new file mode 100644 index 00000000000..519fcd850ed Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.2-waiting-at-message.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.3-waiting-at-shipping.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.3-waiting-at-shipping.png new file mode 100644 index 00000000000..b5ec3ea9262 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.3-waiting-at-shipping.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.4-no-insurance-complete.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.4-no-insurance-complete.png new file mode 100644 index 00000000000..56f490f4aa6 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.4-no-insurance-complete.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.5-both-instances-complete.png b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.5-both-instances-complete.png new file mode 100644 index 00000000000..be341970540 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/assets/tutorial-4.5-both-instances-complete.png differ diff --git a/docs/product-manuals/zeebe/getting-started/create-a-workflow.md b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/create-a-workflow.md similarity index 100% rename from docs/product-manuals/zeebe/getting-started/create-a-workflow.md rename to versioned_docs/version-0.25/product-manuals/zeebe/getting-started/create-a-workflow.md diff --git a/docs/product-manuals/zeebe/getting-started/create-workflow-instance.md b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/create-workflow-instance.md similarity index 100% rename from docs/product-manuals/zeebe/getting-started/create-workflow-instance.md rename to versioned_docs/version-0.25/product-manuals/zeebe/getting-started/create-workflow-instance.md diff --git a/docs/product-manuals/zeebe/getting-started/deploy-a-workflow.md b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/deploy-a-workflow.md similarity index 100% rename from docs/product-manuals/zeebe/getting-started/deploy-a-workflow.md rename to versioned_docs/version-0.25/product-manuals/zeebe/getting-started/deploy-a-workflow.md diff --git a/docs/product-manuals/zeebe/getting-started/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/index.md similarity index 100% rename from docs/product-manuals/zeebe/getting-started/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/getting-started/index.md diff --git a/docs/product-manuals/zeebe/getting-started/next-steps-resources.md b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/next-steps-resources.md similarity index 100% rename from docs/product-manuals/zeebe/getting-started/next-steps-resources.md rename to versioned_docs/version-0.25/product-manuals/zeebe/getting-started/next-steps-resources.md diff --git a/docs/product-manuals/zeebe/getting-started/tutorial-setup.md b/versioned_docs/version-0.25/product-manuals/zeebe/getting-started/tutorial-setup.md similarity index 100% rename from docs/product-manuals/zeebe/getting-started/tutorial-setup.md rename to versioned_docs/version-0.25/product-manuals/zeebe/getting-started/tutorial-setup.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/introduction/assets/order-process.bpmn b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/assets/order-process.bpmn new file mode 100644 index 00000000000..c284e07ba2b --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/assets/order-process.bpmn @@ -0,0 +1,92 @@ + + + + + SequenceFlow_18tqka5 + + + SequenceFlow_1qj94z0 + + + + + + + + + + SequenceFlow_18tqka5 + SequenceFlow_10zt7r3 + + + + + + SequenceFlow_10zt7r3 + SequenceFlow_1t0gysp + + + + + + + SequenceFlow_1t0gysp + SequenceFlow_1qj94z0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/introduction/assets/order-process.png b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/assets/order-process.png new file mode 100644 index 00000000000..07e87b95d02 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/assets/order-process.png differ diff --git a/docs/product-manuals/zeebe/introduction/community-contributions.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/community-contributions.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/community-contributions.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/community-contributions.md diff --git a/docs/product-manuals/zeebe/introduction/get-help-get-involved.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/get-help-get-involved.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/get-help-get-involved.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/get-help-get-involved.md diff --git a/docs/product-manuals/zeebe/introduction/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/index.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/index.md diff --git a/docs/product-manuals/zeebe/introduction/install.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/install.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/install.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/install.md diff --git a/docs/product-manuals/zeebe/introduction/quickstart.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/quickstart.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/quickstart.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/quickstart.md diff --git a/docs/product-manuals/zeebe/introduction/release-cycle.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/release-cycle.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/release-cycle.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/release-cycle.md diff --git a/docs/product-manuals/zeebe/introduction/what-is-zeebe.md b/versioned_docs/version-0.25/product-manuals/zeebe/introduction/what-is-zeebe.md similarity index 100% rename from docs/product-manuals/zeebe/introduction/what-is-zeebe.md rename to versioned_docs/version-0.25/product-manuals/zeebe/introduction/what-is-zeebe.md diff --git a/docs/product-manuals/zeebe/kubernetes/accessing-operate.md b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/accessing-operate.md similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/accessing-operate.md rename to versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/accessing-operate.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/helm-service-account-role.yaml b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/helm-service-account-role.yaml new file mode 100644 index 00000000000..adff5fbfee6 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/helm-service-account-role.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: helm + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: helm +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: + - kind: ServiceAccount + name: helm + namespace: kube-system \ No newline at end of file diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/kind-values.yaml b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/kind-values.yaml new file mode 100644 index 00000000000..f5bfc84be18 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/kind-values.yaml @@ -0,0 +1,40 @@ +--- +zeebe-cluster: + elasticsearch: + imageTag: 6.8.3 +# Permit co-located instances for solitary minikube virtual machines. + antiAffinity: "soft" + +# Shrink default JVM heap. + esJavaOpts: "-Xmx128m -Xms128m" + +# Allocate smaller chunks of memory per pod. + resources: + requests: + cpu: "100m" + memory: "512M" + limits: + cpu: "1000m" + memory: "512M" + +# Request smaller persistent volumes. + volumeClaimTemplate: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "standard" + resources: + requests: + storage: 100M + extraInitContainers: | + - name: create + image: busybox:1.28 + command: ['mkdir', '/usr/share/elasticsearch/data/nodes/'] + volumeMounts: + - mountPath: /usr/share/elasticsearch/data + name: elasticsearch-master + - name: file-permissions + image: busybox:1.28 + command: ['chown', '-R', '1000:1000', '/usr/share/elasticsearch/'] + volumeMounts: + - mountPath: /usr/share/elasticsearch/data + name: elasticsearch-master + \ No newline at end of file diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/operate-dashboard.png b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/operate-dashboard.png new file mode 100644 index 00000000000..6cf03c57926 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/operate-dashboard.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/operate-login.png b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/operate-login.png new file mode 100644 index 00000000000..3c5ab99a659 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/operate-login.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-helm-charts.png b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-helm-charts.png new file mode 100644 index 00000000000..45cca1bb42a Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-helm-charts.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-k8s-helm.png b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-k8s-helm.png new file mode 100644 index 00000000000..1c03b939ed7 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-k8s-helm.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-operator-flow.png b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-operator-flow.png new file mode 100644 index 00000000000..e9182b72fe3 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/assets/zeebe-operator-flow.png differ diff --git a/docs/product-manuals/zeebe/kubernetes/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/index.md similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/index.md diff --git a/docs/product-manuals/zeebe/kubernetes/installing-helm.md b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/installing-helm.md similarity index 96% rename from docs/product-manuals/zeebe/kubernetes/installing-helm.md rename to versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/installing-helm.md index a31e4eecd27..daff45f9b1c 100644 --- a/docs/product-manuals/zeebe/kubernetes/installing-helm.md +++ b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/installing-helm.md @@ -45,10 +45,10 @@ Once this is done, we are ready to install any of the Helm Charts hosted in the In this section we are going to install all the available Zeebe components inside a Kubernetes Cluster. Notice that this Kubernetes cluster can have already running services and Zeebe is going to installed just as another set of services. ``` -> helm install zeebe/zeebe-full +> helm install --name zeebe/zeebe-full ``` -> Note: change >RELEASE NAME< with a name of your choice or use `--generate-name` option instead +> Note: change >RELEASE NAME< with a name of your choice > Notice that you can add the `-n` flag to specify in which Kubernetes namespace the components should be installed. Installing all the components in a cluster requires all the Docker images to be downloaded to the remote cluster, depending on which Cloud Provider you are using, the amount of time that it will take to fetch all the images will vary. @@ -88,7 +88,7 @@ Check that each Pod has at least 1/1 running instances. You can always tail the In order to interact with the services inside the cluster you need to use `port-forward` to route traffic from your environment to the cluster. ``` -> kubectl port-forward svc/-zeebe-gateway 26500:26500 +> kubectl port-forward svc/-zeebe 26500:26500 ``` Now you can connect and execute operations against your newly created Zeebe cluster. diff --git a/docs/product-manuals/zeebe/kubernetes/prerequisites.md b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/prerequisites.md similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/prerequisites.md rename to versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/prerequisites.md diff --git a/docs/product-manuals/zeebe/kubernetes/zeebe-operator.md b/versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/zeebe-operator.md similarity index 100% rename from docs/product-manuals/zeebe/kubernetes/zeebe-operator.md rename to versioned_docs/version-0.25/product-manuals/zeebe/kubernetes/zeebe-operator.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/operations/assets/example-setup-cluster.png b/versioned_docs/version-0.25/product-manuals/zeebe/operations/assets/example-setup-cluster.png new file mode 100644 index 00000000000..ba8f550286b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/operations/assets/example-setup-cluster.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/operations/assets/grafana-preview.png b/versioned_docs/version-0.25/product-manuals/zeebe/operations/assets/grafana-preview.png new file mode 100644 index 00000000000..fa7c90a93c7 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/operations/assets/grafana-preview.png differ diff --git a/docs/product-manuals/zeebe/operations/authentication.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/authentication.md similarity index 100% rename from docs/product-manuals/zeebe/operations/authentication.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/authentication.md diff --git a/docs/product-manuals/zeebe/operations/authorization.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/authorization.md similarity index 100% rename from docs/product-manuals/zeebe/operations/authorization.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/authorization.md diff --git a/docs/product-manuals/zeebe/operations/backpressure.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/backpressure.md similarity index 100% rename from docs/product-manuals/zeebe/operations/backpressure.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/backpressure.md diff --git a/docs/product-manuals/zeebe/operations/configuration.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/configuration.md similarity index 100% rename from docs/product-manuals/zeebe/operations/configuration.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/configuration.md diff --git a/docs/product-manuals/zeebe/operations/disk-space.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/disk-space.md similarity index 100% rename from docs/product-manuals/zeebe/operations/disk-space.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/disk-space.md diff --git a/docs/product-manuals/zeebe/operations/health.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/health.md similarity index 100% rename from docs/product-manuals/zeebe/operations/health.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/health.md diff --git a/docs/product-manuals/zeebe/operations/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/index.md similarity index 100% rename from docs/product-manuals/zeebe/operations/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/index.md diff --git a/docs/product-manuals/zeebe/operations/kubernetes.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/kubernetes.md similarity index 100% rename from docs/product-manuals/zeebe/operations/kubernetes.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/kubernetes.md diff --git a/docs/product-manuals/zeebe/operations/metrics.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/metrics.md similarity index 100% rename from docs/product-manuals/zeebe/operations/metrics.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/metrics.md diff --git a/docs/product-manuals/zeebe/operations/network-ports.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/network-ports.md similarity index 100% rename from docs/product-manuals/zeebe/operations/network-ports.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/network-ports.md diff --git a/docs/product-manuals/zeebe/operations/resource-planning.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/resource-planning.md similarity index 100% rename from docs/product-manuals/zeebe/operations/resource-planning.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/resource-planning.md diff --git a/docs/product-manuals/zeebe/operations/security.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/security.md similarity index 100% rename from docs/product-manuals/zeebe/operations/security.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/security.md diff --git a/docs/product-manuals/zeebe/operations/setting-up-a-cluster.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/setting-up-a-cluster.md similarity index 100% rename from docs/product-manuals/zeebe/operations/setting-up-a-cluster.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/setting-up-a-cluster.md diff --git a/docs/product-manuals/zeebe/operations/upgrade-zeebe.md b/versioned_docs/version-0.25/product-manuals/zeebe/operations/upgrade-zeebe.md similarity index 100% rename from docs/product-manuals/zeebe/operations/upgrade-zeebe.md rename to versioned_docs/version-0.25/product-manuals/zeebe/operations/upgrade-zeebe.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/activity-lifecycle.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/activity-lifecycle.png new file mode 100644 index 00000000000..b603cba33f7 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/activity-lifecycle.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/create-workflow-with-result.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/create-workflow-with-result.png new file mode 100644 index 00000000000..a0cacf75644 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/create-workflow-with-result.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/create-workflow.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/create-workflow.png new file mode 100644 index 00000000000..83ad10b517b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/create-workflow.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/event-lifecycle.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/event-lifecycle.png new file mode 100644 index 00000000000..329e1004845 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/event-lifecycle.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/pass-through-lifecycle.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/pass-through-lifecycle.png new file mode 100644 index 00000000000..5ade0b31af9 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/pass-through-lifecycle.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-mappings.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-mappings.png new file mode 100644 index 00000000000..0e6d0a26c43 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-mappings.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-propagation.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-propagation.png new file mode 100644 index 00000000000..7449feeb7c4 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-propagation.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-scopes.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-scopes.png new file mode 100644 index 00000000000..bf4d8bc4f1b Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/assets/variable-scopes.png differ diff --git a/docs/product-manuals/zeebe/reference/exporters.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/exporters.md similarity index 100% rename from docs/product-manuals/zeebe/reference/exporters.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/exporters.md diff --git a/docs/product-manuals/zeebe/reference/expressions.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/expressions.md similarity index 100% rename from docs/product-manuals/zeebe/reference/expressions.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/expressions.md diff --git a/docs/product-manuals/zeebe/reference/grpc.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/grpc.md similarity index 100% rename from docs/product-manuals/zeebe/reference/grpc.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/grpc.md diff --git a/docs/product-manuals/zeebe/reference/incidents.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/incidents.md similarity index 100% rename from docs/product-manuals/zeebe/reference/incidents.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/incidents.md diff --git a/docs/product-manuals/zeebe/reference/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/index.md similarity index 100% rename from docs/product-manuals/zeebe/reference/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/index.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-aggregator.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-aggregator.png new file mode 100644 index 00000000000..fabe84a4054 Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-aggregator.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-correlation.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-correlation.png new file mode 100644 index 00000000000..9bacea0712f Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-correlation.png differ diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-single-instance.png b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-single-instance.png new file mode 100644 index 00000000000..59e3ded0cab Binary files /dev/null and b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/assets/message-single-instance.png differ diff --git a/docs/product-manuals/zeebe/reference/message-correlation/message-correlation.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/message-correlation.md similarity index 100% rename from docs/product-manuals/zeebe/reference/message-correlation/message-correlation.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/message-correlation/message-correlation.md diff --git a/docs/product-manuals/zeebe/reference/variables.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/variables.md similarity index 100% rename from docs/product-manuals/zeebe/reference/variables.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/variables.md diff --git a/docs/product-manuals/zeebe/reference/workflow-instance-creation.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/workflow-instance-creation.md similarity index 100% rename from docs/product-manuals/zeebe/reference/workflow-instance-creation.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/workflow-instance-creation.md diff --git a/docs/product-manuals/zeebe/reference/workflow-lifecycles.md b/versioned_docs/version-0.25/product-manuals/zeebe/reference/workflow-lifecycles.md similarity index 100% rename from docs/product-manuals/zeebe/reference/workflow-lifecycles.md rename to versioned_docs/version-0.25/product-manuals/zeebe/reference/workflow-lifecycles.md diff --git a/docs/product-manuals/zeebe/tasklist-deployment-guide/authentication.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-deployment-guide/authentication.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-deployment-guide/authentication.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-deployment-guide/authentication.md diff --git a/docs/product-manuals/zeebe/tasklist-deployment-guide/configuration.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-deployment-guide/configuration.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-deployment-guide/configuration.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-deployment-guide/configuration.md diff --git a/docs/product-manuals/zeebe/tasklist-deployment-guide/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-deployment-guide/index.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-deployment-guide/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-deployment-guide/index.md diff --git a/docs/product-manuals/zeebe/tasklist-user-guide/basic-tasklist-navigation.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/basic-tasklist-navigation.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-user-guide/basic-tasklist-navigation.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/basic-tasklist-navigation.md diff --git a/docs/product-manuals/zeebe/tasklist-user-guide/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/index.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-user-guide/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/index.md diff --git a/docs/product-manuals/zeebe/tasklist-user-guide/install-and-start.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/install-and-start.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-user-guide/install-and-start.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/install-and-start.md diff --git a/docs/product-manuals/zeebe/tasklist-user-guide/tasklist-feedback-and-questions.md b/versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/tasklist-feedback-and-questions.md similarity index 100% rename from docs/product-manuals/zeebe/tasklist-user-guide/tasklist-feedback-and-questions.md rename to versioned_docs/version-0.25/product-manuals/zeebe/tasklist-user-guide/tasklist-feedback-and-questions.md diff --git a/docs/product-manuals/zeebe/yaml-workflows/control-flow.md b/versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/control-flow.md similarity index 100% rename from docs/product-manuals/zeebe/yaml-workflows/control-flow.md rename to versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/control-flow.md diff --git a/docs/product-manuals/zeebe/yaml-workflows/data-flow.md b/versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/data-flow.md similarity index 100% rename from docs/product-manuals/zeebe/yaml-workflows/data-flow.md rename to versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/data-flow.md diff --git a/docs/product-manuals/zeebe/yaml-workflows/index.md b/versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/index.md similarity index 100% rename from docs/product-manuals/zeebe/yaml-workflows/index.md rename to versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/index.md diff --git a/docs/product-manuals/zeebe/yaml-workflows/tasks.md b/versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/tasks.md similarity index 100% rename from docs/product-manuals/zeebe/yaml-workflows/tasks.md rename to versioned_docs/version-0.25/product-manuals/zeebe/yaml-workflows/tasks.md diff --git a/versioned_docs/version-0.25/product-manuals/zeebe/zeebe-overview.md b/versioned_docs/version-0.25/product-manuals/zeebe/zeebe-overview.md new file mode 100644 index 00000000000..d2dc5246f41 --- /dev/null +++ b/versioned_docs/version-0.25/product-manuals/zeebe/zeebe-overview.md @@ -0,0 +1,23 @@ +--- +id: zeebe-overview +title: "Zeebe: the Workflow engine for the Cloud Age" +--- + + + +### Zeebe is a cloud-native workflow engine for microservices orchestration + +- Define workflows graphically in BPMN 2.0 +- Choose any gRPC-supported programming language +- Deploy with Docker and Kubernetes (in the cloud or on-premises) +- Build workflows that react to events from Apache Kafka and other messaging platforms +- Scale horizontally to handle very high throughput +- Fault tolerance (no relational database required) +- Export workflow data for monitoring and analysis +- Engage with an active community + +**First Steps** + +- [Read up on Zeebe's core concepts](basics/index.md) +- [Run Zeebe with Docker or download a distribution](introduction/install.md) +- [Try the Getting Started tutorial](getting-started/index.md) diff --git a/docs/reference/cloud-console-api/cloud-console-api-clients.md b/versioned_docs/version-0.25/reference/cloud-console-api/cloud-console-api-clients.md similarity index 89% rename from docs/reference/cloud-console-api/cloud-console-api-clients.md rename to versioned_docs/version-0.25/reference/cloud-console-api/cloud-console-api-clients.md index 177ed5e4244..3dba4133ac9 100644 --- a/docs/reference/cloud-console-api/cloud-console-api-clients.md +++ b/versioned_docs/version-0.25/reference/cloud-console-api/cloud-console-api-clients.md @@ -3,9 +3,6 @@ id: cloud-console-api-clients title: Console API Clients --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - To interact with Camunda Cloud programmatically, without using the Camunda Cloud frontend, you can create Cloud API Clients. Cloud API Clients are created for an Organization, an therefore can access all Zeebe Clusters of this Organization. @@ -25,15 +22,6 @@ After a Cloud API Client is created, the Client Secret is only shown once! Pleas To retrieve a access token for the Cloud API Client: - - - - ```bash curl --header "Content-Type: application/json" \ --request POST \ @@ -41,10 +29,6 @@ curl --header "Content-Type: application/json" \ https://login.cloud.camunda.io/oauth/token ``` - - - - Please note: - Access tokens have a validity period that can be found in the access token. After this time a new Access Token must be requested. diff --git a/docs/reference/cloud-console-api/cloud-console-api-reference.md b/versioned_docs/version-0.25/reference/cloud-console-api/cloud-console-api-reference.md similarity index 100% rename from docs/reference/cloud-console-api/cloud-console-api-reference.md rename to versioned_docs/version-0.25/reference/cloud-console-api/cloud-console-api-reference.md diff --git a/versioned_docs/version-0.25/reference/overview.md b/versioned_docs/version-0.25/reference/overview.md new file mode 100644 index 00000000000..17331376136 --- /dev/null +++ b/versioned_docs/version-0.25/reference/overview.md @@ -0,0 +1,11 @@ +--- +id: overview +title: Overview Reference +sidebar_label: Overview Reference +slug: /reference/ +--- + +This section contains general reference material for Camunda Cloud, including API references. + +- [Console API Clients](cloud-console-api/cloud-console-api-clients.md) +- [Console API (REST)](cloud-console-api/cloud-console-api-reference.md) diff --git a/versioned_sidebars/version-0.25-sidebars.json b/versioned_sidebars/version-0.25-sidebars.json new file mode 100644 index 00000000000..cbca803886c --- /dev/null +++ b/versioned_sidebars/version-0.25-sidebars.json @@ -0,0 +1,839 @@ +{ + "version-0.25/Guides": [ + { + "type": "doc", + "id": "version-0.25/guides/introduction-to-camunda-cloud" + }, + { + "collapsed": true, + "type": "category", + "label": "Getting started with Camunda Cloud", + "items": [ + { + "type": "doc", + "id": "version-0.25/guides/getting-started/create-camunda-cloud-account" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/create-cluster" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/setup-client-connection-credentials" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/connect-to-your-cluster" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/model-your-first-process" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/deploy-your-process-and-start-process-instance" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/implement-service-task" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/implement-decision-gateway" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/involve-humans" + }, + { + "type": "doc", + "id": "version-0.25/guides/getting-started/monitor-your-process-in-operate" + } + ] + }, + { + "type": "doc", + "id": "version-0.25/guides/setting-up-development-project" + } + ], + "version-0.25/Product Manuals": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/overview" + }, + { + "collapsed": true, + "type": "category", + "label": "Clients", + "items": [ + { + "collapsed": true, + "type": "category", + "label": "NodeJS", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/clients/nodejs/install-the-nodejs-client" + } + ] + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/clients/build-your-own-client" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Cloud Console", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/overview" + }, + { + "collapsed": true, + "type": "category", + "label": "Manage your Cloud Account", + "items": [ + { + "type": "doc", + "id": "version-0.25/guides/getting-started/create-camunda-cloud-account" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/manage-cloud-account/administrate-account" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Manage Clusters", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/manage-clusters/create-cluster" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/manage-clusters/manage-client-connections" + }, + { + "type": "doc", + "id": "version-0.25/reference/cloud-console-api/cloud-console-api-reference" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Manage your Plan", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/manage-plan/available-plans" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/manage-plan/trial-plan" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/cloud-console/manage-plan/professional-plan" + } + ] + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Modeler", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/modeler/install-the-modeler" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Zeebe Engine", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/zeebe-overview" + }, + { + "collapsed": true, + "type": "category", + "label": "Introduction", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/what-is-zeebe" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/install" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/quickstart" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/community-contributions" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/get-help-get-involved" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/introduction/release-cycle" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Basics", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/architecture" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/workflows" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/job-workers" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/partitions" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/protocols" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/internal-processing" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/exporters" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/basics/clustering" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Getting Started Tutorial", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/getting-started/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/getting-started/tutorial-setup" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/getting-started/create-a-workflow" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/getting-started/deploy-a-workflow" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/getting-started/create-workflow-instance" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/getting-started/next-steps-resources" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "BPMN Workflow", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/bpmn-primer" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/bpmn-coverage" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/data-flow" + }, + { + "collapsed": true, + "type": "category", + "label": "Tasks", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/tasks" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/service-tasks/service-tasks" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/receive-tasks/receive-tasks" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Gateways", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/gateways" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/exclusive-gateways/exclusive-gateways" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/parallel-gateways/parallel-gateways" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/event-based-gateways/event-based-gateways" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Events", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/events" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/none-events/none-events" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/message-events/message-events" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/timer-events/timer-events" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/error-events/error-events" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Subprocesses", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/subprocesses" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/embedded-subprocesses/embedded-subprocesses" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/call-activities/call-activities" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/event-subprocesses/event-subprocesses" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Markers", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/markers" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/bpmn-workflows/multi-instance/multi-instance" + } + ] + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "YAML Workflows", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/yaml-workflows/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/yaml-workflows/tasks" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/yaml-workflows/control-flow" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/yaml-workflows/data-flow" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Reference", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/workflow-instance-creation" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/workflow-lifecycles" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/variables" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/expressions" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/message-correlation/message-correlation" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/incidents" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/grpc" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/reference/exporters" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Zeebe Client Libraries", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/index" + }, + { + "collapsed": true, + "type": "category", + "label": "Zeebe Java Client", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client/setup" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client/get-started" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client/logging" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client/testing" + }, + { + "collapsed": true, + "type": "category", + "label": "Example Code using the Zeebe Java Client", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-deploy" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-nonblocking" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/workflow-instance-create-with-result" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/job-worker-open" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/data-pojo" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/java-client-examples/cluster-topology-request" + } + ] + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Zeebe Go Client", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/go-client/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/go-client/get-started" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Community Supported Clients", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/other-clients/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/other-clients/c-sharp" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/other-clients/javascript" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/other-clients/python" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/other-clients/ruby" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/clients/other-clients/rust" + } + ] + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Zeebe Operations", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/configuration" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/resource-planning" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/network-ports" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/setting-up-a-cluster" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/metrics" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/kubernetes" + }, + { + "collapsed": true, + "type": "category", + "label": "Security", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/security" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/authentication" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/authorization" + } + ] + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/health" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/backpressure" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/disk-space" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/operations/upgrade-zeebe" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Zeebe on Kubernetes", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/kubernetes/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/kubernetes/prerequisites" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/kubernetes/installing-helm" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/kubernetes/accessing-operate" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/kubernetes/zeebe-operator" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Appendix", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/appendix/glossary" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/appendix/broker-config-template" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/appendix/gateway-config-template" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/appendix/gateway-health-probes" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/appendix/environment-variables" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/zeebe/appendix/deprecated-features" + } + ] + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Operate", + "items": [ + { + "collapsed": true, + "type": "category", + "label": "Deployment Guide", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/deployment/configuration" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/deployment/data-retention" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/deployment/schema-and-migration" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/deployment/importer-and-archiver" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/deployment/authentication" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "User Guide", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/userguide/index" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/userguide/install-and-start" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/userguide/basic-operate-navigation" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/userguide/resolve-incidents-update-variables" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/userguide/selections-batch-operations" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/operate/userguide/operate-feedback-and-questions" + } + ] + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Tasklist", + "items": [ + { + "collapsed": true, + "type": "category", + "label": "Deployment Guide", + "items": [ + { + "type": "doc", + "id": "version-0.25/product-manuals/tasklist/deployment/configuration" + }, + { + "type": "doc", + "id": "version-0.25/product-manuals/tasklist/deployment/authentication" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "User Guide", + "items": [] + } + ] + } + ], + "version-0.25/Reference": [ + { + "type": "doc", + "id": "version-0.25/reference/overview" + }, + { + "collapsed": true, + "type": "category", + "label": "Console API", + "items": [ + { + "type": "doc", + "id": "version-0.25/reference/cloud-console-api/cloud-console-api-clients" + }, + { + "type": "doc", + "id": "version-0.25/reference/cloud-console-api/cloud-console-api-reference" + } + ] + } + ] +} diff --git a/versions.json b/versions.json new file mode 100644 index 00000000000..4e8318c9433 --- /dev/null +++ b/versions.json @@ -0,0 +1,3 @@ +[ + "0.25" +]