Merge branch 'main' into stickiesMarkdown

This commit is contained in:
Deborah Barnard 2022-04-25 10:27:30 +01:00
commit f57114405f
120 changed files with 6528 additions and 94 deletions

5
.vale.ini Normal file
View File

@ -0,0 +1,5 @@
StylesPath = "styles"
MinAlertLevel = warning
Vocab = default
[*.md]
BasedOnStyles = alex, write-good, Microsoft, n8n-styles

View File

@ -1,14 +1,12 @@
# Contributing
## Overview
If you want to contribute to this repository - thank you! Beforehand, we encourage you to have a look at the existing documentation to get an idea of the structure and writing conventions we use. In writing your documentation, please follow the guidelines described below, in order to ensure quality and consistency with our style.
If you want to contribute to this repository - thank you! Before you start, have a look at the existing documentation to get an idea of the structure and writing conventions n8n uses. In writing your documentation, please follow the guidelines described below, to ensure quality and consistency with n8n styles.
## Documenting nodes
* **Nodes and trigger nodes:** Create a directory with the name of the node at `docs/integrations/nodes/` or `docs/integrations/trigger-nodes` containing:
- A text file named `n8n-nodes-base.<node-nam>.md` describing the functionality of the relevant node.
* **Credentials:** Create a directory with the name of the node at `docs/integrations/credentials/` containing:
* **Nodes and trigger nodes:** Create a directory with the name of the node at `docs/integrations/nodes/` or `docs/integrations/trigger-nodes/` containing:
- A text file named `n8n-nodes-base.<node-name>.md` describing the functionality of the relevant node.
* **Credentials:** Create a document with the name of the node at `docs/integrations/credentials/` containing:
- A text file with the node name describing how to obtain credentials for the relevant node.
A standard node doc includes the following parts:
@ -18,6 +16,7 @@ A standard node doc includes the following parts:
- Enter the resources and operations exactly as they are named in the nodes.
In the credentials doc:
* If there is more than one authentication method, list OAuth first.
* If possible, avoid documenting external products. Instead, provide links to the relevant product documentation. For example, for guidance on getting credentials (such as how to get an API token for a service), provide a link to the product's API authentication docs.
@ -26,30 +25,7 @@ In the credentials doc:
n8n uses the [Microsoft Writing Style Guide](https://docs.microsoft.com/en-us/style-guide/welcome/).
Some quick tips:
* Plain language:
* Clearly explain each step of the process you are documenting.
* Use present tense, active voice, and "you"-form to address the readers.
* Keep your writing as concise as possible. [Hemingway](https://hemingwayapp.com/) is a free browser app to measure language complexity. There is no fixed rule about what grade to aim for, but the lower the reading grade, the better.
* Formatting:
* Make sure you match brand names precisely. For example: "GitHub", not "Github".
* Headings should be sentence case
* Use bold when referring to UI elements. For example, "Click **Save** to proceed."
* Add commit messages in [this](https://gist.github.com/parmentf/035de27d6ed1dce0b36a) format.
### Screenshots
If your contribution includes screenshots, please make sure that they meet the following criteria:
- Only the Editor UI appears in the screenshot. Anything else, like the browser frame, tabs, and so on, should be omitted.
- After zooming in once, the Editor UI is 23 boxes wide and 9 boxes tall.
- The nodes have a distance of two boxes between them.
- The nodes fit inside the boxes (as much as they can).
- The workflow is centered in the Editor canvas.
- If the workflow uses a Trigger node, the Start node doesn't appear in the Editor canvas.
- In recorded GIFs, the cursor movements in the GIF are slow and easy to follow. A good rule of thumb is that the speed should be about 75% of your regular speed. In any case, make sure that GIFs capture every step of the process at a steady pace.
Refer to [Styles](https://github.com/n8n-io/n8n-docs/wiki/Styles/) for a quickstart, and guidance on style linting.
## General checklist

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

View File

@ -1,5 +1,5 @@
# Weird ones after IA launch
/integrations/nodes/core-nodes/n8n-nodes-base.function/ /integrations/core-nodes/n8n-nodes-base.function/
# Updated during IA work
/getting-started/key-components/ /workflows/
@ -27,12 +27,24 @@
/reference/telemetry.html /reference/data-collection/
/reference/troubleshooting.html /hosting/installation/npm/
/reference/contributing.html /contributing/
/reference/release-notes.html /reference/release-notes/
/reference/release-notes.html /reference/release-notes/
/reference/server-setup.html /hosting/server-setups/
# The nodes library . . . may the odds be ever in your favour
/credentials/* /integrations/credentials/:splat
/nodes/creating-nodes/* /integrations/creating-nodes/code/:splat
/nodes/creating-nodes/ /integrations/creating-nodes/
/nodes/creating-nodes/general-guidelines.html /integrations/creating-nodes/code/standards/
/nodes/creating-nodes/create-node.html /integrations/creating-nodes/code/create-first-node/
/nodes/creating-nodes/create-n8n-nodes-module.html /integrations/creating-nodes/code/create-n8n-nodes-module/
/nodes/creating-nodes/create-trigger-node.html /integrations/creating-nodes/code/create-trigger-node/
/nodes/creating-nodes/node-dev-cli.html /integrations/creating-nodes/code/node-dev-cli/
/nodes/creating-nodes/node-elements.html /integrations/creating-nodes/code/ui-elements/
/nodes/creating-nodes/making-http-requests.html /integrations/creating-nodes/code/http-helpers/
/nodes/creating-nodes/node-linter.html /integrations/creating-nodes/code/node-linter/
/nodes/creating-nodes/node-review-checklist.html /integrations/creating-nodes/code/review-checklist/
/nodes/creating-nodes/troubleshooting.html /integrations/creating-nodes/code/troubleshooting-node-development/
/nodes/expressions/* /code-examples/expressions/:splat
@ -40,35 +52,59 @@
/nodes/creating-nodes/ /integrations/creating-nodes/
/nodes/credentials/ /integrations/credentials/
/nodes/n8n-nodes-base.actionNetwork/ /integrations/nodes/n8n-nodes-base.actionNetwork/
/nodes/n8n-nodes-base.actionnetwork/ /integrations/nodes/n8n-nodes-base.actionNetwork/
/nodes/n8n-nodes-base.activationTrigger/ /integrations/core-nodes/n8n-nodes-base.activationTrigger/
/nodes/n8n-nodes-base.activationtrigger/ /integrations/core-nodes/n8n-nodes-base.activationTrigger/
/nodes/n8n-nodes-base.activeCampaign/ /integrations/nodes/n8n-nodes-base.activeCampaign/
/nodes/n8n-nodes-base.activecampaign/ /integrations/nodes/n8n-nodes-base.activeCampaign/
/nodes/n8n-nodes-base.activeCampaignTrigger/ /integrations/trigger-nodes/n8n-nodes-base.activeCampaignTrigger/
/nodes/n8n-nodes-base.activecampaigntrigger/ /integrations/trigger-nodes/n8n-nodes-base.activeCampaignTrigger/
/nodes/n8n-nodes-base.acuitySchedulingTrigger/ /integrations/trigger-nodes/n8n-nodes-base.acuitySchedulingTrigger/
/nodes/n8n-nodes-base.acuityschedulingtrigger/ /integrations/trigger-nodes/n8n-nodes-base.acuitySchedulingTrigger/
/nodes/n8n-nodes-base.affinity/ /integrations/nodes/n8n-nodes-base.affinity/
/nodes/n8n-nodes-base.affinityTrigger/ /integrations/trigger-nodes/n8n-nodes-base.affinityTrigger/
/nodes/n8n-nodes-base.affinitytrigger/ /integrations/trigger-nodes/n8n-nodes-base.affinityTrigger/
/nodes/n8n-nodes-base.agileCrm/ /integrations/nodes/n8n-nodes-base.agileCrm/
/nodes/n8n-nodes-base.agilecrm/ /integrations/nodes/n8n-nodes-base.agileCrm/
/nodes/n8n-nodes-base.airtable/ /integrations/nodes/n8n-nodes-base.airtable/
/nodes/n8n-nodes-base.airtableTrigger/ /integrations/trigger-nodes/n8n-nodes-base.airtableTrigger/
/nodes/n8n-nodes-base.airtabletrigger/ /integrations/trigger-nodes/n8n-nodes-base.airtableTrigger/
/nodes/n8n-nodes-base.amqp/ /integrations/nodes/n8n-nodes-base.amqp/
/nodes/n8n-nodes-base.amqpTrigger/ /integrations/trigger-nodes/n8n-nodes-base.amqpTrigger/
/nodes/n8n-nodes-base.amqptrigger/ /integrations/trigger-nodes/n8n-nodes-base.amqpTrigger/
/nodes/n8n-nodes-base.apiTemplateIo/ /integrations/nodes/n8n-nodes-base.apiTemplateIo/
/nodes/n8n-nodes-base.apitemplateio/ /integrations/nodes/n8n-nodes-base.apiTemplateIo/
/nodes/n8n-nodes-base.asana/ /integrations/nodes/n8n-nodes-base.asana/
/nodes/n8n-nodes-base.asanaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.asanaTrigger/
/nodes/n8n-nodes-base.asanatrigger/ /integrations/trigger-nodes/n8n-nodes-base.asanaTrigger/
/nodes/n8n-nodes-base.automizy/ /integrations/nodes/n8n-nodes-base.automizy/
/nodes/n8n-nodes-base.autopilot/ /integrations/nodes/n8n-nodes-base.autopilot/
/nodes/n8n-nodes-base.autopilotTrigger/ /integrations/trigger-nodes/n8n-nodes-base.autopilotTrigger/
/nodes/n8n-nodes-base.autopilottrigger/ /integrations/trigger-nodes/n8n-nodes-base.autopilotTrigger/
/nodes/n8n-nodes-base.awsComprehend/ /integrations/nodes/n8n-nodes-base.awsComprehend/
/nodes/n8n-nodes-base.awscomprehend/ /integrations/nodes/n8n-nodes-base.awsComprehend/
/nodes/n8n-nodes-base.awsDynamoDb/ /integrations/nodes/n8n-nodes-base.awsDynamoDb/
/nodes/n8n-nodes-base.awsdynamodb/ /integrations/nodes/n8n-nodes-base.awsDynamoDb/
/nodes/n8n-nodes-base.awsLambda/ /integrations/nodes/n8n-nodes-base.awsLambda/
/nodes/n8n-nodes-base.awslambda/ /integrations/nodes/n8n-nodes-base.awsLambda/
/nodes/n8n-nodes-base.awsRekognition/ /integrations/nodes/n8n-nodes-base.awsRekognition/
/nodes/n8n-nodes-base.awsrekognition/ /integrations/nodes/n8n-nodes-base.awsRekognition/
/nodes/n8n-nodes-base.awsS3/ /integrations/nodes/n8n-nodes-base.awsS3/
/nodes/n8n-nodes-base.aws3/ /integrations/nodes/n8n-nodes-base.awsS3/
/nodes/n8n-nodes-base.awsSes/ /integrations/nodes/n8n-nodes-base.awsSes/
/nodes/n8n-nodes-base.awsses/ /integrations/nodes/n8n-nodes-base.awsSes/
/nodes/n8n-nodes-base.awsSns/ /integrations/nodes/n8n-nodes-base.awsSns/
/nodes/n8n-nodes-base.awssns/ /integrations/nodes/n8n-nodes-base.awsSns/
/nodes/n8n-nodes-base.awsSnsTrigger/ /integrations/trigger-nodes/n8n-nodes-base.awsSnsTrigger/
/nodes/n8n-nodes-base.awssnstrigger/ /integrations/trigger-nodes/n8n-nodes-base.awsSnsTrigger/
/nodes/n8n-nodes-base.awsSqs/ /integrations/nodes/n8n-nodes-base.awsSqs/
/nodes/n8n-nodes-base.awssqs/ /integrations/nodes/n8n-nodes-base.awsSqs/
/nodes/n8n-nodes-base.awsTextract/ /integrations/nodes/n8n-nodes-base.awsTextract/
/nodes/n8n-nodes-base.awstextract/ /integrations/nodes/n8n-nodes-base.awsTextract/
/nodes/n8n-nodes-base.awsTranscribe/ /integrations/nodes/n8n-nodes-base.awsTranscribe/
/nodes/n8n-nodes-base.awstranscribe/ /integrations/nodes/n8n-nodes-base.awsTranscribe/
/nodes/n8n-nodes-base.bambooHr/ /integrations/nodes/n8n-nodes-base.bambooHr/
/nodes/n8n-nodes-base.bamboohr/ /integrations/nodes/n8n-nodes-base.bambooHr/
/nodes/n8n-nodes-base.bannerbear/ /integrations/nodes/n8n-nodes-base.bannerbear/
/nodes/n8n-nodes-base.baserow/ /integrations/nodes/n8n-nodes-base.baserow/
/nodes/n8n-nodes-base.beeminder/ /integrations/nodes/n8n-nodes-base.beeminder/
@ -93,7 +129,7 @@
/nodes/n8n-nodes-base.cockpit/ /integrations/nodes/n8n-nodes-base.cockpit/
/nodes/n8n-nodes-base.coda/ /integrations/nodes/n8n-nodes-base.coda/
/nodes/n8n-nodes-base.coinGecko/ /integrations/nodes/n8n-nodes-base.coinGecko/
/nodes/n8n-nodes-base.compression/ /integrations/nodes/core-nodes/n8n-nodes-base.compression/
/nodes/n8n-nodes-base.compression/ /integrations/core-nodes/n8n-nodes-base.compression/
/nodes/n8n-nodes-base.contentful/ /integrations/nodes/n8n-nodes-base.contentful/
/nodes/n8n-nodes-base.convertKit/ /integrations/nodes/n8n-nodes-base.convertKit/
/nodes/n8n-nodes-base.convertKitTrigger/ /integrations/trigger-nodes/n8n-nodes-base.convertKitTrigger/
@ -101,11 +137,12 @@
/nodes/n8n-nodes-base.copperTrigger/ /integrations/trigger-nodes/n8n-nodes-base.copperTrigger/
/nodes/n8n-nodes-base.cortex/ /integrations/nodes/n8n-nodes-base.cortex/
/nodes/n8n-nodes-base.crateDb/ /integrations/nodes/n8n-nodes-base.crateDb/
/nodes/n8n-nodes-base.cron/ /integrations/nodes/core-nodes/n8n-nodes-base.cron/
/nodes/n8n-nodes-base.crypto/ /integrations/nodes/core-nodes/n8n-nodes-base.crypto/
/nodes/n8n-nodes-base.cron/ /integrations/core-nodes/n8n-nodes-base.cron/
/nodes/n8n-nodes-base.crypto/ /integrations/core-nodes/n8n-nodes-base.crypto/
/nodes/n8n-nodes-base.customerIo/ /integrations/nodes/n8n-nodes-base.customerIo/
/nodes/n8n-nodes-base.customerIoTrigger/ /integrations/trigger-nodes/n8n-nodes-base.customerIoTrigger/
/nodes/n8n-nodes-base.dateTime/ /integrations/nodes/core-nodes/n8n-nodes-base.dateTime/
/nodes/n8n-nodes-base.dateTime/ /integrations/core-nodes/n8n-nodes-base.dateTime/
/nodes/n8n-nodes-base.datetime/ /integrations/nodes/n8n-nodes-base.dateTime/
/nodes/n8n-nodes-base.deepL/ /integrations/nodes/n8n-nodes-base.deepL/
/nodes/n8n-nodes-base.demio/ /integrations/nodes/n8n-nodes-base.demio/
/nodes/n8n-nodes-base.dhl/ /integrations/nodes/n8n-nodes-base.dhl/
@ -115,19 +152,21 @@
/nodes/n8n-nodes-base.drift/ /integrations/nodes/n8n-nodes-base.drift/
/nodes/n8n-nodes-base.dropbox/ /integrations/nodes/n8n-nodes-base.dropbox/
/nodes/n8n-nodes-base.dropcontact/ /integrations/nodes/n8n-nodes-base.dropcontact/
/nodes/n8n-nodes-base.editImage/ /integrations/nodes/core-nodes/n8n-nodes-base.editImage/
/nodes/n8n-nodes-base.editImage/ /integrations/core-nodes/n8n-nodes-base.editImage/
/nodes/n8n-nodes-base.egoi/ /integrations/nodes/n8n-nodes-base.egoi/
/nodes/n8n-nodes-base.elasticsearch/ /integrations/nodes/n8n-nodes-base.elasticsearch/
/nodes/n8n-nodes-base.elasticSecurity/ /integrations/nodes/n8n-nodes-base.elasticSecurity/
/nodes/n8n-nodes-base.emailReadImap/ /integrations/core-nodes/n8n-nodes-base.imapEmail/
/nodes/n8n-nodes-base.emailSend/ /integrations/core-nodes/n8n-nodes-base.sendEmail/
/nodes/n8n-nodes-base.emailsend/ /integrations/core-nodes/n8n-nodes-base.sendEmail/
/nodes/n8n-nodes-base.emelia/ /integrations/nodes/n8n-nodes-base.emelia/
/nodes/n8n-nodes-base.emeliaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.emeliaTrigger/
/nodes/n8n-nodes-base.erpNext/ /integrations/nodes/n8n-nodes-base.erpNext/
/nodes/n8n-nodes-base.errorTrigger/ /integrations/core-nodes/n8n-nodes-base.errorTrigger/
/nodes/n8n-nodes-base.eventbriteTrigger/ /integrations/trigger-nodes/n8n-nodes-base.eventbriteTrigger/
/nodes/n8n-nodes-base.executeCommand/ /integrations/nodes/core-nodes/n8n-nodes-base.executeCommand/
/nodes/n8n-nodes-base.executeWorkflow/ /integrations/nodes/core-nodes/n8n-nodes-base.executeWorkflow/
/nodes/n8n-nodes-base.executeCommand/ /integrations/core-nodes/n8n-nodes-base.executeCommand/
/nodes/n8n-nodes-base.executecommand/ /integrations/core-nodes/n8n-nodes-base.executeCommand/
/nodes/n8n-nodes-base.executeWorkflow/ /integrations/core-nodes/n8n-nodes-base.executeWorkflow/
/nodes/n8n-nodes-base.facebookGraphApi/ /integrations/nodes/n8n-nodes-base.facebookGraphAPI/
/nodes/n8n-nodes-base.facebookTrigger/ /integrations/trigger-nodes/n8n-nodes-base.facebookTrigger/
/nodes/n8n-nodes-base.figmaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.figmaTrigger/
@ -139,9 +178,10 @@
/nodes/n8n-nodes-base.freshdesk/ /integrations/nodes/n8n-nodes-base.freshdesk/
/nodes/n8n-nodes-base.freshservice/ /integrations/nodes/n8n-nodes-base.freshservice/
/nodes/n8n-nodes-base.freshworksCrm/ /integrations/nodes/n8n-nodes-base.freshworksCrm/
/nodes/n8n-nodes-base.ftp/ /integrations/nodes/core-nodes/n8n-nodes-base.ftp/
/nodes/n8n-nodes-base.function/ /integrations/nodes/core-nodes/n8n-nodes-base.function/
/nodes/n8n-nodes-base.functionItem/ /integrations/nodes/core-nodes/n8n-nodes-base.functionItem/
/nodes/n8n-nodes-base.ftp/ /integrations/core-nodes/n8n-nodes-base.ftp/
/nodes/n8n-nodes-base.function/ /integrations/core-nodes/n8n-nodes-base.function/
/nodes/n8n-nodes-base.functionItem/ /integrations/core-nodes/n8n-nodes-base.functionItem/
/nodes/n8n-nodes-base.functionitem/ /integrations/core-nodes/n8n-nodes-base.functionItem/
/nodes/n8n-nodes-base.getResponse/ /integrations/nodes/n8n-nodes-base.getResponse/
/nodes/n8n-nodes-base.getResponseTrigger/ /integrations/trigger-nodes/n8n-nodes-base.getResponseTrigger/
/nodes/n8n-nodes-base.ghost/ /integrations/nodes/n8n-nodes-base.ghost/
@ -165,7 +205,8 @@
/nodes/n8n-nodes-base.googleFirebaseCloudFirestore/ /integrations/nodes/n8n-nodes-base.googleFirebaseCloudFirestore/
/nodes/n8n-nodes-base.googleFirebaseRealtimeDatabase/ /integrations/nodes/n8n-nodes-base.googleFirebaseRealtimeDatabase/
/nodes/n8n-nodes-base.googlePerspective/ /integrations/nodes/n8n-nodes-base.googlePerspective/
/nodes/n8n-nodes-base.googleSheets/ /integrations/nodes/n8n-nodes-base.googleSheets/
/nodes/n8n-nodes-base.googleSheets/ /integrations/nodes/n8n-nodes-base.googleSheets/
/nodes/n8n-nodes-base.googlesheets/ /integrations/nodes/n8n-nodes-base.googleSheets/
/nodes/n8n-nodes-base.googleSlides/ /integrations/nodes/n8n-nodes-base.googleSlides/
/nodes/n8n-nodes-base.googleTasks/ /integrations/nodes/n8n-nodes-base.googleTasks/
/nodes/n8n-nodes-base.googleTranslate/ /integrations/nodes/n8n-nodes-base.googleTranslate/
@ -195,8 +236,8 @@
/nodes/n8n-nodes-base.interval/ /integrations/core-nodes/n8n-nodes-base.interval/
/nodes/n8n-nodes-base.invoiceNinja/ /integrations/nodes/n8n-nodes-base.invoiceNinja/
/nodes/n8n-nodes-base.invoiceNinjaTrigger/ /integrations/trigger-nodes/n8n-nodes-base.invoiceNinjaTrigger/
/nodes/n8n-nodes-base.itemLists/ /integrations/core-core-nodes/n8n-nodes-base.itemLists/
/nodes/n8n-nodes-base.itemlists/ /integrations/core-core-nodes/n8n-nodes-base.itemLists/
/nodes/n8n-nodes-base.itemLists/ /integrations/core-nodes/n8n-nodes-base.itemLists/
/nodes/n8n-nodes-base.itemlists/ /integrations/core-nodes/n8n-nodes-base.itemLists/
/nodes/n8n-nodes-base.iterable/ /integrations/nodes/n8n-nodes-base.iterable/
/nodes/n8n-nodes-base.jenkins/ /integrations/nodes/n8n-nodes-base.jenkins/
/nodes/n8n-nodes-base.jira/ /integrations/nodes/n8n-nodes-base.jira/
@ -224,6 +265,7 @@
/nodes/n8n-nodes-base.mailjet/ /integrations/nodes/n8n-nodes-base.mailjet/
/nodes/n8n-nodes-base.mailjetTrigger/ /integrations/trigger-nodes/n8n-nodes-base.mailjetTrigger/
/nodes/n8n-nodes-base.mandrill/ /integrations/nodes/n8n-nodes-base.mandrill/
/nodes/n8n-nodes-base.markdown/ /integrations/core-nodes/n8n-nodes-base.markdown/
/nodes/n8n-nodes-base.marketstack/ /integrations/nodes/n8n-nodes-base.marketstack/
/nodes/n8n-nodes-base.matrix/ /integrations/nodes/n8n-nodes-base.matrix/
/nodes/n8n-nodes-base.mattermost/ /integrations/nodes/n8n-nodes-base.mattermost/
@ -251,7 +293,7 @@
/nodes/n8n-nodes-base.mqttTrigger/ /integrations/trigger-nodes/n8n-nodes-base.mqttTrigger/
/nodes/n8n-nodes-base.msg91/ /integrations/nodes/n8n-nodes-base.msg91/
/nodes/n8n-nodes-base.mySql/ /integrations/nodes/n8n-nodes-base.mySql/
/nodes/n8n-nodes-base.n8nTrainingCustomeMessenger/ /integrations/nodes/n8n-nodes-base.n8nTrainingCustomeMessenger/
/nodes/n8n-nodes-base.n8nTrainingCustomerMessenger/ /integrations/nodes/n8n-nodes-base.n8nTrainingCustomerMessenger/
/nodes/n8n-nodes-base.n8nTrainingCustomerDatastore/ /integrations/nodes/n8n-nodes-base.n8nTrainingCustomerDatastore/
/nodes/n8n-nodes-base.n8nTrigger/ /integrations/core-nodes/n8n-nodes-base.n8nTrigger/
/nodes/n8n-nodes-base.nasa/ /integrations/nodes/n8n-nodes-base.nasa/
@ -324,6 +366,7 @@
/nodes/n8n-nodes-base.sms77/ /integrations/nodes/n8n-nodes-base.sms77/
/nodes/n8n-nodes-base.snowflake/ /integrations/nodes/n8n-nodes-base.snowflake/
/nodes/n8n-nodes-base.splitInBatches/ /integrations/core-nodes/n8n-nodes-base.splitInBatches/
/nodes/n8n-nodes-base.splitinbatches/ /integrations/core-nodes/n8n-nodes-base.splitInBatches/
/nodes/n8n-nodes-base.splunk/ /integrations/nodes/n8n-nodes-base.splunk/
/nodes/n8n-nodes-base.spontit/ /integrations/nodes/n8n-nodes-base.spontit/
/nodes/n8n-nodes-base.spotify/ /integrations/nodes/n8n-nodes-base.spotify/
@ -348,6 +391,7 @@
/nodes/n8n-nodes-base.tapfiliate/ /integrations/nodes/n8n-nodes-base.tapfiliate/
/nodes/n8n-nodes-base.telegram/ /integrations/nodes/n8n-nodes-base.telegram/
/nodes/n8n-nodes-base.telegramTrigger/ /integrations/trigger-nodes/n8n-nodes-base.telegramTrigger/
/nodes/n8n-nodes-base.telegramtrigger/ /integrations/trigger-nodes/n8n-nodes-base.telegramTrigger/
/nodes/n8n-nodes-base.theHive/ /integrations/nodes/n8n-nodes-base.theHive/
/nodes/n8n-nodes-base.theHiveTrigger/ /integrations/trigger-nodes/n8n-nodes-base.theHiveTrigger/
/nodes/n8n-nodes-base.timescaleDb/ /integrations/nodes/n8n-nodes-base.timescaleDb/

View File

@ -96,6 +96,6 @@ Do you know someone who would be a great fit for one of our [open positions](htt
Here's how this works:
1. **Search**: Have a look at the description and requirements of each role, and consider if someone you know would be a great fit.
2. **Referral**: Once youve identified a potential candidate, send an email to [Leoni](mailto:leoni@n8n.io) with the subject line *Employee referral - [job title]* and a short description of the person youre referring (and the reason why). Also, tell your referral to apply for the job through our [careers page](https://n8n.io/careers).
2. **Referral**: Once youve identified a potential candidate, send an email to [Jobs at n8n](mailto:jobs@n8n.io) with the subject line *Employee referral - [job title]* and a short description of the person youre referring (and the reason why). Also, tell your referral to apply for the job through our [careers page](https://n8n.io/careers).
3. **Evaluation**: We'll screen the application and inform you about the next steps of the hiring process.
4. **Reward**: As soon as your referral has successfully finished the probationary period, we'll reward you for your efforts by transferring the €1,000 to your bank account.

View File

@ -8,4 +8,5 @@ These tasks can and should be automated! And you don't need advanced technical k
## Available courses
- [Level 1: Beginners' course](/courses/level-one/)
- [Level 1: Beginner course](/courses/level-one/)
- [Level 2: Intermediate course](/courses/level-two/)

View File

@ -1,16 +1,14 @@
# Take the Quiz and Get Your Certificate
# Test your knowledge
Congratulations you finished the n8n Course Level I! You were able to help Nathan build a business use case workflow, saving him hours of tedious work and making him more productive. Youve come a long way throughout this course and learned a lot about workflow automation.
Congratulations you finished the n8n Course Level 1! You helped Nathan build a business use case workflow, saving him hours of tedious work and making him more productive.
## Certification quiz
Youve come a long way throughout this course and learned a lot about workflow automation. Heres what you can do next:
You're almost there! The last step before earning your certificate - after [signing-up](https://n8n-community.typeform.com/to/PDEMrevI) and completing the [course milestones](/courses/level-one/#do-i-get-a-certificate) - is passing the quiz.
* Test your knowledge of everything you've learned in this course with a **quiz**. The quiz consists of questions about the theoretical concepts and workflows covered in this course.
The quiz consists of two parts: theory and practice. Remember:
- You need to have at least 80% correct answers in each part.
- There is no time limit.
- You can take the quiz as many times as you want.
- You need to have at least 80% correct answers in each part.
- You can take the quiz as many times as you want.
- There is no time limit on answering the quiz questions.
<br/>
<div style="text-align:center;">
@ -18,10 +16,5 @@ The quiz consists of two parts: theory and practice. Remember:
</div>
## What's next?
So, where do you go from here? Heres what you can do next:
* Create new workflows for your work or personal use and share them with us. Dont have any ideas? Find inspiration on our [blog](https://n8n.io/blog/), [YouTube channel](https://www.youtube.com/c/n8n-io), [community forum](https://community.n8n.io), and [Discord server](https://discord.gg/vWwMVThRta).
* Dive deeper into n8ns settings by reading the docs.
* Take the n8n Level II course. [Subscribe](https://n8n.io/blog/#subscribe) to our newsletter to find out when its released.
* Take the n8n [Course Level 2](/courses/level-two/).

View File

@ -1,6 +1,6 @@
# Introduction
Welcome to the n8n Certification Course Level I!
Welcome to the n8n Certification Course Level 1!
## Is this course right for me?
@ -47,14 +47,12 @@ Completing the course should take around two hours. You do not have to complete
## Do I get a certificate?
Absolutely! We believe all good works deserve recognition. To get your certificate, you need to complete the following milestones:
We believe all good works deserve recognition. If you successfully complete the course, we will email you a **recognition badge** that you can share with your peers to showcase your n8n skills. To get your n8n badge, you need to complete the following milestones:
✅ [Sign up](https://n8n-community.typeform.com/to/PDEMrevI) for the course to get your unique ID and webhook URL<br/>
✅ [Make an HTTP request](/courses/level-one/chapter-5/chapter-5.1/)<br/>
✅ [Send the workflow results as a message via Discord](/courses/level-one/chapter-5/chapter-5.6/)<br/>
✅ Pass the quiz (theory and practice) at the end of the course<br/>
<figure style="text-align: center"><img src="/_images/courses/level-one/chapter-one/certificate.png" alt="Certificate" style="height: 70%; width:70%; border: 1px solid #000000;"></figure>
- [x] [Sign up](https://n8n-community.typeform.com/to/PDEMrevI) for the course to get your unique ID and webhook URL
- [x] [Make an HTTP request](/courses/level-one/chapter-5/chapter-5.1/)
- [x] [Send the workflow results as a message via Discord](/courses/level-one/chapter-5/chapter-5.6/)
- [x] Pass the quiz (theory and practice) at the end of the course
<div style="text-align:center;">
<button style="font-weight: 600;padding: 20px 46px;border-radius: 30px;color: #fff;background-color: #ff6d5a;border-color: #ff6d5a;border: 1px solid #ff6d5a;font-size: 14px;"><a href="/courses/level-one/chapter-1/" style="color: #fff;">Lets get started!</a></button>

View File

@ -0,0 +1,225 @@
# Understanding the data structure
In this chapter, you will learn about the data structure of n8n and how to use the [Function node](/integrations/nodes/n8n-nodes-base.function/) to transform data and simulate node outputs.
## Data structure of n8n
In a basic sense, n8n nodes function as an Extract, Transform, Load (ETL) tool. The nodes allow you to access (extract) data from multiple disparate sources, modify (transform) that data in a particular way, and pass (load) it along to where it needs to be.
The data that moves along from node to node in your workflow must be in a format (structure) that can be recognized and interpreted by each node. In n8n, this required structure is an array of objects.
!!! note "What is an array of objects?"
An array is a list of values. The array can be empty or contain several elements. Each element is stored at a position (index) in the list, starting at 0, and can be referenced by the index number. For example, in the array `["Leonardo", "Michelangelo", "Donatello", "Raphael"];` the element `Donatello` is stored at index 2.
An object stores key-value pairs, instead of values at numbered indexes as in arrays. The order of the pairs is not important, as the values can be accessed by referencing the key name. For example, the object below contains two properties (`name` and `color`):
```json
{
name: 'Michelangelo',
color: 'blue',
}
```
An array of objects is an array that contains one or more objects. For example, the array `turtles` below contains four objects:
```javascript
var turtles = [
{
name: 'Michelangelo',
color: 'orange',
},
{
name: 'Donatello',
color: 'purple',
},
{
name: 'Raphael',
color: 'red',
},
{
name: 'Leonardo',
color: 'blue',
}
];
```
You can access the properties of an object using dot notation with the syntax `object.property`. For example, `turtles[1].color` gets the color of the second turtle.
Data sent from one node to another is sent as an array of JSON objects. The elements in this collection are called [Items](/getting-started/key-concepts/#item).
<figure><img src="/_images/courses/level-two/chapter-one/explanation_items.png" alt="" style="width:100%"><figcaption align = "center"><i>Items</i></figcaption></figure>
An n8n node performs its action on each item of incoming data.
<figure><img src="/_images/flow-logic/looping/customer_datastore_node.png"><figcaption align = "center"><i>Items in the Customer Datastore node</i></figcaption></figure>
## Creating data sets with the Function node
Now that you are familiar with the n8n data structure, you can use it to create your own data sets or simulate node outputs. To do this, use the Function node to write JavaScript code defining your array of objects with the following structure:
```javascript
return [
{
json: {
key: 'value',
}
}
];
```
For example, the array of objects representing the Ninja turtles would look like this in the Function node:
<figure><img src="/_images/courses/level-two/chapter-one/exercise_function_notNested.png" alt="" style="width:100%"><figcaption align = "center"><i>Array of objects in the Function node</i></figcaption></figure>
!!! warning "JSON objects"
Notice that this array of objects contains an extra key: `json`. n8n expects you to wrap each object in an array in another object, with the key `json`.
<figure><img src="/_images/courses/level-two/chapter-one/explanation_dataStructure.png" alt="" style="width:100%"><figcaption align = "center"><i>Illustration of data structure in n8n</i></figcaption></figure>
It's good practice to pass the data in the right structure used by n8n. But don't worry if you forget to add the `json` key to an item, n8n (version 0.166.0 and above) adds it automatically.
You can also have nested pairs, for example if you want to define a primary and a secondary color. In this case, you need to further wrap the key-value pairs in curly braces `{}`.
!!! note "n8n data structure video"
[This talk](https://www.youtube.com/watch?v=mQHT3Unn4tY) offers a more detailed explanation of data structure in n8n.
<iframe width="560" height="315" src="https://www.youtube.com/embed/mQHT3Unn4tY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
### Exercise
In a Function node, create an array of objects named `myContacts` that contains the properties `name` and `email`, and the `email` property is further split into `personal` and `work`.
??? note "Show me the solution"
In the Function node, in the JavaScript Code field you have to write the following code:
```js
var myContacts = [
{
json: {
name: 'Alice',
email: {
personal: 'alice@home.com',
work: 'alice@wonderland.org'
},
}
},
{
json: {
name: 'Bob',
email: {
personal: 'bob@mail.com',
work: 'contact@thebuilder.com'
},
}
},
];
return myContacts;
```
When you execute the Function node, the result should look like this:
<figure><img src="/_images/courses/level-two/chapter-one/exercise_function.png" alt="" style="width:100%"><figcaption align = "center"><i>Result of Function node</i></figcaption></figure>
## Referencing node data with the Function node
Just like you can use [expressions](/code-examples/expressions/) to reference data from other nodes, you can also use some [methods](/code-examples/expressions/methods/) and [variables](/code-examples/expressions/variables/) in the Function node.
### Exercise
Let's build on the previous exercise, in which you used the Function node to create a data set of two contacts with their names and emails. Now, connect a second Function node to the first one. In the new node, write code to create a new column named `workEmail` that references the work email of the first contact.
??? note "Show me the solution"
In the Function node, in the JavaScript Code field you have to write the following code:
items[0].json.workEmail = items[0].json.email['work'];
return items;
When you execute the Function node, the result should look like this:
<figure><img src="/_images/courses/level-two/chapter-one/exercise_function_reference.png" alt="" style="width:100%"><figcaption align = "center"><i>Function node reference</i></figcaption></figure>
## Transforming data
The incoming data from some nodes may have a different data structure than the one used in n8n. In this case, you need to [transform the data](/data/transforming-data/), so that each item can be processed individually.
The two most common operations for data transformation are:
- Creating multiple items from one item
- Creating a single item from multiple items
There are several ways to transform data for the purposes mentioned above:
- With the HTTP Request node, you can toggle the option `Split Into Items` to create multiple items from a single item. This is the easiest way to transform incoming web data with one click.
- With the [Item Lists node](/integrations/core-nodes/n8n-nodes-base.itemLists), you can `Split Out Items` or `Aggregate Items`. This node is the easy way to modify the structure of incoming data that contain lists (arrays), without needing to use JavaScript code in the Function node.
- With the Function node, you can write JavaScript functions to modify the data structure of incoming data:
To create multiple items from a single item, you can use this JavaScript code:
```js
return items[0].json.map(item => {
return {
json: item
}
});
```
To create a single item from multiple items, you can use this JavaScript code:
```js
return [
{
json: {
data_object: items.map(item => item.json)
}
}
];
```
### Exercise
Use the HTTP Request node to make a GET request to the Poemist API `https://www.poemist.com/api/v1/randompoems`. Transform the incoming data with the `Split Into Items` option and with the Function node.
??? note "Show me the solution"
To get the poems from the Poemist API, execute the *HTTP Request node* with the following parameters:
- Authentication: None
- Request Method: GET
- URL: https://www.poemist.com/api/v1/randompoems
The result should look like this:
<figure><img src="/_images/courses/level-two/chapter-one/exercise_transforming_noSplitItems.png" alt="" style="width:100%"><figcaption align = "center"><i>HTTP Request node without split items</i></figcaption></figure>
To transform the data from the HTTP Request node, toggle the switch `Split Into Items`. The result should look like this:
<figure><img src="/_images/courses/level-two/chapter-one/exercise_transforming_splitItems.png" alt="" style="width:100%"><figcaption align = "center"><i>HTTP Request node with split items</i></figcaption></figure>
To transform the data with the Function node, connect this node to the *HTTP Request node* (without the toggle for splitting data) and write the following code in the JavaScript Code field:
```js
return items[0].json.map(item => {
return {
json: item
}
});
```
The result should look like this:
<figure><img src="/_images/courses/level-two/chapter-one/exercise_transforming_function.png" alt="" style="width:100%"><figcaption align = "center"><i>Function node with code to transform items</i></figcaption></figure>

View File

@ -0,0 +1,454 @@
# Processing different data types
In this chapter, you will learn how to process different types of data using [n8n core nodes](/workflows/nodes/).
## HTML and XML data
You're most likely familiar with HTML and XML.
!!! note "HTML vs. XML"
HTML is a markup language used to describe the structure and semantics of a web page. XML looks similar to HTML, but the tag names are different, as they describe the kind of data they hold.
If you need to process HTML or XML data in your n8n workflows, use the [HTML Extract node](/integrations/core-nodes/n8n-nodes-base.htmlExtract/) or [XML node](/integrations/core-nodes/n8n-nodes-base.xml/).
The HTML Extract node allows you to extract HTML content of a webpage, by referencing CSS selectors. This is useful if you want to collect structured information from a website (web-scraping).
### Exercise
Use the HTTP Request node to make a GET request to the URL `https://www.daysoftheyear.com/days/mar/2022/`. Then, connect an HTML Extract node and configure it to extract the date of the returned events.
??? note "Show me the solution"
Configure the HTTP Request node with the following parameters:
- Authentication: None
- Request Method: GET
- URL: https://www.daysoftheyear.com/days/mar/2022/
The result should look like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_html_httpRequestNode.png" alt="" style="width:100%"><figcaption align = "center"><i>Result of HTTP Request node</i></figcaption></figure>
Connect an *HTML Extract node* to the HTTP Request node and configure the former's parameters:
- Source Data: JSON
- JSON Property: data
- Extraction Values:
- Key: event
- CSS Selector: .js-link-target
- Return Value: HTML
You can add more values to extract more data.
The result should look like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_html_htmlExtractNode.png" alt="" style="width:100%"><figcaption align = "center"><i>Result of HTML Extract node</i></figcaption></figure>
</details>
The XML node allows you to convert XML to JSON and JSON to XML. This operation is useful if you work with different web services that use either XML or JSON, and need to get and submit data between them in the two formats.
### Exercise
In a previous exercise, you used an HTTP Request node to make a request to an API. Now, use the XML node to convert the JSON output to XML.
??? note "Show me the solution"
Get data from the Poemist API using the HTTP Request node and connect an XML node to it with the following parameters:
- Mode: **JSON to XML**
- Property name: **data**
The result should look like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_html_xmlNode_json.png" alt="" style="width:100%"><figcaption align = "center"><i>XML node (JSON to XML) JSON View</i></figcaption></figure>
<figure><img src="/_images/courses/level-two/chapter-two/exercise_html_xmlNode_table.png" alt="" style="width:100%"><figcaption align = "center"><i>XML node (JSON to XML) Table View</i></figcaption></figure>
To transform data the other way around, select the mode **XML to JSON**.
## Date, time, and interval data
Date and time data types include `DATE`, `TIME`, `DATETIME`, `TIMESTAMP`, and `YEAR`. The dates and times can be passed in different formats, for example:
- `DATE`: March 29 2022, 29-03-2022, 2022/03/29
- `TIME`: 08:30:00, 8:30, 20:30
- `DATETIME`: 2022/03/29 08:30:00
- `TIMESTAMP`: 1616108400 (Unix timestamp), 1616108400000 (Unix ms timestamp)
- `YEAR`: 2022, 22
If you need to convert date and time data to different formats, and calculate dates, use the [Date & Time node](/integrations/core-nodes/n8n-nodes-base.dateTime/).
You can also schedule workflows to run at a specific time, interval, or duration, using the two trigger nodes:
- [Cron node](/integrations/core-nodes/n8n-nodes-base.cron/) triggers the workflow at fixed dates and/or times (for example, every Monday at 9am).
- [Interval node](/integrations/core-nodes/n8n-nodes-base.interval/) triggers the workflow in regular intervals of time (for example, every 10 minutes).
In some cases, you might need to pause the workflow execution. This might be necessary, for example, if you know that a service doesn't process the data instantly or it is generally slower, so you don't want the incomplete data to be passed to the next node. In this case, you can use the [Wait node](/integrations/core-nodes/n8n-nodes-base.wait/) after the node that you want to delay. The Wait node pauses the workflow execution and resumes it at a specific time, after a time interval, or on a webhook call.
### Exercise
Build a workflow that adds five days to an input date. Then, if the calculated date occurred after today, the workflow waits 1 minute before [setting](/integrations/core-nodes/n8n-nodes-base.set/) the calculated date as a value. The workflow should be triggered every 30 minutes.
??? note "Show me the solution"
You can build this workflow using the data from the *Customer Datastore node*, the three nodes for managing date and time, an *IF node* for conditional routing, and a *Set node* for setting the new calculated date. The workflow looks like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_dateTime.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow for transforming dates</i></figcaption></figure>
To check the configuration of each node, you can copy the JSON code of this workflow and paste it in your Editor UI.
```json
{
"nodes": [
{
"parameters": {
"action": "calculate",
"value": "={{$json[\"created\"]}}",
"duration": 5,
"options": {}
},
"name": "Date & Time",
"type": "n8n-nodes-base.dateTime",
"typeVersion": 1,
"position": [
880,
1500
]
},
{
"parameters": {
"unit": "hours"
},
"name": "Interval",
"type": "n8n-nodes-base.interval",
"typeVersion": 1,
"position": [
520,
1500
]
},
{
"parameters": {
"unit": "minutes"
},
"name": "Wait",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
1240,
1500
],
"webhookId": "d17effb8-ad90-4a74-bb88-daa3d3d18583"
},
{
"parameters": {
"conditions": {
"dateTime": [
{
"value1": "={{$json[\"data\"]}}",
"value2": "2022-02-03T11:45:38.932Z"
}
]
}
},
"name": "IF",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [
1060,
1500
]
},
{
"parameters": {
"values": {
"string": [
{
"value": "={{$node[\"IF\"].json[\"data\"]}}"
}
]
},
"options": {}
},
"name": "Set",
"type": "n8n-nodes-base.set",
"typeVersion": 1,
"position": [
1420,
1500
]
},
{
"parameters": {
"operation": "getAllPeople",
"returnAll": true
},
"name": "Customer Datastore",
"type": "n8n-nodes-base.n8nTrainingCustomerDatastore",
"typeVersion": 1,
"position": [
700,
1500
]
}
],
"connections": {
"Date & Time": {
"main": [
[
{
"node": "IF",
"type": "main",
"index": 0
}
]
]
},
"Interval": {
"main": [
[
{
"node": "Customer Datastore",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Set",
"type": "main",
"index": 0
}
]
]
},
"IF": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Customer Datastore": {
"main": [
[
{
"node": "Date & Time",
"type": "main",
"index": 0
}
]
]
}
}
}
```
## Binary data
So far, you have mainly worked with text data. But what if you want to process data that is not text? For example, images or PDF files. This is binary data, as it is represented in the binary numeral system. In this form, binary data doesn't offer you useful information, so it needs to be converted into a readable form.
In n8n, you can process binary data with the following nodes:
- [Move Binary Data node](/integrations/core-nodes/n8n-nodes-base.moveBinaryData/) to move data between binary and JSON properties.
- [Read Binary File node](/integrations/core-nodes/n8n-nodes-base.readBinaryFile/) to read a file from the host machine that runs n8n.
- [Read Binary Files](/integrations/core-nodes/n8n-nodes-base.readBinaryFiles/) to read multiple files from the host machine that runs n8n.
- [Write Binary File](/integrations/core-nodes/n8n-nodes-base.writeBinaryFile/) to write a file to the host machine that runs n8n.
- [Spreadsheet File node](/integrations/core-nodes/n8n-nodes-base.spreadsheetFile/) to read from or write to spreadsheet files of different formats (for example, CSV, XLSX).
To read or write a binary file, you need to write the path (location) of the file in the node's `File Name` parameter.
!!! warning "Naming the right path"
The file path looks slightly different on n8n cloud compared to desktop or self-hosted:
- n8n desktop and self-hosted: `./Documents/my_file.json`
- n8n cloud: `/home/node/.n8n/my_file.json`
### Exercise
Make an HTTP request to get this PDF file: `https://media.kaspersky.com/pdf/Kaspersky_Lab_Whitepaper_Anti_blocker.pdf.` Then, use the Move Binary Data node to convert the file from binary to JSON, with [base64](https://developer.mozilla.org/en-US/docs/Glossary/Base64) encoding.
??? note "Show me the solution"
In the HTTP Request node, you should see the PDF file in JSON, Table, and Binary view, like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_binaryData_httpRequest_file.png" alt="" style="width:100%"><figcaption align = "center"><i>HTTP Request node to get PDF</i></figcaption></figure>
When you convert the PDF from binary to JSON with base64 encoding using the *Move Binary Data node*, the result should look like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_binaryData_moveData_btoj.png" alt="" style="width:100%"><figcaption align = "center"><i>Move Binary Data node (Binary to JSON) with base64 encoding</i></figcaption></figure>
To check the configuration of the nodes, you can copy-paste the JSON code of the workflow:
```json
{
"nodes": [
{
"parameters": {
"url": "https://media.kaspersky.com/pdf/Kaspersky_Lab_Whitepaper_Anti_blocker.pdf",
"responseFormat": "file",
"options": {}
},
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
1340,
1080
]
},
{
"parameters": {
"setAllData": false,
"options": {
"encoding": "base64"
}
},
"name": "Move Binary Data",
"type": "n8n-nodes-base.moveBinaryData",
"typeVersion": 1,
"position": [
1600,
1080
]
}
],
"connections": {
"HTTP Request": {
"main": [
[
{
"node": "Move Binary Data",
"type": "main",
"index": 0
}
]
]
}
}
}
```
### Exercise
Make an HTTP request to the Poemist API `https://www.poemist.com/api/v1/randompoems` and move the returned data from JSON to binary. Then, write the new binary data to a file. Finally, to check that it worked out, read the generated binary file referencing it with an expression in the node.
??? note "Show me the solution"
The workflow for this exercise looks like this:
<figure><img src="/_images/courses/level-two/chapter-two/exercise_binaryData.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow for moving JSON to binary data</i></figcaption></figure>
To check the configuration of the nodes, you can copy-paste the JSON code of the workflow:
```json
{
"nodes": [
{
"parameters": {
"filePath": "={{$json[\"fileName\"]}}"
},
"name": "Read Binary File",
"type": "n8n-nodes-base.readBinaryFile",
"typeVersion": 1,
"position": [
1060,
500
]
},
{
"parameters": {
"url": "https://www.poemist.com/api/v1/randompoems",
"options": {
"splitIntoItems": true
}
},
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
520,
500
]
},
{
"parameters": {
"fileName": "/home/node/.n8n/poemist.json"
},
"name": "Write Binary File",
"type": "n8n-nodes-base.writeBinaryFile",
"position": [
880,
500
],
"typeVersion": 1
},
{
"parameters": {
"mode": "jsonToBinary",
"options": {}
},
"name": "Move Binary Data",
"type": "n8n-nodes-base.moveBinaryData",
"position": [
700,
500
],
"typeVersion": 1
}
],
"connections": {
"HTTP Request": {
"main": [
[
{
"node": "Move Binary Data",
"type": "main",
"index": 0
}
]
]
},
"Write Binary File": {
"main": [
[
{
"node": "Read Binary File",
"type": "main",
"index": 0
}
]
]
},
"Move Binary Data": {
"main": [
[
{
"node": "Write Binary File",
"type": "main",
"index": 0
}
]
]
}
}
}
```

View File

@ -0,0 +1,175 @@
# Merging and splitting data
In this chapter, you will learn how to merge and split data, and in what cases it might be useful to perform these operations.
## Merging data
In some cases, you might need to merge (combine) and process data from different sources.
Merging data can involve:
- Creating one data set from multiple sources.
- Synchronizing data between multiple systems. For example, removing duplicate data, or updating data in one system when it changes in another.
!!! note "One-way vs. two-way sync"
In a one-way sync, data is synchronized in one direction. One system serves as the single source of truth. When information changes in that main system, it automatically changes in the secondary system; but if information changes in the secondary system, the changes are not reflected in the main system.
In a two-way sync, data is synchronized in both directions (between both systems). When information changes in either of the two systems, it automatically changes in the other one as well.
[This blog tutorial](https://n8n.io/blog/how-to-sync-data-between-two-systems/) explains how to sync data one-way and two-way between two CRMs.
In n8n, you can merge data from two different nodes using the [Merge node](/integrations/core-nodes/n8n-nodes-base.merge/), which provides several merging modes:
- Append
- Keep Key Matches
- Merge By Index
- Merge By Key
- Multiples
- Pass-through
- Remove Key Matches
- Wait
Notice that three of these modes require a key (Merge By Key, Keep Key Matches, Remove Key Matches). This key represents a common property between the two data sources, based on which the data can be merged. In the Merge node, they are called `Property Input 1` and `Property Input 2`.
<figure><img src="/_images/courses/level-two/chapter-three/explanation_mergePropertyInput.png" alt="" style="width:100%"><figcaption align = "center"><i>Property Input fields in the Merge node</i></figcaption></figure>
!!! warning "Property Input in dot notation"
If you want to reference nested values in the *Merge node* parameters `Property Input 1` and `Property Input 2`, you need to enter the property key in dot-notation format (as text, not as an expression).
### Exercise
Build a workflow that merges data from the Customer Datastore node and Function node.
* Add a Merge node that takes Input 1 from a Customer Datastore node and Input 2 from a Function node.
* In the Customer Datastore node, run the operation Get All People.
* In the Function node, create an array of two objects with three properties: `name`, `language`, and `country`, where the property `country` has two sub-properties `code` and `name`. Fill out the values of these properties with the information of two characters from the Customer Database. For example, Jay Gatsby's language would be English and country name would be United States.
* In the Merge node, try out different merge modes.
??? note "Show me the solution"
The workflow for this exercise looks like this:
<figure><img src="/_images/courses/level-two/chapter-three/exercise_merge.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow exercise for merging data</i></figcaption></figure>
If you merge data with the option *Keep Key Matches* using the country code as the common key, the result should look like this:
<figure><img src="/_images/courses/level-two/chapter-three/exercise_merge_kkm.png" alt="" style="width:100%"><figcaption align = "center"><i>Output of Merge node with option to keep key matches</i></figcaption></figure>
## Looping
In some cases, you might need to perform the same operation on each element of an array / each data item (for example sending a message to every contact in your address book). In technical terms, you need to iterate through the data (with loops).
n8n handles this repetitive processing automatically, as the nodes run once for each item, so you don't need to build loops into your workflows. However, there are some [exceptions of nodes and operations](/flow-logic/looping/#node-exceptions) for which you need to build a loop into your workflow.
To [create a loop in an n8n workflow](/flow-logic/looping/#using-loops-in-n8n), you need to connect the output of one node to the input of a previous node, and add an IF node to check when to stop the loop.
## Splitting data in batches
If you need to process large incoming data, execute the Function node multiple times, or avoid API rate limits, it's best to split the data into batches (groups) and process these batches. You can do this with the [Split in Batches node](/integrations/core-nodes/n8n-nodes-base.splitInBatches/). This node splits input data into a specified batch size and, with each iteration, returns a predefined amount of data.
!!! warning "Execution of Split in Batches node"
The Split In Batches node stops executing after all the incoming items get divided into batches and passed on to the next node in the workflow, so it is not necessary to add an IF node to stop the loop.
### Exercise
Build a workflow that reads the RSS feed from Medium and dev.to. The workflow should consist of three nodes:
- A Function node that returns the URLs of the RSS feeds of Medium (`https://medium.com/feed/n8n-io`) and dev.to (`https://dev.to/feed/n8n`)
- A Split In Batches node with `Batch Size: 1`, that takes in the inputs from the Function node and RSS node and iterates over the items.
- An RSS Read node that gets the URL of the Medium RSS feed, passed as an expression: `{{$node["SplitInBatches"].json["url"]}}`. The RSS Read node is one of the exception nodes which processes only the first item it receives, so the Split in Batches node is necessary for iterating over multiple items.
??? note "Show me the solution"
The workflow for this exercise looks like this:
<figure><img src="/_images/courses/level-two/chapter-three/exercise_splitInBatches.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow for getting RSS feeds from two blogs</i></figcaption></figure>
To check the configuration of the nodes, you can copy-paste the JSON code of the workflow:
```json
{
"nodes": [
{
"parameters": {
"functionCode": "return [\n {\n json: {\n url: 'https://medium.com/feed/n8n-io',\n }\n },\n {\n json: {\n url: 'https://dev.to/feed/n8n',\n }\n }\n];"
},
"name": "Function",
"type": "n8n-nodes-base.function",
"position": [
480,
1880
],
"typeVersion": 1
},
{
"parameters": {
"url": "={{$node[\"SplitInBatches\"].json[\"url\"]}}"
},
"name": "RSS Feed Read",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
880,
1880
],
"typeVersion": 1
},
{
"parameters": {
"batchSize": 1,
"options": {}
},
"name": "SplitInBatches",
"type": "n8n-nodes-base.splitInBatches",
"position": [
680,
1880
],
"typeVersion": 1
}
],
"connections": {
"Function": {
"main": [
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"RSS Feed Read": {
"main": [
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"SplitInBatches": {
"main": [
[
{
"node": "RSS Feed Read",
"type": "main",
"index": 0
}
]
]
}
}
}
```

View File

@ -0,0 +1,117 @@
# Dealing with errors in workflows
Sometimes it can happen that you're building a nice workflow, but when you try to execute it, it fails. There are many reasons why workflows executions may fail (some more or less mysterious), for example when a node is not configured correctly or a third-party service that you're trying to connect to is not working properly.
But don't panic. We will show you some ways in which you can troubleshoot the issue, so you can get your workflow up and running as soon as possible.
## Checking failed workflows
When one of your workflows fails, it's helpful to check the execution log by clicking on [**Executions**](/editor-ui/#executions) in the left-side panel. The executions log shows you a list of the latest execution time, status, mode, and running time of your saved workflows.
To investigate a specific workflow from the list, click on the folder icon on the row of the respective workflow.
<figure><img src="/_images/courses/level-two/chapter-four/explanation_workflowExecutions.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow Executions window</i></figcaption></figure>
This will open the workflow in read-only mode, where you can see the execution of each node. This representation can help you identify at what point the workflow ran into issues.
<figure><img src="/_images/courses/level-two/chapter-four/explanation_workflowExecutions_readonly.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow execution view</i></figcaption></figure>
## Catching erroring workflows
To catch failed workflows, create a separate [Error Workflow](/workflows/workflows/#failed-workflows) with the [Error Trigger node](/integrations/core-nodes/n8n-nodes-base.errorTrigger/), which gets executed if the main execution fails.
Then, you can take further actions by connecting other nodes, for example sending notifications via email or Slack about the failed workflow and its errors. To receive error messages for a failed workflow, you need to select the option `Error Workflow` in the [Workflow Settings](/courses/level-one/chapter-5/chapter-5.8/) of the respective workflow.
The only difference between a regular workflow and an Error Workflow is that the latter contains an Error Trigger node. Make sure to create this node before you set a workflow as Error Workflow.
!!! note "Error workflows"
- You don't need to activate workflows that use the Error Workflow node.
- A workflow that uses the *Error Trigger node* uses itself as the error workflow.
- The Error Trigger node is designed to get triggered only when the monitored workflow gets executed automatically. This means you cant test this (to see the result of) an error workflow while executing the monitored workflow manually.
- You can set the same Error Workflow for multiple workflows.
### Exercise
In the previous chapters, you've built several small workflows. Now, pick one of them that you want to monitor. Create an Error Workflow that sends a message to a communication platform (for example, Slack, Discord, Telegram, or even email) if that workflow fails. Don't forget to set this Error Workflow in the settings of the monitored workflow.
??? note "Show me the solution"
The workflow for this exercise looks like this:
<figure><img src="/_images/courses/level-two/chapter-four/exercise_errors_errorTriggerNode_workflow.png" alt="" style="width:100%"><figcaption align = "center"><i>Error workflow</i></figcaption></figure>
To check the configuration of the nodes, you can copy-paste the JSON code of the workflow:
```json
{
"nodes": [
{
"parameters": {},
"name": "Error Trigger",
"type": "n8n-nodes-base.errorTrigger",
"typeVersion": 1,
"position": [
720,
-380
]
},
{
"parameters": {
"channel": "channelname",
"text": "=This workflow {{$node[\"Error Trigger\"].json[\"workflow\"][\"name\"]}}failed.\nHave a look at it here: {{$node[\"Error Trigger\"].json[\"execution\"][\"url\"]}}",
"attachments": [],
"otherOptions": {}
},
"name": "Slack",
"type": "n8n-nodes-base.slack",
"position": [
900,
-380
],
"typeVersion": 1,
"credentials": {
"slackApi": {
"id": "17",
"name": "slack_credentials"
}
}
}
],
"connections": {
"Error Trigger": {
"main": [
[
{
"node": "Slack",
"type": "main",
"index": 0
}
]
]
}
}
}
```
## Throwing exceptions in workflows
Another way of troubleshooting workflows is to include a [Stop and Error node](/integrations/core-nodes/n8n-nodes-base.stopAndError/) in your workflow. This node throws an error, which can be set to one of two error types: an error message or an error object. The error message returns a custom message about the error, while the error object returns the type of error.
The Stop and Error node can only be added as the last node in a workflow.
!!! note "When to throw errors"
Throwing exceptions with the Stop and Error node is useful for verifying the data (or assumptions about the data) from a node and returning custom error messages.
If you are working with data from a third-party service, you may come across problems such as: wrongly formatted JSON output, data with the wrong type (for example, numeric data that has a non-numeric value), missing values, or errors from remote servers.
Though this kind of invalid data might not cause the workflow to fail right away, it could cause problems later on, and then it can become difficult to track the source error. This is why it is better to throw an error at the time you know there might be a problem.
<figure><img src="/_images/courses/level-two/chapter-four/exercise_errors_stopAndError.png" alt="" style="width:100%"><figcaption align = "center"><i>Stop and Error node with error message</i></figcaption></figure>

View File

@ -0,0 +1,34 @@
# Automating a business workflow
Remember [our friend Nathan](/courses/level-one/chapter-3)?
**Nathan 🙋:** Hello, it's me again. My manager was so impressed with my first workflow automation solution, that she entrusted me with more responsibility.<br/>
**You 👩‍🔧:** More work and responsibility. Congratulations, I guess. What do you need to do now?<br/>
**Nathan 🙋:** I got access to all sales data and am responsible for creating two reports: one for regional sales and one for orders prices. They are based on data from different sources and come in different formats.<br/>
**You 👩‍🔧:** Sounds like a lot of manual workbut the kind that can be automated. So let's do it!
## Workflow design
Now that we have an idea of what Nathan wants to automate, lets list the steps he needs to take to achieve this:
1. Get and combine data from all necessary sources.
2. Sort the data and format the dates.
3. Write binary files.
4. Send notifications via email and Discord.
n8n provides core nodes for all these steps. This use case is somewhat complex and it will be made up of three separate workflows:
1. A workflow that merges the company data with external information.
2. A workflow that generates the reports.
3. A workflow that monitors errors in the second workflow.
## Workflow prerequisites
To build the workflows, you will need the following:
* An [Airtable](https://airtable.com/) account and [credentials](/integrations/credentials/airtable/).
* A [Google](https://www.google.com/account/about/) account and [credentials](/integrations/credentials/google/) to access Gmail.
* A [Discord](https://discord.com/) account and webhook URL (you receive this via email when you sign up for this course).
Next, you will build these three workflows with step-by-step instructions.

View File

@ -0,0 +1,26 @@
# Workflow 1 Merging data
The company's customer data is stored in Airtable. It contains information about the customers' ID, country, email, and join date, but lacks data about their respective region and subregion. You need to fill in these last two fields in order to create the reports for regional sales.
To accomplish this task, you first need to make a copy of this [customers table](https://airtable.com/shrZBXHXWvQ57LHuX) in your Airtable account.
<iframe class="airtable-embed" src="https://airtable.com/embed/shrNX9tjPkVLABbNz?backgroundColor=orange&viewControls=on" frameborder="0" onmousewheel="" width="100%" height="533" style="background: transparent; border: 1px solid #ccc;"></iframe>
Next, you have to build a small workflow that merges data from Airtable and a REST API.
1. Use the [Airtable node](/integrations/nodes/n8n-nodes-base.airtable/) to list the data in the Airtable table named `customers`.
2. use the [HTTP Request node](/integrations/core-nodes/n8n-nodes-base.httpRequest/) to get data from the REST Countries API: `https://restcountries.com/v3.1/all`. This will return data about world countries. Note that the incoming data needs to be split into items.
3. Use the [Merge node](/integrations/core-nodes/n8n-nodes-base.merge/) to merge data from Airtable and the Countries API by country name (the common key), represented as `customerCountry` in Airtable and `name.common` in the Countries API, respectively.
4. Use the Airtable node to update the fields `region` and `subregion` in Airtable with the data from the Countries API.
The workflow should look like this:
<figure><img src="/_images/courses/level-two/chapter-five/workflow1.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow 1 for merging data from Airtable and the Countries API</i></figcaption></figure>
!!! question "Quiz questions"
* How many items does the HTTP Request node return?
* How many items does the Merge node return?
* How many unique regions are assigned in the customers table?
* What is the subregion assigned to the customerID 10?

View File

@ -0,0 +1,72 @@
# Workflow 2 Generating reports
In this workflow, you will merge data from different sources, transform binary data, generate files, and send notifications about them. The final workflow should look like this:
<figure><img src="/_images/courses/level-two/chapter-five/workflow2.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow 2 for aggregating data and generating files</i></figcaption></figure>
To make things easier, let's split the workflow into three parts.
## Part 1 Getting data from different sources
The first part of the workflow consists of five nodes:
<figure><img src="/_images/courses/level-two/chapter-five/workflow2_1.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow 1 Getting data from different sources</i></figcaption></figure>
1. Use the [HTTP Request node](/integrations/core-nodes/n8n-nodes-base.httpRequest/) to get data from the API endpoint that stores company data. Configure the following node parameters:
* **Authentication**: Header Auth
* **URL**: The Dataset URL you received in the email when you signed up for this course.
* **Options > Add Option > Split Into Items**: toggle to true.
* **Headers > Add Header**:
* **Name**: unique_id
* **Value**: The unique ID you received in the email when you signed up for this course.
2. Use the [Airtable node](/integrations/nodes/n8n-nodes-base.airtable/) to list data from the `customers` table (where you updated the fields `region` and `subregion`).
3. Use the [Merge node](/integrations/core-nodes/n8n-nodes-base.merge/) to merge data from the Airtable and HTTP Request node, based on the common key `customer ID`.
4. Use the [Item Lists node](/integrations/core-nodes/n8n-nodes-base.itemLists/) to sort data by orderPrice in descending order.
!!! question "Quiz questions"
* What is the name of the employee assigned to customer 1?
* What is the order status of customer 6?
* What is the highest order price?
## Part 2 Generating file for regional sales
The second part of the workflow consists of five nodes:
<figure><img src="/_images/courses/level-two/chapter-five/workflow2_2.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow 2 Generating file for regional sales</i></figcaption></figure>
1. Use the [IF node](/integrations/core-nodes/n8n-nodes-base.if/) to filter order from the region Americas.
2. Use the [Move Binary Data node](/integrations/core-nodes/n8n-nodes-base.moveBinaryData/) to transform the incoming data from JSON to binary format. Note that you need to convert all data.
3. Use the [Write Binary File node](/integrations/core-nodes/n8n-nodes-base.writeBinaryFile/) to create and store files with the orders information. In the File Name field, use an expression to include the oder id in the file name, like this: `report_orderID{oder_id}.json` (you need to replace the `{order id}` with the reference the Move Binary Data node).
4. Use the [Gmail node](/integrations/nodes/n8n-nodes-base.gmail/) (or another email node) to send the files via email to an address you have access to. Note that you need to add an attachment with the data property.
5. Use the [Discord node](/integrations/nodes/n8n-nodes-base.discord/) to send a message in the n8n Discord channel `#course-level-two`. In the node, configure the following parameters:
* Webhook URL: The webhook URL you received in the email when you signed up for this course.
* Text: "I sent the file via email with the label ID `{label ID}` and wrote the binary file `{file name}`. My ID: " followed by your ID. <br/> Note that you need to replace the text in curly braces `{}` with expressions that reference the data from the nodes.
!!! question "Quiz questions"
* How many orders are assigned to the region Americas?
* What is the total price of the orders in the region Americas?
* How many items are returned by the *Write Binary File node*?
## Part 3 Generating files for total sales
The third part of the workflow consists of seven nodes:
<figure><img src="/_images/courses/level-two/chapter-five/workflow2_3.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow 3 Generating files for total sales</i></figcaption></figure>
1. Use the [Split In Batches node](/integrations/core-nodes/n8n-nodes-base.splitInBatches/) to split data from the Item Lists node into batches of 5.
2. Use the [Set node](/integrations/core-nodes/n8n-nodes-base.set/) to set four values, referenced with expressions from the previous node: `customerEmail`, `customerRegion`, `customerSince`, and `orderPrice`.
3. Use the [Date & Time node](/integrations/core-nodes/n8n-nodes-base.dateTime/) to change the date format of the field `customerSince` to the format MM/DD/YYYY.
4. Use the [Spreadsheet File node](/integrations/core-nodes/n8n-nodes-base.spreadsheetFile/) to create a CSV spreadsheet with the file name set as the expression: `{{$runIndex > 0 ? 'file_low_orders':'file_high_orders'}}`.
5. Use the [Discord node](/integrations/nodes/n8n-nodes-base.discord/) to send a message in the n8n Discord channel `#course-level-two`. In the node, configure the following parameters:
* Webhook URL: The webhook URL you received in the email when you signed up for this course.
* Text: "I created the spreadsheet `{file name}`. My ID:" followed by your ID. <br/> The `{file name}` should be an expression that references data from the Spreadsheet File node.<br/>
!!! question "Quiz questions"
* What is the lowest order price in the first batch of items?
* What is the formatted date of customer 7?
* How many items are returned by the *Spreadsheet File node*?

View File

@ -0,0 +1,25 @@
# Workflow 3 Monitoring workflow errors
To accomplish this task, you have to create an Error workflow that monitors the main workflow.
1. Add an Error Trigger node (and execute it as a test).
2. To the Error Trigger node, connect a Discord node and configure the fields:<br/>
* Webhook URL: The URL that you received in the email from n8n when you signed up for this course.
* Text: The workflow `{workflow name}` failed, with the error message: `{execution error message}`. Last node executed: `{name of the last executed node}`. Check this workflow execution here: `{execution URL}`.
Note that you need to replace the text in curly brackets `{}` with expressions that take the respective information from the Error Trigger node.<br/>
3. Execute the Discord node.
4. Set the newly created workflow as Error Workflow for the main workflow.
The workflow should look like this:
<figure><img src="/_images/courses/level-two/chapter-five/workflow3.png" alt="" style="width:100%"><figcaption align = "center"><i>Workflow 3 for monitoring workflow errors</i></figcaption></figure>
!!! question "Quiz questions"
* What fields does the Error Trigger node return?
* What information about the execution does the Error Trigger node return?
* What information about the workflow does the Error Trigger node return?
* What is the expression to reference the workflow name?

View File

@ -0,0 +1,18 @@
# Test your knowledge
Congratulations you finished the n8n Course Level 2! You helped Nathan build a business workflow automation, saving him hours of tedious work and making him more productive.
Youve come a long way throughout this course and learned a lot about workflow automation. Heres what you can do next:
* Test your knowledge of everything you've learned in this course with a quiz. The quiz consists of questions about the theoretical concepts and workflows covered in this course.
- You need to have at least 80% correct answers.
- You can take the quiz as many times as you want.
- There is no time limit on answering the quiz questions.
<div style="text-align:center;">
<button style="font-weight: 600;padding: 20px 46px;border-radius: 30px;color: #fff;background-color: #ff6d5a;border-color: #ff6d5a;border: 1px solid #ff6d5a;font-size: 14px;"><a href="https://n8n-community.typeform.com/to/r9hDbytg" style="color: #fff;">Take the quiz!</a></button>
</div>
* Create new workflows for your work or personal use and share them with us. Dont have any ideas? Find inspiration on the [workflows page](https://n8n.io/workflows) and on our [blog](https://n8n.io/blog/).
* Dive deeper into n8n's features by reading the [docs](/).

View File

@ -0,0 +1,42 @@
# Introduction
Welcome to the n8n Course Level 2!
## Is this course right for me?
This course is for you if you:
- Want to automate somewhat complex business processes.
- Want to dive deeper into n8n after taking the [Level 1 course](/courses/level-one/).
## What will I learn?
The focus in this course is on working with data. You will learn how to:
- Use the data structure of n8n correctly.
- Process different data types (for example, XML, HTML, date, time, and binary data).
- Merge data from different sources (for example, a database, spreadsheet, or CRM).
- Use functions and JavaScript code in the [Function node](/integrations/core-nodes/n8n-nodes-base.function).
- Deal with error workflows and workflow errors.
You will learn all this by completing short practical exercises after the theoretical explanations, and building a business workflow with step-by-step instructions.
## What do I need to get started?
To follow along this course (at a comfortable pace) you will need the following:
- [n8n set up](/hosting/options/). This course was developed on n8n version 0.161.
- Basic knowledge of n8n. We strongly recommend taking our Level 1 course prior to this one.
## How long does it take to complete the course?
Completing the course should take around two hours. You do not have to complete it in one go, feel free to take breaks and resume whenever you are ready.
## Do I get a certificate?
We believe all good works deserve recognition. If you successfully complete the course, you will get a **badge** in your [community forum](http://community.n8n.io/) profile to showcase your n8n skills. To get your n8n badge, you need to complete the following milestones:
- [x] [Sign up](https://n8n-community.typeform.com/to/HQoQ7nXg) for the course to get your unique ID and other information you will need for the exercises.
- [x] Run an HTTP Request to get the data set.
- [x] Automatically generate binary files and send notifications in Discord.
- [x] Pass the quiz at the end of the course.

View File

@ -30,7 +30,7 @@ In n8n, all data passed between nodes is an array of objects. It has the followi
```
!!! note "Skipping the 'json' key and array syntax"
From 0.166.0 onwards, n8n automatically adds the `json` key if it is missing. It also automatically wraps your items in an array (`[]`) if needed.
From 0.166.0 onwards, when using the function node, n8n automatically adds the `json` key if it's missing. It also automatically wraps your items in an array (`[]`) if needed. This is only when using the Function node. When building your own nodes, you must still make sure the node returns data with the `json` key.
## Data flow

View File

@ -0,0 +1,70 @@
# Markdown
The Markdown node converts between Markdown and HTML formats.
## Options
You can configure the node's output using **Options**. Click **Add Option** to view and select your options.
!!! note "Test out the options"
Some of the options depend on each other, or can interact. We recommend testing out options to check the effects are what you want.
### Markdown to HTML
| Option | Description | Default |
| ------ | ----------- | ------- |
| **Add Blank To Links** | Whether to open links a new window (enabled) or not (disabled). | Disabled |
| **Automatic Linking To URLs** | Whether to automatically link to URLs (enabled) or not (disabled). If enabled, n8n converts any string that it identifies as a URL to a link. | Disabled |
| **Backslash Escapes HTML Tags** | Whether to allow backslash escaping of HTML tags (enabled) or not (disabled). When enabled, n8n escapes any `<` or `>` prefaced with `\`. For example, `\<div\>` renders as `&lt;div&gt;`. | Disabled |
| **Complete HTML Document** | Whether to output a complete HTML document (enabled) or an HTML fragment (disabled). A complete HTML document includes the `<DOCTYPE HTML>` declaration, `<html>` and `<body>` tags, and the `<head>` element. | Disabled |
| **Customized Header ID** | Whether to support custom heading IDs (enabled) or not (disabled). When enabled, you can add custom heading IDs using `{header ID here}` after the heading text. | Disabled |
| **Emoji Support** | Whether to support emojis (enabled) or not (disabled). | Disabled. |
| **Encode Emails** | Whether to transform ASCII character emails into their equivalent decimal entities (enabled) or not (disabled). | Enabled |
| **Exclude Trailing Punctuation From URLs** | Whether to exclude trailing punctuation from auto-linked URLs (enabled) or not (disabled). For use with **Automatic Linking To URLs**. | Disabled |
| **GitHub Code Blocks** | Whether to enable GitHub Flavored Markdown code blocks (enabled) or not (disabled). | Enabled |
| **GitHub Compatible Header IDs** | Whether to generate GitHub Flavored Markdown heading IDs (enabled) or not (disabled). GitHub Flavored Markdown generates heading IDs with `-` in place of spaces and removes non-alphanumeric characters. | Disabled |
| **GitHub Mention Link** | Change the link used with **GitHub Mentions**. | Disabled |
| **GitHub Mentions** | Whether to support tagging GitHub users with `@` (enabled) or not (disabled). When enabled, n8n replaces `@name` with `https://github.com/name`. | Disabled |
| **GitHub Task Lists** | Whether to support GitHub Flavored Markdown task lists (enabled) or not (disabled). | Disabled |
| **Header Level Start** | Number. Set the start level for headers. For example, changing this field to `2` causes n8n to treat `#` as `<h2>`, `##` as `<h3>`, and so on. | 1 |
| **Mandatory Space Before Header** | Whether to make a space between `#` and heading text required (enabled) or not (disabled). When enabled, n8n renders a heading written as `##Some header text` literally (it does not turn it into a heading element) | Disabled |
| **Middle Word Asterisks** | Whether n8n should treat asterisks in words as Markdown (disabled) or render them as literal asterisks (enabled). | Disabled |
| **Middle Word Underscores** | Whether n8n should treat underscores in words as Markdown (disabled) or render them as literal underscores (enabled). | Disabled |
| **No Header ID** | Disable automatic generation of header IDs (enabled). | Disabled |
| **Parse Image Dimensions** | Support setting maximum image dimensions in Markdown syntaxt (enabled). | Disabled |
| **Prefix Header ID** | Define a prefix to add to header IDs. | None |
| **Raw Header ID** | Whether to remove spaces, `'`, and `"` from header IDs, including prefixes, replacing them with `-` (enabled) or not (disabled). | Disabled |
| **Raw Prefix Header ID** | Whether to prevent n8n from modifying header prefixes (enabled) or not (disabled) | Disabled |
| **Simple Line Breaks** | Whether to create line breaks without a double space at the end of a line (enabled) or not (disabled). | Disabled |
| **Smart Indentation Fix** | Whether to try to smartly fix indentation problems related to ES6 template strings in indented code blocks (enabled) or not (disabled). | Disabled |
| **Spaces Indented Sublists** | Whether to remove the requirement to indent sublists four spaces (enabled) or not (disabled). | Disabled |
| **Split Adjacent Blockquotes** | Whether to split adjacent blockquote blocks (enabled) or not (disabled). If you don't enable this, n8n treats quotes (indicated by `>` at the start of the line) on separate lines as a single blockquote, even when separated by an empty line. | Disabled |
| **Strikethrough** | Whether to support strikethrough syntax (enabled) or not (disabled). When enabled, you can add a ~~strikethrough~~ effect using `~~` around the word or phrase. | Disabled |
| **Tables Header ID** | Whether to add an ID to table header tags (enabled) or not (disabled). | Disabled |
| **Tables Support** | Whether to support tables (enabled) or not (disabled). | Disabled |
### HTML to Markdown
| Option | Description | Default |
| ------ | ----------- | ------- |
| **Bullet Marker** | Specify the character to use for unordered lists. | * |
| **Code Block Fence** | Specify the characters to use for code blocks. | ``` |
| **Emphasis Delimiter** | Specify the character `<em>`. | _ |
| **Global Escape Pattern** | Overrides the default character escape settings. You may want to use Text Replacement Pattern instead. | None |
| **Ignored Elements** | Ignore given HTML elements, and their children. | None |
| **Keep Images With Data** | Whether to keep images with data (enabled) or not (disabled). Support files up to 1MB. | Disabled |
| **Line Start Escape Pattern** | Overrides the default character escape settings. You may want to use Text Replacement Pattern instead. | None |
| **Max Consecutive New Lines** | Number. Specify the maximum number of consecutive new lines allowed. | 3 |
| **Place URLs At The Bottom** | Whether to place URLs at the bottom of the page and format using link reference definitions (enabled) or not (disabled). | Disabled |
| **Strong Delimiter** | Specify the characters for `<strong>`. | ** |
| **Style For Code Block** | Specify the styling for code blocks. Options are **Fence** and **Indented**. | Fence |
| **Text Replacement Pattern** | Define a text replacement pattern using regex. | None |
| **Treat As Blocks** | Specify HTML elements to treat as blocks (surround with blank lines) | None |
## Parsers
n8n uses the following parsers:
* To convert from HTML to Markdown: [node-html-markdown](https://www.npmjs.com/package/node-html-markdown)
* To convert from Markdown to HTML: [Showdown](https://www.npmjs.com/package/showdown). Some options allow you to extend your Markdown with [GitHub Flavored Markdown](https://github.github.com/gfm/).

View File

@ -4,17 +4,19 @@ The Read Binary File node is used to read a file from the host machine that runs
!!! note " Keep in mind"
1. If you are running n8n in Docker, your command will run on the n8n container and not the Docker host.
2. This node will look for files relative to the n8n install path. It is recommended to use absolute file paths to prevent any errors.
2. This node will look for files relative to the n8n install path. It is recommended to use absolute file paths to prevent any errors.
## Node Reference
1. *File Path* field: This field specifies the path to the file.
2. *Property Name* field: Name of the binary property to which to write the data of the read file.
1. **File Path** field: This field specifies the path to the file.
2. **Property Name** field: Name of the binary property to which to write the data of the read file.
## Example Usage
This workflow allows you to read a file from the host machine using the Read Binary File node. You can also find the [workflow](https://n8n.io/workflows/577) on the website. This example usage workflow would use the following two nodes.
- [Start](/integrations/core-nodes/n8n-nodes-base.start/)
- [Read Binary File]()
@ -29,5 +31,5 @@ The start node exists by default when you create a new workflow.
### 2. Read Binary File node
1. Enter the path to the file you want to read in the *File Path* field.
2. Click on *Execute Node* to run the workflow.
1. Enter the path to the file you want to read in the **File Path** field.
2. Click on **Execute Node** to run the workflow.

View File

@ -2,7 +2,7 @@
[Discord](https://discord.com/) is a voice, video, and text communications platform for groups. Discord allows users to programmatically send messages using webhooks.
!!! note "🔑 Credentials"
!!! note "Credentials"
The Discord node does not require authentication, but you must have access to a channel's settings to use webhooks. You can find out how to create a webhook in Discord [here](/integrations/credentials/discord/).
@ -27,8 +27,8 @@ The start node exists by default when you create a new workflow.
### 2. Discord node
1. First of all, you'll have to create a webhook for the Discord node. You can find out how to do that [here](/integrations/credentials/discord/).
2. Paste your webhook into the ***Webhook URL*** field.
5. Enter your message in the ***Text*** field.
6. Click on ***Execute Node*** to run the workflow.
2. Paste your webhook into the **Webhook URL** field.
5. Enter your message in the **Text** field.
6. Click on **Execute Node** to run the workflow.
![Sending a message to a Discord channel using the Discord node](/_images/integrations/nodes/discord/discord_node.png)

View File

@ -1,5 +1,51 @@
# Release notes
## n8n@0.173.1
View the [commits](https://github.com/n8n-io/n8n/compare/n8n@0.173.0...n8n@0.173.1) for this version.<br />
**Release date:** 2022-04-19
Fixes a bug with the Discord node icon name.
## n8n@0.173.0
View the [commits](https://github.com/n8n-io/n8n/compare/n8n@0.172.0...n8n@0.173.0) for this version.<br />
**Release date:** 2022-04-19
### New features and nodes
[Markdown node](/integrations/core-nodes/n8n-nodes-base.markdown/): added a new Markdown node to convert between Markdown and HTML.
### Enhancements
**editor**: you can now drag and drop nodes from the nodes panel onto the canvas.
### Node enhancements
* [Discord node](/integrations/nodes/n8n-nodes-base.discord/): additional fields now available when sending a message to Discord.
* [GoogleBigQuery](/integrations/nodes/n8n-nodes-base.googleBigQuery/): added support for service account authentication.
* [Google Cloud Realtime Database node](/integrations/nodes/n8n-nodes-base.googleCloudRealtimeDatabase/): you can now select a region.
* [PagerDuty node](/integrations/nodes/n8n-nodes-base.pagerDuty/): now supports more detail in incidents.
* [Slack node](/integrations/nodes/n8n-nodes-base.slack/): added support for blocks in Slack message update.
### Bug fixes
* **core**: make the email for user management case insensitive.
* **core**: add `rawBody` for XML requests.
* **editor**: fix a glitch that caused dropdowns to break after adding expressions.
* **editor**: reset text input value when closed with `Esc`.
* [Discourse node](/integrations/nodes/n8n-nodes-base.discourse/): fix an issue that was causing incomplete results when getting posts. Added a credentials test.
* [Zendesk trigger node](/integrations/trigger-nodes/n8n-nodes-base.zendeskTrigger): remove deprecated targets, replace with webhooks.
* [Zoho node](/integrations/nodes/n8n-nodes-base.zohoCrm): fix pagination issue.
### Contributors
[Florian Metz](https://github.com/Timeraa)
[Francesco Pongiluppi](https://github.com/willywongi)
[Mark Steve Samson](https://github.com/marksteve)
[Mike Quinlan](https://github.com/mjquinlan2000)
## n8n@0.172.0
View the [commits](https://github.com/n8n-io/n8n/compare/n8n@0.171.1...n8n@0.172.0) for this version.<br />

View File

@ -32,18 +32,25 @@ markdown_extensions:
- admonition
# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences Superfences is required for several other features. Always enable.
- pymdownx.superfences
- pymdownx.details
# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#superfences Used for tags, setting unique templates for certain pages, and other custom frontmatter.
- meta
# https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/
- pymdownx.emoji:
emoji_index: !!python/name:materialx.emoji.twemoji
emoji_generator: !!python/name:materialx.emoji.to_svg
# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#highlight
- pymdownx.highlight:
linenums: true
- pymdownx.tasklist:
custom_checkbox: true
# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#inlinehilite
- pymdownx.inlinehilite
# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#snippets
- pymdownx.snippets
- pymdownx.snippets
# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/#tabbed
- pymdownx.tabbed:
alternate_style: true
alternate_style: true
- tables
# https://www.mkdocs.org/user-guide/writing-your-docs/#linking-to-pages
- toc:
@ -51,12 +58,12 @@ markdown_extensions:
plugins:
- search
- literate-nav
nav:
- Using n8n:
nav:
- Using n8n:
- Welcome: index.md
- Try it out: quickstart.md
- Editor UI: editor-ui.md
- Understand workflows:
- Understand workflows:
- Overview: workflows/index.md
- Workflows: workflows/workflows.md
- Connections: workflows/connections.md
@ -73,9 +80,9 @@ nav:
- Data structure: data/data-structure.md
- Transforming data: data/transforming-data.md
- Using code: data/code.md
- Code examples:
- Code examples:
- Overview: code-examples/index.md
- Expressions:
- Expressions:
- Overview: code-examples/expressions/index.md
- Methods: code-examples/expressions/methods.md
- Variables: code-examples/expressions/variables.md
@ -95,7 +102,7 @@ nav:
- Glossary: reference/glossary.md
- License: reference/license.md
- Data collection: reference/data-collection.md
- Integrations:
- Integrations:
- Overview: integrations/index.md
- Core nodes: integrations/core-nodes/
- Nodes: integrations/nodes/
@ -133,8 +140,20 @@ nav:
- Scheduling the workflow: courses/level-one/chapter-5/chapter-5.7.md
- Activating and examining the workflow: courses/level-one/chapter-5/chapter-5.8.md
- Exporting, importing, and sharing workflows: courses/level-one/chapter-6.md
- Take the quiz and get your certificate: courses/level-one/chapter-7.md
- Hosting n8n:
- Test your knowledge: courses/level-one/chapter-7.md
- Level two:
- Overview: courses/level-two/index.md
- Understanding the data structure: courses/level-two/chapter-1.md
- Processing different data types: courses/level-two/chapter-2.md
- Merging and splitting data: courses/level-two/chapter-3.md
- Dealing with errors in workflows: courses/level-two/chapter-4.md
- Automating a business workflow:
- Use case: courses/level-two/chapter-5/chapter-5.0.md
- Workflow 1: courses/level-two/chapter-5/chapter-5.1.md
- Workflow 2: courses/level-two/chapter-5/chapter-5.2.md
- Workflow 3: courses/level-two/chapter-5/chapter-5.3.md
- Test your knowledge: courses/level-two/chapter-6.md
- Hosting n8n:
- Overview: hosting/index.md
- Installation and hosting options: hosting/options.md
- Installation:
@ -167,4 +186,4 @@ nav:
- Execution data: hosting/scaling/execution-data.md
- Execution modes and processes: hosting/scaling/execution-modes-processes.md
- Configuring queue mode: hosting/scaling/queue-mode.md
- Contributing: contributing.md
- Contributing: contributing.md

View File

@ -22,12 +22,14 @@
"/getting-started/installation/advanced/server-setup.html#docker-compose-example": "/hosting/server-setups/docker-compose/",
"/getting-started/installation/advanced/server-setup.html#hosting-with-caddy-server": "/hosting/server-setups/caddy/",
"/reference/faq.html#integrations": "/integrations/#requesting-new-integrations-or-integration-features",
"/reference/faq.html": "/reference/license/",
"/reference/faq.html#license": "/reference/license/",
"/reference/faq.html#n8n-cloud": "/hosting/installation/cloud/",
// High traffic anchor tag landing pages (if not covered by the above or by /docs/_redirects)
"/#what-is-n8n": "/",
"/getting-started/tutorials.html#blogposts": "https://n8n.io/blog/tag/tutorial/",
"/#/server-setup": "/hosting/server-setups/"
"/#/server-setup": "/hosting/server-setups/",
"/code-examples/expressions/expressions.html": "/code-examples/expressions/"

View File

@ -0,0 +1,9 @@
extends: existence
message: Use 'AM' or 'PM' (preceded by a space).
link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms
level: error
nonword: true
tokens:
- '\d{1,2}[AP]M'
- '\d{1,2} ?[ap]m'
- '\d{1,2} ?[aApP]\.[mM]\.'

View File

@ -0,0 +1,25 @@
extends: existence
message: "Don't use language (such as '%s') that defines people by their disability."
link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/accessibility-terms
level: suggestion
ignorecase: true
tokens:
- a victim of
- able-bodied
- affected by
- an epileptic
- crippled
- disabled
- dumb
- handicapped
- handicaps
- healthy
- lame
- maimed
- missing a limb
- mute
- normal
- sight-impaired
- stricken with
- suffers from
- vision-impaired

View File

@ -0,0 +1,64 @@
extends: conditional
message: "'%s' has no definition."
link: https://docs.microsoft.com/en-us/style-guide/acronyms
level: suggestion
ignorecase: false
# Ensures that the existence of 'first' implies the existence of 'second'.
first: '\b([A-Z]{3,5})\b'
second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
# ... with the exception of these:
exceptions:
- API
- ASP
- CLI
- CPU
- CSS
- CSV
- DEBUG
- DOM
- DPI
- FAQ
- GCC
- GDB
- GET
- GPU
- GTK
- GUI
- HTML
- HTTP
- HTTPS
- IDE
- JAR
- JSON
- JSX
- LESS
- LLDB
- NET
- NOTE
- NVDA
- OSS
- PATH
- PDF
- PHP
- POST
- RAM
- REPL
- RSA
- SCM
- SCSS
- SDK
- SQL
- SSH
- SSL
- SVG
- TBD
- TCP
- TODO
- URI
- URL
- USB
- UTF
- XML
- XSS
- YAML
- ZIP

View File

@ -0,0 +1,270 @@
extends: existence
message: "Consider removing '%s'."
link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences
ignorecase: true
level: warning
action:
name: remove
tokens:
- abnormally
- absentmindedly
- accidentally
- adventurously
- anxiously
- arrogantly
- awkwardly
- bashfully
- beautifully
- bitterly
- bleakly
- blindly
- blissfully
- boastfully
- boldly
- bravely
- briefly
- brightly
- briskly
- broadly
- busily
- calmly
- carefully
- carelessly
- cautiously
- cheerfully
- cleverly
- closely
- coaxingly
- colorfully
- continually
- coolly
- courageously
- crossly
- cruelly
- curiously
- daintily
- dearly
- deceivingly
- deeply
- defiantly
- deliberately
- delightfully
- diligently
- dimly
- doubtfully
- dreamily
- easily
- elegantly
- energetically
- enormously
- enthusiastically
- excitedly
- extremely
- fairly
- faithfully
- famously
- ferociously
- fervently
- fiercely
- fondly
- foolishly
- fortunately
- frankly
- frantically
- freely
- frenetically
- frightfully
- furiously
- generally
- generously
- gently
- gladly
- gleefully
- gracefully
- gratefully
- greatly
- greedily
- happily
- hastily
- healthily
- heavily
- helplessly
- honestly
- hopelessly
- hungrily
- innocently
- inquisitively
- intensely
- intently
- interestingly
- inwardly
- irritably
- jaggedly
- jealously
- jovially
- joyfully
- joyously
- jubilantly
- judgmentally
- justly
- keenly
- kiddingly
- kindheartedly
- knavishly
- knowingly
- knowledgeably
- lazily
- lightly
- limply
- lively
- loftily
- longingly
- loosely
- loudly
- lovingly
- loyally
- madly
- majestically
- meaningfully
- mechanically
- merrily
- miserably
- mockingly
- mortally
- mysteriously
- naturally
- nearly
- neatly
- nervously
- nicely
- noisily
- obediently
- obnoxiously
- oddly
- offensively
- optimistically
- overconfidently
- painfully
- partially
- patiently
- perfectly
- playfully
- politely
- poorly
- positively
- potentially
- powerfully
- promptly
- properly
- punctually
- quaintly
- queasily
- queerly
- questionably
- quickly
- quietly
- quirkily
- quizzically
- randomly
- rapidly
- rarely
- readily
- really
- reassuringly
- recklessly
- regularly
- reluctantly
- repeatedly
- reproachfully
- restfully
- righteously
- rightfully
- rigidly
- roughly
- rudely
- safely
- scarcely
- scarily
- searchingly
- sedately
- seemingly
- selfishly
- separately
- seriously
- shakily
- sharply
- sheepishly
- shrilly
- shyly
- silently
- sleepily
- slowly
- smoothly
- softly
- solemnly
- solidly
- speedily
- stealthily
- sternly
- strictly
- suddenly
- supposedly
- surprisingly
- suspiciously
- sweetly
- swiftly
- sympathetically
- tenderly
- tensely
- terribly
- thankfully
- thoroughly
- thoughtfully
- tightly
- tremendously
- triumphantly
- truthfully
- ultimately
- unabashedly
- unaccountably
- unbearably
- unethically
- unexpectedly
- unfortunately
- unimpressively
- unnaturally
- unnecessarily
- urgently
- usefully
- uselessly
- utterly
- vacantly
- vaguely
- vainly
- valiantly
- vastly
- verbally
- very
- viciously
- victoriously
- violently
- vivaciously
- voluntarily
- warmly
- weakly
- wearily
- wetly
- wholly
- wildly
- willfully
- wisely
- woefully
- wonderfully
- worriedly
- yawningly
- yearningly
- yieldingly
- youthfully
- zealously
- zestfully
- zestily

11
styles/Microsoft/Auto.yml Normal file
View File

@ -0,0 +1,11 @@
extends: existence
message: "In general, don't hyphenate '%s'."
link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/auto
ignorecase: true
level: error
action:
name: convert
params:
- simple
tokens:
- 'auto-\w+'

View File

@ -0,0 +1,14 @@
extends: existence
message: "Don't use '%s'. See the A-Z word list for details."
# See the A-Z word list
link: https://docs.microsoft.com/en-us/style-guide
ignorecase: true
level: error
tokens:
- abortion
- and so on
- app(?:lication)?s? (?:developer|program)
- app(?:lication)? file
- backbone
- backend
- contiguous selection

View File

@ -0,0 +1,120 @@
extends: substitution
message: "Consider using '%s' instead of '%s'."
link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences
ignorecase: true
level: suggestion
action:
name: replace
swap:
"approximate(?:ly)?": about
abundance: plenty
accelerate: speed up
accentuate: stress
accompany: go with
accomplish: carry out|do
accorded: given
accordingly: so
accrue: add
accurate: right|exact
acquiesce: agree
acquire: get|buy
additional: more|extra
address: discuss
addressees: you
adjacent to: next to
adjustment: change
admissible: allowed
advantageous: helpful
advise: tell
aggregate: total
aircraft: plane
alleviate: ease
allocate: assign|divide
alternatively: or
alternatives: choices|options
ameliorate: improve
amend: change
anticipate: expect
apparent: clear|plain
ascertain: discover|find out
assistance: help
attain: meet
attempt: try
authorize: allow
belated: late
bestow: give
cease: stop|end
collaborate: work together
commence: begin
compensate: pay
component: part
comprise: form|include
concept: idea
concerning: about
confer: give|award
consequently: so
consolidate: merge
constitutes: forms
contains: has
convene: meet
demonstrate: show|prove
depart: leave
designate: choose
desire: want|wish
determine: decide|find
detrimental: bad|harmful
disclose: share|tell
discontinue: stop
disseminate: send|give
eliminate: end
elucidate: explain
employ: use
enclosed: inside|included
encounter: meet
endeavor: try
enumerate: count
equitable: fair
equivalent: equal
exclusively: only
expedite: hurry
facilitate: ease
females: women
finalize: complete|finish
frequently: often
identical: same
incorrect: wrong
indication: sign
initiate: start|begin
itemized: listed
jeopardize: risk
liaise: work with|partner with
maintain: keep|support
methodology: method
modify: change
monitor: check|watch
multiple: many
necessitate: cause
notify: tell
numerous: many
objective: aim|goal
obligate: bind|compel
optimum: best|most
permit: let
portion: part
possess: own
previous: earlier
previously: before
prioritize: rank
procure: buy
provide: give|offer
purchase: buy
relocate: move
solicit: request
state-of-the-art: latest
subsequent: later|next
substantial: large
sufficient: enough
terminate: end
transmit: send
utilization: use
utilize: use

View File

@ -0,0 +1,50 @@
extends: substitution
message: "Use '%s' instead of '%s'."
link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-contractions
level: error
ignorecase: true
action:
name: replace
swap:
are not: aren't
cannot: can't
could not: couldn't
did not: didn't
do not: don't
does not: doesn't
has not: hasn't
have not: haven't
how is: how's
is not: isn't
'it is(?!\.)': it's
'it''s(?=\.)': it is
should not: shouldn't
'that is(?!\.)': that's
'that''s(?=\.)': that is
'they are(?!\.)': they're
'they''re(?=\.)': they are
was not: wasn't
'we are(?!\.)': we're
'we''re(?=\.)': we are
'we have(?!\.)': we've
'we''ve(?=\.)': we have
were not: weren't
'what is(?!\.)': what's
'what''s(?=\.)': what is
'when is(?!\.)': when's
'when''s(?=\.)': when is
'where is(?!\.)': where's
'where''s(?=\.)': where is
will not: won't

View File

@ -0,0 +1,13 @@
extends: existence
message: "Remove the spaces around '%s'."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/emes
ignorecase: true
nonword: true
level: error
action:
name: edit
params:
- remove
- ' '
tokens:
- '[—–]\s|\s[—–]'

View File

@ -0,0 +1,8 @@
extends: existence
message: Use 'July 31, 2016' format, not '%s'.
link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms
ignorecase: true
level: error
nonword: true
tokens:
- '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}'

View File

@ -0,0 +1,40 @@
extends: existence
message: "Don't use ordinal numbers for dates."
link: https://docs.microsoft.com/en-us/style-guide/numbers#numbers-in-dates
level: error
nonword: true
ignorecase: true
raw:
- \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?)\b\s*
tokens:
- first
- second
- third
- fourth
- fifth
- sixth
- seventh
- eighth
- ninth
- tenth
- eleventh
- twelfth
- thirteenth
- fourteenth
- fifteenth
- sixteenth
- seventeenth
- eighteenth
- nineteenth
- twentieth
- twenty-first
- twenty-second
- twenty-third
- twenty-fourth
- twenty-fifth
- twenty-sixth
- twenty-seventh
- twenty-eighth
- twenty-ninth
- thirtieth
- thirty-first

View File

@ -0,0 +1,8 @@
extends: existence
message: "Always spell out the name of the month."
link: https://docs.microsoft.com/en-us/style-guide/numbers#numbers-in-dates
ignorecase: true
level: error
nonword: true
tokens:
- '\b\d{1,2}/\d{1,2}/(?:\d{4}|\d{2})\b'

View File

@ -0,0 +1,9 @@
extends: existence
message: "In general, don't use an ellipsis."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/ellipses
nonword: true
level: warning
action:
name: remove
tokens:
- '\.\.\.'

View File

@ -0,0 +1,16 @@
extends: existence
message: "Use first person (such as '%s') sparingly."
link: https://docs.microsoft.com/en-us/style-guide/grammar/person
ignorecase: true
level: warning
nonword: true
tokens:
- (?:^|\s)I\s
- (?:^|\s)I,\s
- \bI'd\b
- \bI'll\b
- \bI'm\b
- \bI've\b
- \bme\b
- \bmy\b
- \bmine\b

View File

@ -0,0 +1,12 @@
extends: substitution
message: "Use '%s' instead of '%s'."
link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-us-spelling-avoid-non-english-words
ignorecase: true
level: error
nonword: true
action:
name: replace
swap:
'\b(?:eg|e\.g\.)[\s,]': for example
'\b(?:ie|i\.e\.)[\s,]': that is

View File

@ -0,0 +1,8 @@
extends: existence
message: "Don't use '%s'."
link: https://github.com/MicrosoftDocs/microsoft-style-guide/blob/master/styleguide/grammar/nouns-pronouns.md#pronouns-and-gender
level: error
ignorecase: true
tokens:
- he/she
- s/he

View File

@ -0,0 +1,44 @@
extends: substitution
message: "Consider using '%s' instead of '%s'."
ignorecase: true
level: error
swap:
(?:alumna|alumnus): graduate
(?:alumnae|alumni): graduates
air(?:m[ae]n|wom[ae]n): pilot(s)
anchor(?:m[ae]n|wom[ae]n): anchor(s)
authoress: author
camera(?:m[ae]n|wom[ae]n): camera operator(s)
chair(?:m[ae]n|wom[ae]n): chair(s)
congress(?:m[ae]n|wom[ae]n): member(s) of congress
door(?:m[ae]|wom[ae]n): concierge(s)
draft(?:m[ae]n|wom[ae]n): drafter(s)
fire(?:m[ae]n|wom[ae]n): firefighter(s)
fisher(?:m[ae]n|wom[ae]n): fisher(s)
fresh(?:m[ae]n|wom[ae]n): first-year student(s)
garbage(?:m[ae]n|wom[ae]n): waste collector(s)
lady lawyer: lawyer
ladylike: courteous
landlord: building manager
mail(?:m[ae]n|wom[ae]n): mail carriers
man and wife: husband and wife
man enough: strong enough
mankind: human kind
manmade: manufactured
manpower: personnel
men and girls: men and women
middle(?:m[ae]n|wom[ae]n): intermediary
news(?:m[ae]n|wom[ae]n): journalist(s)
ombuds(?:man|woman): ombuds
oneupmanship: upstaging
poetess: poet
police(?:m[ae]n|wom[ae]n): police officer(s)
repair(?:m[ae]n|wom[ae]n): technician(s)
sales(?:m[ae]n|wom[ae]n): salesperson or sales people
service(?:m[ae]n|wom[ae]n): soldier(s)
steward(?:ess)?: flight attendant
tribes(?:m[ae]n|wom[ae]n): tribe member(s)
waitress: waiter
woman doctor: doctor
woman scientist[s]?: scientist(s)
work(?:m[ae]n|wom[ae]n): worker(s)

View File

@ -0,0 +1,11 @@
extends: existence
message: "For a general audience, use 'address' rather than 'URL'."
link: https://docs.microsoft.com/en-us/style-guide/urls-web-addresses
level: warning
action:
name: replace
params:
- URL
- address
tokens:
- URL

View File

@ -0,0 +1,7 @@
extends: existence
message: "Avoid using acronyms in a title or heading."
link: https://docs.microsoft.com/en-us/style-guide/acronyms#be-careful-with-acronyms-in-titles-and-headings
level: warning
scope: heading
tokens:
- '[A-Z]{2,4}'

View File

@ -0,0 +1,8 @@
extends: existence
message: "Capitalize '%s'."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/colons
nonword: true
level: error
scope: heading
tokens:
- ':\s[a-z]'

View File

@ -0,0 +1,13 @@
extends: existence
message: "Don't use end punctuation in headings."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/periods
nonword: true
level: warning
scope: heading
action:
name: edit
params:
- remove
- '.?!'
tokens:
- '[a-z][.?!](?:\s|$)'

View File

@ -0,0 +1,28 @@
extends: capitalization
message: "'%s' should use sentence-style capitalization."
link: https://docs.microsoft.com/en-us/style-guide/capitalization
level: suggestion
scope: heading
match: $sentence
indicators:
- ':'
exceptions:
- Azure
- CLI
- Code
- Cosmos
- Docker
- Emmet
- I
- Kubernetes
- Linux
- macOS
- Marketplace
- MongoDB
- REPL
- Studio
- TypeScript
- URLs
- Visual
- VS
- Windows

View File

@ -0,0 +1,14 @@
extends: existence
message: "'%s' doesn't need a hyphen."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/hyphens
level: warning
ignorecase: false
nonword: true
action:
name: edit
params:
- replace
- '-'
- ' '
tokens:
- '\s[^\s-]+ly-'

View File

@ -0,0 +1,13 @@
extends: existence
message: "Form a negative number with an en dash, not a hyphen."
link: https://docs.microsoft.com/en-us/style-guide/numbers
nonword: true
level: error
action:
name: edit
params:
- replace
- '-'
- ''
tokens:
- '\s-\d+\s'

View File

@ -0,0 +1,13 @@
extends: existence
message: "Don't add -ly to an ordinal number."
link: https://docs.microsoft.com/en-us/style-guide/numbers
level: error
action:
name: edit
params:
- trim
- ly
tokens:
- firstly
- secondly
- thirdly

View File

@ -0,0 +1,8 @@
extends: existence
message: "Use the Oxford comma in '%s'."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/commas
scope: sentence
level: suggestion
nonword: true
tokens:
- '(?:[^\s,]+,){1,} \w+ (?:and|or) \w+[.?!]'

View File

@ -0,0 +1,183 @@
extends: existence
message: "'%s' looks like passive voice."
ignorecase: true
level: suggestion
raw:
- \b(am|are|were|being|is|been|was|be)\b\s*
tokens:
- '[\w]+ed'
- awoken
- beat
- become
- been
- begun
- bent
- beset
- bet
- bid
- bidden
- bitten
- bled
- blown
- born
- bought
- bound
- bred
- broadcast
- broken
- brought
- built
- burnt
- burst
- cast
- caught
- chosen
- clung
- come
- cost
- crept
- cut
- dealt
- dived
- done
- drawn
- dreamt
- driven
- drunk
- dug
- eaten
- fallen
- fed
- felt
- fit
- fled
- flown
- flung
- forbidden
- foregone
- forgiven
- forgotten
- forsaken
- fought
- found
- frozen
- given
- gone
- gotten
- ground
- grown
- heard
- held
- hidden
- hit
- hung
- hurt
- kept
- knelt
- knit
- known
- laid
- lain
- leapt
- learnt
- led
- left
- lent
- let
- lighted
- lost
- made
- meant
- met
- misspelt
- mistaken
- mown
- overcome
- overdone
- overtaken
- overthrown
- paid
- pled
- proven
- put
- quit
- read
- rid
- ridden
- risen
- run
- rung
- said
- sat
- sawn
- seen
- sent
- set
- sewn
- shaken
- shaven
- shed
- shod
- shone
- shorn
- shot
- shown
- shrunk
- shut
- slain
- slept
- slid
- slit
- slung
- smitten
- sold
- sought
- sown
- sped
- spent
- spilt
- spit
- split
- spoken
- spread
- sprung
- spun
- stolen
- stood
- stridden
- striven
- struck
- strung
- stuck
- stung
- stunk
- sung
- sunk
- swept
- swollen
- sworn
- swum
- swung
- taken
- taught
- thought
- thrived
- thrown
- thrust
- told
- torn
- trodden
- understood
- upheld
- upset
- wed
- wept
- withheld
- withstood
- woken
- won
- worn
- wound
- woven
- written
- wrung

View File

@ -0,0 +1,7 @@
extends: existence
message: "Use a numeral plus the units."
link: https://docs.microsoft.com/en-us/style-guide/numbers
nonword: true
level: error
tokens:
- '\b[a-zA-z]+\spercent\b'

View File

@ -0,0 +1,7 @@
extends: existence
message: 'Punctuation should be inside the quotes.'
link: https://docs.microsoft.com/en-us/style-guide/punctuation/quotation-marks
level: error
nonword: true
tokens:
- '["“][^"”“]+["”][.,]'

View File

@ -0,0 +1,13 @@
extends: existence
message: "Use an en dash in a range of numbers."
link: https://docs.microsoft.com/en-us/style-guide/numbers
nonword: true
level: error
action:
name: edit
params:
- replace
- '-'
- ''
tokens:
- '\b\d+\s?[-]\s?\d+\b'

View File

@ -0,0 +1,13 @@
extends: existence
message: "Use 'to' instead of a dash in '%s'."
link: https://docs.microsoft.com/en-us/style-guide/numbers
nonword: true
level: error
action:
name: edit
params:
- replace
- '[-]'
- 'to'
tokens:
- '\b(?:AM|PM)\s?[-]\s?.+(?:AM|PM)\b'

View File

@ -0,0 +1,7 @@
extends: existence
message: "In most cases, use 'from' or 'through' to describe a range of numbers."
link: 'https://docs.microsoft.com/en-us/style-guide/numbers'
nonword: true
level: warning
tokens:
- '\b\d+\s?[-]\s?\d+\b'

View File

@ -0,0 +1,8 @@
extends: existence
message: "Try to simplify this sentence."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/semicolons
nonword: true
scope: sentence
level: suggestion
tokens:
- ';'

View File

@ -0,0 +1,7 @@
extends: occurrence
message: "Try to keep sentences short (< 30 words)."
scope: sentence
level: suggestion
max: 30
token: \b(\w+)\b

View File

@ -0,0 +1,8 @@
extends: existence
message: "'%s' should have one space."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/periods
level: error
nonword: true
tokens:
- '[a-z][.?!] {2,}[A-Z]'
- '[a-z][.?!][A-Z]'

View File

@ -0,0 +1,7 @@
extends: existence
message: "Don't use '%s' unless space is limited."
link: https://docs.microsoft.com/en-us/style-guide/punctuation/dashes-hyphens/hyphens
ignorecase: true
level: warning
tokens:
- '\w+- and \w+-'

View File

@ -0,0 +1,43 @@
extends: substitution
message: "Prefer '%s' over '%s'."
level: warning
ignorecase: true
action:
name: replace
swap:
'(?:agent|virtual assistant|intelligent personal assistant)': personal digital assistant
'(?:drive C:|drive C>|C: drive)': drive C
'(?:internet bot|web robot)s?': bot(s)
'(?:microsoft cloud|the cloud)': cloud
'(?:mobile|smart) ?phone': phone
'24/7': every day
'audio(?:-| )book': audiobook
'back(?:-| )light': backlight
'chat ?bots?': chatbot(s)
adaptor: adapter
administrate: administer
afterwards: afterward
alphabetic: alphabetical
alphanumerical: alphanumeric
anti-aliasing: antialiasing
anti-malware: antimalware
anti-spyware: antispyware
anti-virus: antivirus
appendixes: appendices
artificial intelligence: artificial intelligence
assembler: assembly language
bpp: bpp
bps: bps
caap: CaaP
conversation-as-a-platform: conversation as a platform
eb: EB
gb: GB
gbps: Gbps
kb: KB
keypress: keystroke
mb: MB
pb: PB
tb: TB
zb: ZB
viz: namely
ergo: therefore

View File

@ -0,0 +1,10 @@
extends: substitution
message: "Use '%s' instead of '%s'."
ignorecase: true
level: error
action:
name: replace
swap:
URL for: URL of
an URL: a URL

View File

@ -0,0 +1,16 @@
extends: existence
message: "Don't spell out the number in '%s'."
link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/units-of-measure-terms
level: error
raw:
- '[a-zA-Z]+\s'
tokens:
- '(?:centi|milli)?meters'
- '(?:kilo)?grams'
- '(?:kilo)?meters'
- '(?:mega)?pixels'
- cm
- inches
- lb
- miles
- pounds

View File

@ -0,0 +1,25 @@
extends: existence
message: "Verify your use of '%s' with the A-Z word list."
link: 'https://docs.microsoft.com/en-us/style-guide'
level: suggestion
ignorecase: true
tokens:
- above
- accessible
- actionable
- against
- alarm
- alert
- alias
- allows?
- and/or
- as well as
- assure
- author
- avg
- beta
- ensure
- he
- insure
- sample
- she

11
styles/Microsoft/We.yml Normal file
View File

@ -0,0 +1,11 @@
extends: existence
message: "Try to avoid using first-person plural like '%s'."
link: https://docs.microsoft.com/en-us/style-guide/grammar/person#avoid-first-person-plural
level: warning
ignorecase: true
tokens:
- we
- we'(?:ve|re)
- ours?
- us
- let's

View File

@ -0,0 +1,122 @@
extends: substitution
message: "Consider using '%s' instead of '%s'."
link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-simple-words-concise-sentences
ignorecase: true
level: warning
action:
name: replace
swap:
(?:give|gave) rise to: lead to
(?:previous|prior) to: before
a (?:large)? majority of: most
a (?:large)? number of: many
a myriad of: myriad
adversely impact: hurt
all across: across
all of a sudden: suddenly
all of these: these
all of: all
all-time record: record
almost all: most
almost never: seldom
along the lines of: similar to
an adequate number of: enough
an appreciable number of: many
an estimated: about
any and all: all
are in agreement: agree
as a matter of fact: in fact
as a means of: to
as a result of: because of
as of yet: yet
as per: per
at a later date: later
at all times: always
at the present time: now
at this point in time: at this point
based in large part on: based on
based on the fact that: because
basic necessity: necessity
because of the fact that: because
came to a realization: realized
came to an abrupt end: ended abruptly
carry out an evaluation of: evaluate
close down: close
closed down: closed
complete stranger: stranger
completely separate: separate
concerning the matter of: regarding
conduct a review of: review
conduct an investigation: investigate
conduct experiments: experiment
continue on: continue
despite the fact that: although
disappear from sight: disappear
drag and drop: drag
drag-and-drop: drag
doomed to fail: doomed
due to the fact that: because
during the period of: during
during the time that: while
emergency situation: emergency
except when: unless
excessive number: too many
extend an invitation: invite
fall down: fall
fell down: fell
for the duration of: during
gather together: gather
has the ability to: can
has the capacity to: can
has the opportunity to: could
hold a meeting: meet
if this is not the case: if not
in a careful manner: carefully
in a thoughtful manner: thoughtfully
in a timely manner: timely
in an effort to: to
in between: between
in lieu of: instead of
in many cases: often
in most cases: usually
in order to: to
in some cases: sometimes
in spite of the fact that: although
in spite of: despite
in the (?:very)? near future: soon
in the event that: if
in the neighborhood of: roughly
in the vicinity of: close to
it would appear that: apparently
lift up: lift
made reference to: referred to
make reference to: refer to
mix together: mix
none at all: none
not in a position to: unable
not possible: impossible
of major importance: important
perform an assessment of: assess
pertaining to: about
place an order: order
plays a key role in: is essential to
present time: now
readily apparent: apparent
some of the: some
span across: span
subsequent to: after
successfully complete: complete
sufficient number (?:of)?: enough
take action: act
take into account: consider
the question as to whether: whether
there is no doubt but that: doubtless
this day and age: this age
this is a subject that: this subject
time (?:frame|period): time
under the provisions of: under
until such time as: until
used for fuel purposes: used for fuel
whether or not: whether
with regard to: regarding
with the exception of: except for

View File

@ -0,0 +1,4 @@
{
"feed": "https://github.com/errata-ai/Microsoft/releases.atom",
"vale_version": ">=1.0.0"
}

View File

@ -0,0 +1 @@
n8n

View File

@ -0,0 +1,3 @@
N8n
n8N
N8N

Some files were not shown because too many files have changed in this diff Show More