n8n-nodes-base 1.92.0 → 1.94.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/credentials/AirtopApi.credentials.js +2 -1
- package/dist/credentials/AirtopApi.credentials.js.map +1 -1
- package/dist/credentials/JinaAiApi.credentials.js +1 -1
- package/dist/credentials/JinaAiApi.credentials.js.map +1 -1
- package/dist/credentials/MicrosoftSharePointOAuth2Api.credentials.js +0 -9
- package/dist/credentials/MicrosoftSharePointOAuth2Api.credentials.js.map +1 -1
- package/dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js +13 -0
- package/dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js.map +1 -1
- package/dist/credentials/Snowflake.credentials.js +46 -2
- package/dist/credentials/Snowflake.credentials.js.map +1 -1
- package/dist/known/credentials.json +10 -1
- package/dist/known/nodes.json +20 -4
- package/dist/methods/defined.json +6 -0
- package/dist/methods/referenced.json +3 -0
- package/dist/nodes/Airtop/Airtop.node.js +14 -8
- package/dist/nodes/Airtop/Airtop.node.js.map +1 -1
- package/dist/nodes/Airtop/GenericFunctions.js +87 -15
- package/dist/nodes/Airtop/GenericFunctions.js.map +1 -1
- package/dist/nodes/Airtop/actions/common/fields.js +9 -0
- package/dist/nodes/Airtop/actions/common/fields.js.map +1 -1
- package/dist/nodes/Airtop/actions/common/output.utils.js +79 -0
- package/dist/nodes/Airtop/actions/common/output.utils.js.map +1 -0
- package/dist/nodes/Airtop/actions/common/session.utils.js +2 -2
- package/dist/nodes/Airtop/actions/common/session.utils.js.map +1 -1
- package/dist/nodes/Airtop/actions/extraction/getPaginated.operation.js +13 -4
- package/dist/nodes/Airtop/actions/extraction/getPaginated.operation.js.map +1 -1
- package/dist/nodes/Airtop/actions/extraction/query.operation.js +21 -3
- package/dist/nodes/Airtop/actions/extraction/query.operation.js.map +1 -1
- package/dist/nodes/Airtop/actions/extraction/scrape.operation.js +2 -1
- package/dist/nodes/Airtop/actions/extraction/scrape.operation.js.map +1 -1
- package/dist/nodes/Airtop/actions/file/File.resource.js +104 -0
- package/dist/nodes/Airtop/actions/file/File.resource.js.map +1 -0
- package/dist/nodes/Airtop/actions/file/delete.operation.js +60 -0
- package/dist/nodes/Airtop/actions/file/delete.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/file/get.operation.js +91 -0
- package/dist/nodes/Airtop/actions/file/get.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/file/getMany.operation.js +100 -0
- package/dist/nodes/Airtop/actions/file/getMany.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/file/helpers.js +199 -0
- package/dist/nodes/Airtop/actions/file/helpers.js.map +1 -0
- package/dist/nodes/Airtop/actions/file/load.operation.js +85 -0
- package/dist/nodes/Airtop/actions/file/load.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/file/upload.operation.js +186 -0
- package/dist/nodes/Airtop/actions/file/upload.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/interaction/Interaction.resource.js +22 -1
- package/dist/nodes/Airtop/actions/interaction/Interaction.resource.js.map +1 -1
- package/dist/nodes/Airtop/actions/interaction/fill.operation.js +89 -0
- package/dist/nodes/Airtop/actions/interaction/fill.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/interaction/scroll.operation.js +219 -0
- package/dist/nodes/Airtop/actions/interaction/scroll.operation.js.map +1 -0
- package/dist/nodes/Airtop/actions/node.type.js.map +1 -1
- package/dist/nodes/Airtop/actions/router.js +13 -4
- package/dist/nodes/Airtop/actions/router.js.map +1 -1
- package/dist/nodes/Airtop/actions/session/create.operation.js +85 -32
- package/dist/nodes/Airtop/actions/session/create.operation.js.map +1 -1
- package/dist/nodes/Airtop/actions/window/Window.resource.js +2 -1
- package/dist/nodes/Airtop/actions/window/Window.resource.js.map +1 -1
- package/dist/nodes/Airtop/actions/window/create.operation.js +1 -1
- package/dist/nodes/Airtop/actions/window/create.operation.js.map +1 -1
- package/dist/nodes/Airtop/actions/window/takeScreenshot.operation.js +26 -3
- package/dist/nodes/Airtop/actions/window/takeScreenshot.operation.js.map +1 -1
- package/dist/nodes/Airtop/constants.js +38 -5
- package/dist/nodes/Airtop/constants.js.map +1 -1
- package/dist/nodes/Airtop/countries.js +1026 -0
- package/dist/nodes/Airtop/countries.js.map +1 -0
- package/dist/nodes/Airtop/transport/index.js +6 -3
- package/dist/nodes/Airtop/transport/index.js.map +1 -1
- package/dist/nodes/Airtop/transport/types.js.map +1 -1
- package/dist/nodes/Aws/IAM/AwsIam.node.js +95 -0
- package/dist/nodes/Aws/IAM/AwsIam.node.js.map +1 -0
- package/dist/nodes/Aws/IAM/AwsIam.node.json +18 -0
- package/dist/nodes/Aws/IAM/AwsIam.svg +18 -0
- package/dist/nodes/Aws/IAM/descriptions/common.js +188 -0
- package/dist/nodes/Aws/IAM/descriptions/common.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/group/Group.resource.js +175 -0
- package/dist/nodes/Aws/IAM/descriptions/group/Group.resource.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/group/create.operation.js +66 -0
- package/dist/nodes/Aws/IAM/descriptions/group/create.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/group/delete.operation.js +43 -0
- package/dist/nodes/Aws/IAM/descriptions/group/delete.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/group/get.operation.js +50 -0
- package/dist/nodes/Aws/IAM/descriptions/group/get.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/group/getAll.operation.js +47 -0
- package/dist/nodes/Aws/IAM/descriptions/group/getAll.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/group/update.operation.js +70 -0
- package/dist/nodes/Aws/IAM/descriptions/group/update.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/index.js +42 -0
- package/dist/nodes/Aws/IAM/descriptions/index.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/User.resource.js +231 -0
- package/dist/nodes/Aws/IAM/descriptions/user/User.resource.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/addToGroup.operation.js +47 -0
- package/dist/nodes/Aws/IAM/descriptions/user/addToGroup.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/create.operation.js +118 -0
- package/dist/nodes/Aws/IAM/descriptions/user/create.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/delete.operation.js +43 -0
- package/dist/nodes/Aws/IAM/descriptions/user/delete.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/get.operation.js +43 -0
- package/dist/nodes/Aws/IAM/descriptions/user/get.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/getAll.operation.js +66 -0
- package/dist/nodes/Aws/IAM/descriptions/user/getAll.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/removeFromGroup.operation.js +74 -0
- package/dist/nodes/Aws/IAM/descriptions/user/removeFromGroup.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/descriptions/user/update.operation.js +68 -0
- package/dist/nodes/Aws/IAM/descriptions/user/update.operation.js.map +1 -0
- package/dist/nodes/Aws/IAM/helpers/constants.js +47 -0
- package/dist/nodes/Aws/IAM/helpers/constants.js.map +1 -0
- package/dist/nodes/Aws/IAM/helpers/errorHandler.js +90 -0
- package/dist/nodes/Aws/IAM/helpers/errorHandler.js.map +1 -0
- package/dist/nodes/Aws/IAM/helpers/types.js +17 -0
- package/dist/nodes/Aws/IAM/helpers/types.js.map +1 -0
- package/dist/nodes/Aws/IAM/helpers/utils.js +279 -0
- package/dist/nodes/Aws/IAM/helpers/utils.js.map +1 -0
- package/dist/nodes/Aws/IAM/methods/index.js +39 -0
- package/dist/nodes/Aws/IAM/methods/index.js.map +1 -0
- package/dist/nodes/Aws/IAM/methods/listSearch.js +132 -0
- package/dist/nodes/Aws/IAM/methods/listSearch.js.map +1 -0
- package/dist/nodes/Aws/IAM/transport/index.js +64 -0
- package/dist/nodes/Aws/IAM/transport/index.js.map +1 -0
- package/dist/nodes/Cron/Cron.node.js +1 -1
- package/dist/nodes/Cron/Cron.node.js.map +1 -1
- package/dist/nodes/EmailReadImap/v1/EmailReadImapV1.node.js +2 -2
- package/dist/nodes/EmailReadImap/v1/EmailReadImapV1.node.js.map +1 -1
- package/dist/nodes/EmailReadImap/v2/EmailReadImapV2.node.js +2 -2
- package/dist/nodes/EmailReadImap/v2/EmailReadImapV2.node.js.map +1 -1
- package/dist/nodes/Evaluation/Evaluation/Description.node.js +146 -0
- package/dist/nodes/Evaluation/Evaluation/Description.node.js.map +1 -0
- package/dist/nodes/Evaluation/Evaluation/Evaluation.node.ee.js +117 -0
- package/dist/nodes/Evaluation/Evaluation/Evaluation.node.ee.js.map +1 -0
- package/dist/nodes/Evaluation/EvaluationTrigger/EvaluationTrigger.node.ee.js +187 -0
- package/dist/nodes/Evaluation/EvaluationTrigger/EvaluationTrigger.node.ee.js.map +1 -0
- package/dist/nodes/Evaluation/methods/index.js +42 -0
- package/dist/nodes/Evaluation/methods/index.js.map +1 -0
- package/dist/nodes/Evaluation/methods/loadOptions.js +40 -0
- package/dist/nodes/Evaluation/methods/loadOptions.js.map +1 -0
- package/dist/nodes/Evaluation/utils/evaluationTriggerUtils.js +119 -0
- package/dist/nodes/Evaluation/utils/evaluationTriggerUtils.js.map +1 -0
- package/dist/nodes/Evaluation/utils/evaluationUtils.js +171 -0
- package/dist/nodes/Evaluation/utils/evaluationUtils.js.map +1 -0
- package/dist/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js +4 -3
- package/dist/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js.map +1 -1
- package/dist/nodes/Form/common.descriptions.js +2 -2
- package/dist/nodes/Form/common.descriptions.js.map +1 -1
- package/dist/nodes/Google/Drive/v2/actions/file/upload.operation.js +4 -1
- package/dist/nodes/Google/Drive/v2/actions/file/upload.operation.js.map +1 -1
- package/dist/nodes/Google/Firebase/CloudFirestore/GenericFunctions.js +1 -2
- package/dist/nodes/Google/Firebase/CloudFirestore/GenericFunctions.js.map +1 -1
- package/dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js +113 -107
- package/dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js.map +1 -1
- package/dist/nodes/Google/Sheet/v2/actions/sheet/read.operation.js +52 -106
- package/dist/nodes/Google/Sheet/v2/actions/sheet/read.operation.js.map +1 -1
- package/dist/nodes/Google/Sheet/v2/actions/utils/readOperation.js +97 -0
- package/dist/nodes/Google/Sheet/v2/actions/utils/readOperation.js.map +1 -0
- package/dist/nodes/Google/Sheet/v2/actions/versionDescription.js +20 -17
- package/dist/nodes/Google/Sheet/v2/actions/versionDescription.js.map +1 -1
- package/dist/nodes/Google/YouTube/YouTube.node.js +4 -2
- package/dist/nodes/Google/YouTube/YouTube.node.js.map +1 -1
- package/dist/nodes/HttpRequest/GenericFunctions.js +1 -1
- package/dist/nodes/HttpRequest/GenericFunctions.js.map +1 -1
- package/dist/nodes/Interval/Interval.node.js +1 -1
- package/dist/nodes/Interval/Interval.node.js.map +1 -1
- package/dist/nodes/Jira/Jira.node.js +34 -15
- package/dist/nodes/Jira/Jira.node.js.map +1 -1
- package/dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js +2 -2
- package/dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js.map +1 -1
- package/dist/nodes/MQTT/MqttTrigger.node.js +2 -2
- package/dist/nodes/MQTT/MqttTrigger.node.js.map +1 -1
- package/dist/nodes/ManualTrigger/ManualTrigger.node.js +1 -1
- package/dist/nodes/ManualTrigger/ManualTrigger.node.js.map +1 -1
- package/dist/nodes/Merge/Merge.node.js +3 -2
- package/dist/nodes/Merge/Merge.node.js.map +1 -1
- package/dist/nodes/Merge/v3/actions/mode/combineBySql.js +42 -4
- package/dist/nodes/Merge/v3/actions/mode/combineBySql.js.map +1 -1
- package/dist/nodes/Merge/v3/actions/versionDescription.js +1 -1
- package/dist/nodes/Merge/v3/actions/versionDescription.js.map +1 -1
- package/dist/nodes/Microsoft/SharePoint/MicrosoftSharePoint.node.js +93 -0
- package/dist/nodes/Microsoft/SharePoint/MicrosoftSharePoint.node.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/MicrosoftSharepoint.node.json +18 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/common.descriptions.js +190 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/common.descriptions.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/File.resource.js +108 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/File.resource.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/download.operation.js +62 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/download.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/update.operation.js +129 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/update.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/upload.operation.js +77 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/file/upload.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/index.js +45 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/index.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/Item.resource.js +175 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/Item.resource.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/create.operation.js +100 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/create.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/delete.operation.js +62 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/delete.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/get.operation.js +83 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/get.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/getAll.operation.js +203 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/getAll.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/update.operation.js +100 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/update.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/upsert.operation.js +100 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/item/upsert.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/list/List.resource.js +99 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/list/List.resource.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/list/get.operation.js +65 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/list/get.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/list/getAll.operation.js +105 -0
- package/dist/nodes/Microsoft/SharePoint/descriptions/list/getAll.operation.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/helpers/interfaces.js +17 -0
- package/dist/nodes/Microsoft/SharePoint/helpers/interfaces.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/helpers/utils.js +252 -0
- package/dist/nodes/Microsoft/SharePoint/helpers/utils.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/methods/index.js +42 -0
- package/dist/nodes/Microsoft/SharePoint/methods/index.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/methods/listSearch.js +222 -0
- package/dist/nodes/Microsoft/SharePoint/methods/listSearch.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/methods/resourceMapping.js +104 -0
- package/dist/nodes/Microsoft/SharePoint/methods/resourceMapping.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/test/credentials.js +54 -0
- package/dist/nodes/Microsoft/SharePoint/test/credentials.js.map +1 -0
- package/dist/nodes/Microsoft/SharePoint/transport/index.js +46 -0
- package/dist/nodes/Microsoft/SharePoint/transport/index.js.map +1 -0
- package/dist/nodes/Microsoft/Teams/MicrosoftTeamsTrigger.node.js +387 -0
- package/dist/nodes/Microsoft/Teams/MicrosoftTeamsTrigger.node.js.map +1 -0
- package/dist/nodes/Microsoft/Teams/MicrosoftTeamsTrigger.node.json +18 -0
- package/dist/nodes/Microsoft/Teams/v2/helpers/types.js +17 -0
- package/dist/nodes/Microsoft/Teams/v2/helpers/types.js.map +1 -0
- package/dist/nodes/Microsoft/Teams/v2/helpers/utils-trigger.js +147 -0
- package/dist/nodes/Microsoft/Teams/v2/helpers/utils-trigger.js.map +1 -0
- package/dist/nodes/Microsoft/Teams/v2/transport/index.js.map +1 -1
- package/dist/nodes/MongoDb/GenericFunctions.js +9 -2
- package/dist/nodes/MongoDb/GenericFunctions.js.map +1 -1
- package/dist/nodes/MongoDb/MongoDb.node.js +25 -5
- package/dist/nodes/MongoDb/MongoDb.node.js.map +1 -1
- package/dist/nodes/PostBin/BinDescription.js +1 -1
- package/dist/nodes/PostBin/BinDescription.js.map +1 -1
- package/dist/nodes/PostBin/GenericFunctions.js +5 -5
- package/dist/nodes/PostBin/GenericFunctions.js.map +1 -1
- package/dist/nodes/PostBin/PostBin.node.js +1 -1
- package/dist/nodes/PostBin/PostBin.node.js.map +1 -1
- package/dist/nodes/PostBin/RequestDescription.js +2 -2
- package/dist/nodes/PostBin/RequestDescription.js.map +1 -1
- package/dist/nodes/Postgres/PostgresTrigger.node.js +2 -2
- package/dist/nodes/Postgres/PostgresTrigger.node.js.map +1 -1
- package/dist/nodes/RabbitMQ/RabbitMQTrigger.node.js +2 -2
- package/dist/nodes/RabbitMQ/RabbitMQTrigger.node.js.map +1 -1
- package/dist/nodes/RespondToWebhook/RespondToWebhook.node.js +8 -3
- package/dist/nodes/RespondToWebhook/RespondToWebhook.node.js.map +1 -1
- package/dist/nodes/RespondToWebhook/utils.js +43 -0
- package/dist/nodes/RespondToWebhook/utils.js.map +1 -0
- package/dist/nodes/Schedule/ScheduleTrigger.node.js +1 -1
- package/dist/nodes/Schedule/ScheduleTrigger.node.js.map +1 -1
- package/dist/nodes/Snowflake/GenericFunctions.js +34 -2
- package/dist/nodes/Snowflake/GenericFunctions.js.map +1 -1
- package/dist/nodes/Snowflake/Snowflake.node.js +5 -7
- package/dist/nodes/Snowflake/Snowflake.node.js.map +1 -1
- package/dist/nodes/SseTrigger/SseTrigger.node.js +2 -2
- package/dist/nodes/SseTrigger/SseTrigger.node.js.map +1 -1
- package/dist/nodes/Telegram/Telegram.node.js +5 -1
- package/dist/nodes/Telegram/Telegram.node.js.map +1 -1
- package/dist/nodes/Transform/Summarize/utils.js +2 -1
- package/dist/nodes/Transform/Summarize/utils.js.map +1 -1
- package/dist/test/setup.js +1 -0
- package/dist/test/setup.js.map +1 -1
- package/dist/types/credentials.json +7 -7
- package/dist/types/nodes.json +27 -23
- package/dist/utils/workflowInputsResourceMapping/GenericFunctions.js +12 -2
- package/dist/utils/workflowInputsResourceMapping/GenericFunctions.js.map +1 -1
- package/package.json +15 -12
- package/dist/nodes/EvaluationMetrics/EvaluationMetrics.node.js +0 -119
- package/dist/nodes/EvaluationMetrics/EvaluationMetrics.node.js.map +0 -1
- package/dist/nodes/EvaluationMetrics/EvaluationMetrics.node.json +0 -14
- /package/dist/{credentials/icons/SharePoint.svg → nodes/Microsoft/SharePoint/microsoftSharePoint.svg} +0 -0
|
@@ -78,7 +78,14 @@ function validateAndResolveMongoCredentials(self, credentials) {
|
|
|
78
78
|
return buildMongoConnectionParams(self, credentials);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
function prepareItems(
|
|
81
|
+
function prepareItems({
|
|
82
|
+
items,
|
|
83
|
+
fields,
|
|
84
|
+
updateKey = "",
|
|
85
|
+
useDotNotation = false,
|
|
86
|
+
dateFields = [],
|
|
87
|
+
isUpdate = false
|
|
88
|
+
}) {
|
|
82
89
|
let data = items;
|
|
83
90
|
if (updateKey) {
|
|
84
91
|
if (!fields.includes(updateKey)) {
|
|
@@ -98,7 +105,7 @@ function prepareItems(items, fields, updateKey = "", useDotNotation = false, dat
|
|
|
98
105
|
if (fieldData && dateFields.includes(field)) {
|
|
99
106
|
fieldData = new Date(fieldData);
|
|
100
107
|
}
|
|
101
|
-
if (useDotNotation) {
|
|
108
|
+
if (useDotNotation && !isUpdate) {
|
|
102
109
|
(0, import_set.default)(updateItem, field, fieldData);
|
|
103
110
|
} else {
|
|
104
111
|
updateItem[field] = fieldData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/MongoDb/GenericFunctions.ts"],"sourcesContent":["import get from 'lodash/get';\nimport set from 'lodash/set';\nimport { MongoClient, ObjectId } from 'mongodb';\nimport { NodeOperationError } from 'n8n-workflow';\nimport type {\n\tICredentialDataDecryptedObject,\n\tIDataObject,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n} from 'n8n-workflow';\nimport { createSecureContext } from 'tls';\n\nimport type {\n\tIMongoCredentials,\n\tIMongoCredentialsType,\n\tIMongoParametricCredentials,\n} from './mongoDb.types';\nimport { formatPrivateKey } from '../../utils/utilities';\n\n/**\n * Standard way of building the MongoDB connection string, unless overridden with a provided string\n *\n * @param {ICredentialDataDecryptedObject} credentials MongoDB credentials to use, unless conn string is overridden\n */\nexport function buildParameterizedConnString(credentials: IMongoParametricCredentials): string {\n\tif (credentials.port) {\n\t\treturn `mongodb://${credentials.user}:${credentials.password}@${credentials.host}:${credentials.port}`;\n\t} else {\n\t\treturn `mongodb+srv://${credentials.user}:${credentials.password}@${credentials.host}`;\n\t}\n}\n\n/**\n * Build mongoDb connection string and resolve database name.\n * If a connection string override value is provided, that will be used in place of individual args\n *\n * @param {ICredentialDataDecryptedObject} credentials raw/input MongoDB credentials to use\n */\nexport function buildMongoConnectionParams(\n\tself: IExecuteFunctions,\n\tcredentials: IMongoCredentialsType,\n): IMongoCredentials {\n\tconst sanitizedDbName =\n\t\tcredentials.database && credentials.database.trim().length > 0\n\t\t\t? credentials.database.trim()\n\t\t\t: '';\n\tif (credentials.configurationType === 'connectionString') {\n\t\tif (credentials.connectionString && credentials.connectionString.trim().length > 0) {\n\t\t\treturn {\n\t\t\t\tconnectionString: credentials.connectionString.trim(),\n\t\t\t\tdatabase: sanitizedDbName,\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tself.getNode(),\n\t\t\t\t'Cannot override credentials: valid MongoDB connection string not provided ',\n\t\t\t);\n\t\t}\n\t} else {\n\t\treturn {\n\t\t\tconnectionString: buildParameterizedConnString(credentials),\n\t\t\tdatabase: sanitizedDbName,\n\t\t};\n\t}\n}\n\n/**\n * Verify credentials. If ok, build mongoDb connection string and resolve database name.\n *\n * @param {ICredentialDataDecryptedObject} credentials raw/input MongoDB credentials to use\n */\nexport function validateAndResolveMongoCredentials(\n\tself: IExecuteFunctions,\n\tcredentials?: ICredentialDataDecryptedObject,\n): IMongoCredentials {\n\tif (credentials === undefined) {\n\t\tthrow new NodeOperationError(self.getNode(), 'No credentials got returned!');\n\t} else {\n\t\treturn buildMongoConnectionParams(self, credentials as unknown as IMongoCredentialsType);\n\t}\n}\n\nexport function prepareItems(\n\titems
|
|
1
|
+
{"version":3,"sources":["../../../nodes/MongoDb/GenericFunctions.ts"],"sourcesContent":["import get from 'lodash/get';\nimport set from 'lodash/set';\nimport { MongoClient, ObjectId } from 'mongodb';\nimport { NodeOperationError } from 'n8n-workflow';\nimport type {\n\tICredentialDataDecryptedObject,\n\tIDataObject,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n} from 'n8n-workflow';\nimport { createSecureContext } from 'tls';\n\nimport type {\n\tIMongoCredentials,\n\tIMongoCredentialsType,\n\tIMongoParametricCredentials,\n} from './mongoDb.types';\nimport { formatPrivateKey } from '../../utils/utilities';\n\n/**\n * Standard way of building the MongoDB connection string, unless overridden with a provided string\n *\n * @param {ICredentialDataDecryptedObject} credentials MongoDB credentials to use, unless conn string is overridden\n */\nexport function buildParameterizedConnString(credentials: IMongoParametricCredentials): string {\n\tif (credentials.port) {\n\t\treturn `mongodb://${credentials.user}:${credentials.password}@${credentials.host}:${credentials.port}`;\n\t} else {\n\t\treturn `mongodb+srv://${credentials.user}:${credentials.password}@${credentials.host}`;\n\t}\n}\n\n/**\n * Build mongoDb connection string and resolve database name.\n * If a connection string override value is provided, that will be used in place of individual args\n *\n * @param {ICredentialDataDecryptedObject} credentials raw/input MongoDB credentials to use\n */\nexport function buildMongoConnectionParams(\n\tself: IExecuteFunctions,\n\tcredentials: IMongoCredentialsType,\n): IMongoCredentials {\n\tconst sanitizedDbName =\n\t\tcredentials.database && credentials.database.trim().length > 0\n\t\t\t? credentials.database.trim()\n\t\t\t: '';\n\tif (credentials.configurationType === 'connectionString') {\n\t\tif (credentials.connectionString && credentials.connectionString.trim().length > 0) {\n\t\t\treturn {\n\t\t\t\tconnectionString: credentials.connectionString.trim(),\n\t\t\t\tdatabase: sanitizedDbName,\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tself.getNode(),\n\t\t\t\t'Cannot override credentials: valid MongoDB connection string not provided ',\n\t\t\t);\n\t\t}\n\t} else {\n\t\treturn {\n\t\t\tconnectionString: buildParameterizedConnString(credentials),\n\t\t\tdatabase: sanitizedDbName,\n\t\t};\n\t}\n}\n\n/**\n * Verify credentials. If ok, build mongoDb connection string and resolve database name.\n *\n * @param {ICredentialDataDecryptedObject} credentials raw/input MongoDB credentials to use\n */\nexport function validateAndResolveMongoCredentials(\n\tself: IExecuteFunctions,\n\tcredentials?: ICredentialDataDecryptedObject,\n): IMongoCredentials {\n\tif (credentials === undefined) {\n\t\tthrow new NodeOperationError(self.getNode(), 'No credentials got returned!');\n\t} else {\n\t\treturn buildMongoConnectionParams(self, credentials as unknown as IMongoCredentialsType);\n\t}\n}\n\nexport function prepareItems({\n\titems,\n\tfields,\n\tupdateKey = '',\n\tuseDotNotation = false,\n\tdateFields = [],\n\tisUpdate = false,\n}: {\n\titems: INodeExecutionData[];\n\tfields: string[];\n\tupdateKey?: string;\n\tuseDotNotation?: boolean;\n\tdateFields?: string[];\n\tisUpdate?: boolean;\n}) {\n\tlet data = items;\n\n\tif (updateKey) {\n\t\tif (!fields.includes(updateKey)) {\n\t\t\tfields.push(updateKey);\n\t\t}\n\t\tdata = items.filter((item) => item.json[updateKey] !== undefined);\n\t}\n\n\tconst preparedItems = data.map(({ json }) => {\n\t\tconst updateItem: IDataObject = {};\n\n\t\tfor (const field of fields) {\n\t\t\tlet fieldData;\n\n\t\t\tif (useDotNotation) {\n\t\t\t\tfieldData = get(json, field, null);\n\t\t\t} else {\n\t\t\t\tfieldData = json[field] !== undefined ? json[field] : null;\n\t\t\t}\n\n\t\t\tif (fieldData && dateFields.includes(field)) {\n\t\t\t\tfieldData = new Date(fieldData as string);\n\t\t\t}\n\n\t\t\tif (useDotNotation && !isUpdate) {\n\t\t\t\tset(updateItem, field, fieldData);\n\t\t\t} else {\n\t\t\t\tupdateItem[field] = fieldData;\n\t\t\t}\n\t\t}\n\n\t\treturn updateItem;\n\t});\n\n\treturn preparedItems;\n}\n\nexport function prepareFields(fields: string) {\n\treturn fields\n\t\t.split(',')\n\t\t.map((field) => field.trim())\n\t\t.filter((field) => !!field);\n}\n\nexport function stringifyObjectIDs(items: INodeExecutionData[]) {\n\titems.forEach((item) => {\n\t\tif (item._id instanceof ObjectId) {\n\t\t\titem.json._id = item._id.toString();\n\t\t}\n\t\tif (item.id instanceof ObjectId) {\n\t\t\titem.json.id = item.id.toString();\n\t\t}\n\t});\n\n\treturn items;\n}\n\nexport async function connectMongoClient(connectionString: string, credentials: IDataObject = {}) {\n\tlet client: MongoClient;\n\n\tif (credentials.tls) {\n\t\tconst ca = credentials.ca ? formatPrivateKey(credentials.ca as string) : undefined;\n\t\tconst cert = credentials.cert ? formatPrivateKey(credentials.cert as string) : undefined;\n\t\tconst key = credentials.key ? formatPrivateKey(credentials.key as string) : undefined;\n\t\tconst passphrase = (credentials.passphrase as string) || undefined;\n\n\t\tconst secureContext = createSecureContext({\n\t\t\tca,\n\t\t\tcert,\n\t\t\tkey,\n\t\t\tpassphrase,\n\t\t});\n\n\t\tclient = await MongoClient.connect(connectionString, {\n\t\t\ttls: true,\n\t\t\tsecureContext,\n\t\t});\n\t} else {\n\t\tclient = await MongoClient.connect(connectionString);\n\t}\n\n\treturn client;\n}\n"],"mappings":"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","names":["get","set"]}
|
|
@@ -33,7 +33,7 @@ class MongoDb {
|
|
|
33
33
|
name: "mongoDb",
|
|
34
34
|
icon: "file:mongodb.svg",
|
|
35
35
|
group: ["input"],
|
|
36
|
-
version: [1, 1.1],
|
|
36
|
+
version: [1, 1.1, 1.2],
|
|
37
37
|
description: "Find, insert and update documents in MongoDB",
|
|
38
38
|
defaults: {
|
|
39
39
|
name: "MongoDB"
|
|
@@ -199,7 +199,7 @@ class MongoDb {
|
|
|
199
199
|
);
|
|
200
200
|
const updateKey = (this.getNodeParameter("updateKey", 0) || "").trim();
|
|
201
201
|
const updateOptions = this.getNodeParameter("upsert", 0) ? { upsert: true } : void 0;
|
|
202
|
-
const updateItems = (0, import_GenericFunctions.prepareItems)(items, fields, updateKey, useDotNotation, dateFields);
|
|
202
|
+
const updateItems = (0, import_GenericFunctions.prepareItems)({ items, fields, updateKey, useDotNotation, dateFields });
|
|
203
203
|
for (const item of updateItems) {
|
|
204
204
|
try {
|
|
205
205
|
const filter = { [updateKey]: item[updateKey] };
|
|
@@ -230,7 +230,14 @@ class MongoDb {
|
|
|
230
230
|
);
|
|
231
231
|
const updateKey = (this.getNodeParameter("updateKey", 0) || "").trim();
|
|
232
232
|
const updateOptions = this.getNodeParameter("upsert", 0) ? { upsert: true } : void 0;
|
|
233
|
-
const updateItems = (0, import_GenericFunctions.prepareItems)(
|
|
233
|
+
const updateItems = (0, import_GenericFunctions.prepareItems)({
|
|
234
|
+
items,
|
|
235
|
+
fields,
|
|
236
|
+
updateKey,
|
|
237
|
+
useDotNotation,
|
|
238
|
+
dateFields,
|
|
239
|
+
isUpdate: nodeVersion >= 1.2
|
|
240
|
+
});
|
|
234
241
|
for (const item of updateItems) {
|
|
235
242
|
try {
|
|
236
243
|
const filter = { [updateKey]: item[updateKey] };
|
|
@@ -261,7 +268,13 @@ class MongoDb {
|
|
|
261
268
|
const dateFields = (0, import_GenericFunctions.prepareFields)(
|
|
262
269
|
this.getNodeParameter("options.dateFields", 0, "")
|
|
263
270
|
);
|
|
264
|
-
const insertItems = (0, import_GenericFunctions.prepareItems)(
|
|
271
|
+
const insertItems = (0, import_GenericFunctions.prepareItems)({
|
|
272
|
+
items,
|
|
273
|
+
fields,
|
|
274
|
+
updateKey: "",
|
|
275
|
+
useDotNotation,
|
|
276
|
+
dateFields
|
|
277
|
+
});
|
|
265
278
|
const { insertedIds } = await mdb.collection(this.getNodeParameter("collection", 0)).insertMany(insertItems);
|
|
266
279
|
for (const i of Object.keys(insertedIds)) {
|
|
267
280
|
responseData.push({
|
|
@@ -290,7 +303,14 @@ class MongoDb {
|
|
|
290
303
|
);
|
|
291
304
|
const updateKey = (this.getNodeParameter("updateKey", 0) || "").trim();
|
|
292
305
|
const updateOptions = this.getNodeParameter("upsert", 0) ? { upsert: true } : void 0;
|
|
293
|
-
const updateItems = (0, import_GenericFunctions.prepareItems)(
|
|
306
|
+
const updateItems = (0, import_GenericFunctions.prepareItems)({
|
|
307
|
+
items,
|
|
308
|
+
fields,
|
|
309
|
+
updateKey,
|
|
310
|
+
useDotNotation,
|
|
311
|
+
dateFields,
|
|
312
|
+
isUpdate: nodeVersion >= 1.2
|
|
313
|
+
});
|
|
294
314
|
for (const item of updateItems) {
|
|
295
315
|
try {
|
|
296
316
|
const filter = { [updateKey]: item[updateKey] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/MongoDb/MongoDb.node.ts"],"sourcesContent":["import type {\n\tFindOneAndReplaceOptions,\n\tFindOneAndUpdateOptions,\n\tUpdateOptions,\n\tSort,\n} from 'mongodb';\nimport { ObjectId } from 'mongodb';\nimport { ApplicationError, NodeConnectionTypes } from 'n8n-workflow';\nimport type {\n\tIExecuteFunctions,\n\tICredentialsDecrypted,\n\tICredentialTestFunctions,\n\tIDataObject,\n\tINodeCredentialTestResult,\n\tINodeExecutionData,\n\tINodeType,\n\tINodeTypeDescription,\n\tJsonObject,\n} from 'n8n-workflow';\n\nimport {\n\tbuildParameterizedConnString,\n\tconnectMongoClient,\n\tprepareFields,\n\tprepareItems,\n\tstringifyObjectIDs,\n\tvalidateAndResolveMongoCredentials,\n} from './GenericFunctions';\nimport type { IMongoParametricCredentials } from './mongoDb.types';\nimport { nodeProperties } from './MongoDbProperties';\nimport { generatePairedItemData } from '../../utils/utilities';\n\nexport class MongoDb implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'MongoDB',\n\t\tname: 'mongoDb',\n\t\ticon: 'file:mongodb.svg',\n\t\tgroup: ['input'],\n\t\tversion: [1, 1.1],\n\t\tdescription: 'Find, insert and update documents in MongoDB',\n\t\tdefaults: {\n\t\t\tname: 'MongoDB',\n\t\t},\n\t\tinputs: [NodeConnectionTypes.Main],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tusableAsTool: true,\n\t\tcredentials: [\n\t\t\t{\n\t\t\t\tname: 'mongoDb',\n\t\t\t\trequired: true,\n\t\t\t\ttestedBy: 'mongoDbCredentialTest',\n\t\t\t},\n\t\t],\n\t\tproperties: nodeProperties,\n\t};\n\n\tmethods = {\n\t\tcredentialTest: {\n\t\t\tasync mongoDbCredentialTest(\n\t\t\t\tthis: ICredentialTestFunctions,\n\t\t\t\tcredential: ICredentialsDecrypted,\n\t\t\t): Promise<INodeCredentialTestResult> {\n\t\t\t\tconst credentials = credential.data as IDataObject;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst database = ((credentials.database as string) || '').trim();\n\t\t\t\t\tlet connectionString = '';\n\n\t\t\t\t\tif (credentials.configurationType === 'connectionString') {\n\t\t\t\t\t\tconnectionString = ((credentials.connectionString as string) || '').trim();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconnectionString = buildParameterizedConnString(\n\t\t\t\t\t\t\tcredentials as unknown as IMongoParametricCredentials,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst client = await connectMongoClient(connectionString, credentials);\n\n\t\t\t\t\tconst { databases } = await client.db().admin().listDatabases();\n\n\t\t\t\t\tif (!(databases as IDataObject[]).map((db) => db.name).includes(database)) {\n\t\t\t\t\t\tthrow new ApplicationError(`Database \"${database}\" does not exist`, {\n\t\t\t\t\t\t\tlevel: 'warning',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait client.close();\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: 'Error',\n\t\t\t\t\t\tmessage: (error as Error).message,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'OK',\n\t\t\t\t\tmessage: 'Connection successful!',\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t};\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst credentials = await this.getCredentials('mongoDb');\n\t\tconst { database, connectionString } = validateAndResolveMongoCredentials(this, credentials);\n\n\t\tconst client = await connectMongoClient(connectionString, credentials);\n\n\t\tconst mdb = client.db(database);\n\n\t\tlet returnData: INodeExecutionData[] = [];\n\n\t\tconst items = this.getInputData();\n\t\tconst operation = this.getNodeParameter('operation', 0);\n\t\tconst nodeVersion = this.getNode().typeVersion;\n\n\t\tlet itemsLength = items.length ? 1 : 0;\n\t\tlet fallbackPairedItems;\n\n\t\tif (nodeVersion >= 1.1) {\n\t\t\titemsLength = items.length;\n\t\t} else {\n\t\t\tfallbackPairedItems = generatePairedItemData(items.length);\n\t\t}\n\n\t\tif (operation === 'aggregate') {\n\t\t\tfor (let i = 0; i < itemsLength; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst queryParameter = JSON.parse(\n\t\t\t\t\t\tthis.getNodeParameter('query', i) as string,\n\t\t\t\t\t) as IDataObject;\n\n\t\t\t\t\tif (queryParameter._id && typeof queryParameter._id === 'string') {\n\t\t\t\t\t\tqueryParameter._id = new ObjectId(queryParameter._id);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst query = mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', i) as string)\n\t\t\t\t\t\t.aggregate(queryParameter as unknown as Document[]);\n\n\t\t\t\t\tfor (const entry of await query.toArray()) {\n\t\t\t\t\t\treturnData.push({ json: entry, pairedItem: fallbackPairedItems ?? [{ item: i }] });\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: { error: (error as JsonObject).message },\n\t\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'delete') {\n\t\t\tfor (let i = 0; i < itemsLength; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { deletedCount } = await mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', i) as string)\n\t\t\t\t\t\t.deleteMany(JSON.parse(this.getNodeParameter('query', i) as string) as Document);\n\n\t\t\t\t\treturnData.push({\n\t\t\t\t\t\tjson: { deletedCount },\n\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: { error: (error as JsonObject).message },\n\t\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'find') {\n\t\t\tfor (let i = 0; i < itemsLength; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst queryParameter = JSON.parse(\n\t\t\t\t\t\tthis.getNodeParameter('query', i) as string,\n\t\t\t\t\t) as IDataObject;\n\n\t\t\t\t\tif (queryParameter._id && typeof queryParameter._id === 'string') {\n\t\t\t\t\t\tqueryParameter._id = new ObjectId(queryParameter._id);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet query = mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', i) as string)\n\t\t\t\t\t\t.find(queryParameter as unknown as Document);\n\n\t\t\t\t\tconst options = this.getNodeParameter('options', i);\n\t\t\t\t\tconst limit = options.limit as number;\n\t\t\t\t\tconst skip = options.skip as number;\n\t\t\t\t\tconst projection =\n\t\t\t\t\t\toptions.projection && (JSON.parse(options.projection as string) as Document);\n\t\t\t\t\tconst sort = options.sort && (JSON.parse(options.sort as string) as Sort);\n\n\t\t\t\t\tif (skip > 0) {\n\t\t\t\t\t\tquery = query.skip(skip);\n\t\t\t\t\t}\n\t\t\t\t\tif (limit > 0) {\n\t\t\t\t\t\tquery = query.limit(limit);\n\t\t\t\t\t}\n\t\t\t\t\tif (sort && Object.keys(sort).length !== 0 && sort.constructor === Object) {\n\t\t\t\t\t\tquery = query.sort(sort);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tprojection &&\n\t\t\t\t\t\tObject.keys(projection).length !== 0 &&\n\t\t\t\t\t\tprojection.constructor === Object\n\t\t\t\t\t) {\n\t\t\t\t\t\tquery = query.project(projection);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst queryResult = await query.toArray();\n\n\t\t\t\t\tfor (const entry of queryResult) {\n\t\t\t\t\t\treturnData.push({ json: entry, pairedItem: fallbackPairedItems ?? [{ item: i }] });\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: { error: (error as JsonObject).message },\n\t\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'findOneAndReplace') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\tconst dateFields = prepareFields(\n\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t);\n\n\t\t\tconst updateKey = ((this.getNodeParameter('updateKey', 0) as string) || '').trim();\n\n\t\t\tconst updateOptions = (this.getNodeParameter('upsert', 0) as boolean)\n\t\t\t\t? { upsert: true }\n\t\t\t\t: undefined;\n\n\t\t\tconst updateItems = prepareItems(items, fields, updateKey, useDotNotation, dateFields);\n\n\t\t\tfor (const item of updateItems) {\n\t\t\t\ttry {\n\t\t\t\t\tconst filter = { [updateKey]: item[updateKey] };\n\t\t\t\t\tif (updateKey === '_id') {\n\t\t\t\t\t\tfilter[updateKey] = new ObjectId(item[updateKey] as string);\n\t\t\t\t\t\tdelete item._id;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t\t.findOneAndReplace(filter, item, updateOptions as FindOneAndReplaceOptions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\titem.json = { error: (error as JsonObject).message };\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(updateItems),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tif (operation === 'findOneAndUpdate') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\tconst dateFields = prepareFields(\n\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t);\n\n\t\t\tconst updateKey = ((this.getNodeParameter('updateKey', 0) as string) || '').trim();\n\n\t\t\tconst updateOptions = (this.getNodeParameter('upsert', 0) as boolean)\n\t\t\t\t? { upsert: true }\n\t\t\t\t: undefined;\n\n\t\t\tconst updateItems = prepareItems(items, fields, updateKey, useDotNotation, dateFields);\n\n\t\t\tfor (const item of updateItems) {\n\t\t\t\ttry {\n\t\t\t\t\tconst filter = { [updateKey]: item[updateKey] };\n\t\t\t\t\tif (updateKey === '_id') {\n\t\t\t\t\t\tfilter[updateKey] = new ObjectId(item[updateKey] as string);\n\t\t\t\t\t\tdelete item._id;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t\t.findOneAndUpdate(filter, { $set: item }, updateOptions as FindOneAndUpdateOptions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\titem.json = { error: (error as JsonObject).message };\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(updateItems),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tif (operation === 'insert') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tlet responseData: IDataObject[] = [];\n\t\t\ttry {\n\t\t\t\t// Prepare the data to insert and copy it to be returned\n\t\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\t\tconst dateFields = prepareFields(\n\t\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t\t);\n\n\t\t\t\tconst insertItems = prepareItems(items, fields, '', useDotNotation, dateFields);\n\n\t\t\t\tconst { insertedIds } = await mdb\n\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t.insertMany(insertItems);\n\n\t\t\t\t// Add the id to the data\n\t\t\t\tfor (const i of Object.keys(insertedIds)) {\n\t\t\t\t\tresponseData.push({\n\t\t\t\t\t\t...insertItems[parseInt(i, 10)],\n\t\t\t\t\t\tid: insertedIds[parseInt(i, 10)] as unknown as string,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\tresponseData = [{ error: (error as JsonObject).message }];\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(responseData),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tif (operation === 'update') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\tconst dateFields = prepareFields(\n\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t);\n\n\t\t\tconst updateKey = ((this.getNodeParameter('updateKey', 0) as string) || '').trim();\n\n\t\t\tconst updateOptions = (this.getNodeParameter('upsert', 0) as boolean)\n\t\t\t\t? { upsert: true }\n\t\t\t\t: undefined;\n\n\t\t\tconst updateItems = prepareItems(items, fields, updateKey, useDotNotation, dateFields);\n\n\t\t\tfor (const item of updateItems) {\n\t\t\t\ttry {\n\t\t\t\t\tconst filter = { [updateKey]: item[updateKey] };\n\t\t\t\t\tif (updateKey === '_id') {\n\t\t\t\t\t\tfilter[updateKey] = new ObjectId(item[updateKey] as string);\n\t\t\t\t\t\tdelete item._id;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t\t.updateOne(filter, { $set: item }, updateOptions as UpdateOptions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\titem.json = { error: (error as JsonObject).message };\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(updateItems),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tawait client.close();\n\n\t\treturn [stringifyObjectIDs(returnData)];\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../nodes/MongoDb/MongoDb.node.ts"],"sourcesContent":["import type {\n\tFindOneAndReplaceOptions,\n\tFindOneAndUpdateOptions,\n\tUpdateOptions,\n\tSort,\n} from 'mongodb';\nimport { ObjectId } from 'mongodb';\nimport { ApplicationError, NodeConnectionTypes } from 'n8n-workflow';\nimport type {\n\tIExecuteFunctions,\n\tICredentialsDecrypted,\n\tICredentialTestFunctions,\n\tIDataObject,\n\tINodeCredentialTestResult,\n\tINodeExecutionData,\n\tINodeType,\n\tINodeTypeDescription,\n\tJsonObject,\n} from 'n8n-workflow';\n\nimport {\n\tbuildParameterizedConnString,\n\tconnectMongoClient,\n\tprepareFields,\n\tprepareItems,\n\tstringifyObjectIDs,\n\tvalidateAndResolveMongoCredentials,\n} from './GenericFunctions';\nimport type { IMongoParametricCredentials } from './mongoDb.types';\nimport { nodeProperties } from './MongoDbProperties';\nimport { generatePairedItemData } from '../../utils/utilities';\n\nexport class MongoDb implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'MongoDB',\n\t\tname: 'mongoDb',\n\t\ticon: 'file:mongodb.svg',\n\t\tgroup: ['input'],\n\t\tversion: [1, 1.1, 1.2],\n\t\tdescription: 'Find, insert and update documents in MongoDB',\n\t\tdefaults: {\n\t\t\tname: 'MongoDB',\n\t\t},\n\t\tinputs: [NodeConnectionTypes.Main],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tusableAsTool: true,\n\t\tcredentials: [\n\t\t\t{\n\t\t\t\tname: 'mongoDb',\n\t\t\t\trequired: true,\n\t\t\t\ttestedBy: 'mongoDbCredentialTest',\n\t\t\t},\n\t\t],\n\t\tproperties: nodeProperties,\n\t};\n\n\tmethods = {\n\t\tcredentialTest: {\n\t\t\tasync mongoDbCredentialTest(\n\t\t\t\tthis: ICredentialTestFunctions,\n\t\t\t\tcredential: ICredentialsDecrypted,\n\t\t\t): Promise<INodeCredentialTestResult> {\n\t\t\t\tconst credentials = credential.data as IDataObject;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst database = ((credentials.database as string) || '').trim();\n\t\t\t\t\tlet connectionString = '';\n\n\t\t\t\t\tif (credentials.configurationType === 'connectionString') {\n\t\t\t\t\t\tconnectionString = ((credentials.connectionString as string) || '').trim();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconnectionString = buildParameterizedConnString(\n\t\t\t\t\t\t\tcredentials as unknown as IMongoParametricCredentials,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst client = await connectMongoClient(connectionString, credentials);\n\n\t\t\t\t\tconst { databases } = await client.db().admin().listDatabases();\n\n\t\t\t\t\tif (!(databases as IDataObject[]).map((db) => db.name).includes(database)) {\n\t\t\t\t\t\tthrow new ApplicationError(`Database \"${database}\" does not exist`, {\n\t\t\t\t\t\t\tlevel: 'warning',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait client.close();\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: 'Error',\n\t\t\t\t\t\tmessage: (error as Error).message,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'OK',\n\t\t\t\t\tmessage: 'Connection successful!',\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t};\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst credentials = await this.getCredentials('mongoDb');\n\t\tconst { database, connectionString } = validateAndResolveMongoCredentials(this, credentials);\n\n\t\tconst client = await connectMongoClient(connectionString, credentials);\n\n\t\tconst mdb = client.db(database);\n\n\t\tlet returnData: INodeExecutionData[] = [];\n\n\t\tconst items = this.getInputData();\n\t\tconst operation = this.getNodeParameter('operation', 0);\n\t\tconst nodeVersion = this.getNode().typeVersion;\n\n\t\tlet itemsLength = items.length ? 1 : 0;\n\t\tlet fallbackPairedItems;\n\n\t\tif (nodeVersion >= 1.1) {\n\t\t\titemsLength = items.length;\n\t\t} else {\n\t\t\tfallbackPairedItems = generatePairedItemData(items.length);\n\t\t}\n\n\t\tif (operation === 'aggregate') {\n\t\t\tfor (let i = 0; i < itemsLength; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst queryParameter = JSON.parse(\n\t\t\t\t\t\tthis.getNodeParameter('query', i) as string,\n\t\t\t\t\t) as IDataObject;\n\n\t\t\t\t\tif (queryParameter._id && typeof queryParameter._id === 'string') {\n\t\t\t\t\t\tqueryParameter._id = new ObjectId(queryParameter._id);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst query = mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', i) as string)\n\t\t\t\t\t\t.aggregate(queryParameter as unknown as Document[]);\n\n\t\t\t\t\tfor (const entry of await query.toArray()) {\n\t\t\t\t\t\treturnData.push({ json: entry, pairedItem: fallbackPairedItems ?? [{ item: i }] });\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: { error: (error as JsonObject).message },\n\t\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'delete') {\n\t\t\tfor (let i = 0; i < itemsLength; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { deletedCount } = await mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', i) as string)\n\t\t\t\t\t\t.deleteMany(JSON.parse(this.getNodeParameter('query', i) as string) as Document);\n\n\t\t\t\t\treturnData.push({\n\t\t\t\t\t\tjson: { deletedCount },\n\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: { error: (error as JsonObject).message },\n\t\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'find') {\n\t\t\tfor (let i = 0; i < itemsLength; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst queryParameter = JSON.parse(\n\t\t\t\t\t\tthis.getNodeParameter('query', i) as string,\n\t\t\t\t\t) as IDataObject;\n\n\t\t\t\t\tif (queryParameter._id && typeof queryParameter._id === 'string') {\n\t\t\t\t\t\tqueryParameter._id = new ObjectId(queryParameter._id);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet query = mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', i) as string)\n\t\t\t\t\t\t.find(queryParameter as unknown as Document);\n\n\t\t\t\t\tconst options = this.getNodeParameter('options', i);\n\t\t\t\t\tconst limit = options.limit as number;\n\t\t\t\t\tconst skip = options.skip as number;\n\t\t\t\t\tconst projection =\n\t\t\t\t\t\toptions.projection && (JSON.parse(options.projection as string) as Document);\n\t\t\t\t\tconst sort = options.sort && (JSON.parse(options.sort as string) as Sort);\n\n\t\t\t\t\tif (skip > 0) {\n\t\t\t\t\t\tquery = query.skip(skip);\n\t\t\t\t\t}\n\t\t\t\t\tif (limit > 0) {\n\t\t\t\t\t\tquery = query.limit(limit);\n\t\t\t\t\t}\n\t\t\t\t\tif (sort && Object.keys(sort).length !== 0 && sort.constructor === Object) {\n\t\t\t\t\t\tquery = query.sort(sort);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tprojection &&\n\t\t\t\t\t\tObject.keys(projection).length !== 0 &&\n\t\t\t\t\t\tprojection.constructor === Object\n\t\t\t\t\t) {\n\t\t\t\t\t\tquery = query.project(projection);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst queryResult = await query.toArray();\n\n\t\t\t\t\tfor (const entry of queryResult) {\n\t\t\t\t\t\treturnData.push({ json: entry, pairedItem: fallbackPairedItems ?? [{ item: i }] });\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: { error: (error as JsonObject).message },\n\t\t\t\t\t\t\tpairedItem: fallbackPairedItems ?? [{ item: i }],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'findOneAndReplace') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\tconst dateFields = prepareFields(\n\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t);\n\n\t\t\tconst updateKey = ((this.getNodeParameter('updateKey', 0) as string) || '').trim();\n\n\t\t\tconst updateOptions = (this.getNodeParameter('upsert', 0) as boolean)\n\t\t\t\t? { upsert: true }\n\t\t\t\t: undefined;\n\n\t\t\tconst updateItems = prepareItems({ items, fields, updateKey, useDotNotation, dateFields });\n\n\t\t\tfor (const item of updateItems) {\n\t\t\t\ttry {\n\t\t\t\t\tconst filter = { [updateKey]: item[updateKey] };\n\t\t\t\t\tif (updateKey === '_id') {\n\t\t\t\t\t\tfilter[updateKey] = new ObjectId(item[updateKey] as string);\n\t\t\t\t\t\tdelete item._id;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t\t.findOneAndReplace(filter, item, updateOptions as FindOneAndReplaceOptions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\titem.json = { error: (error as JsonObject).message };\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(updateItems),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tif (operation === 'findOneAndUpdate') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\tconst dateFields = prepareFields(\n\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t);\n\n\t\t\tconst updateKey = ((this.getNodeParameter('updateKey', 0) as string) || '').trim();\n\n\t\t\tconst updateOptions = (this.getNodeParameter('upsert', 0) as boolean)\n\t\t\t\t? { upsert: true }\n\t\t\t\t: undefined;\n\n\t\t\tconst updateItems = prepareItems({\n\t\t\t\titems,\n\t\t\t\tfields,\n\t\t\t\tupdateKey,\n\t\t\t\tuseDotNotation,\n\t\t\t\tdateFields,\n\t\t\t\tisUpdate: nodeVersion >= 1.2,\n\t\t\t});\n\n\t\t\tfor (const item of updateItems) {\n\t\t\t\ttry {\n\t\t\t\t\tconst filter = { [updateKey]: item[updateKey] };\n\t\t\t\t\tif (updateKey === '_id') {\n\t\t\t\t\t\tfilter[updateKey] = new ObjectId(item[updateKey] as string);\n\t\t\t\t\t\tdelete item._id;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t\t.findOneAndUpdate(filter, { $set: item }, updateOptions as FindOneAndUpdateOptions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\titem.json = { error: (error as JsonObject).message };\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(updateItems),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tif (operation === 'insert') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tlet responseData: IDataObject[] = [];\n\t\t\ttry {\n\t\t\t\t// Prepare the data to insert and copy it to be returned\n\t\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\t\tconst dateFields = prepareFields(\n\t\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t\t);\n\n\t\t\t\tconst insertItems = prepareItems({\n\t\t\t\t\titems,\n\t\t\t\t\tfields,\n\t\t\t\t\tupdateKey: '',\n\t\t\t\t\tuseDotNotation,\n\t\t\t\t\tdateFields,\n\t\t\t\t});\n\n\t\t\t\tconst { insertedIds } = await mdb\n\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t.insertMany(insertItems);\n\n\t\t\t\t// Add the id to the data\n\t\t\t\tfor (const i of Object.keys(insertedIds)) {\n\t\t\t\t\tresponseData.push({\n\t\t\t\t\t\t...insertItems[parseInt(i, 10)],\n\t\t\t\t\t\tid: insertedIds[parseInt(i, 10)] as unknown as string,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\tresponseData = [{ error: (error as JsonObject).message }];\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(responseData),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tif (operation === 'update') {\n\t\t\tfallbackPairedItems = fallbackPairedItems ?? generatePairedItemData(items.length);\n\t\t\tconst fields = prepareFields(this.getNodeParameter('fields', 0) as string);\n\t\t\tconst useDotNotation = this.getNodeParameter('options.useDotNotation', 0, false) as boolean;\n\t\t\tconst dateFields = prepareFields(\n\t\t\t\tthis.getNodeParameter('options.dateFields', 0, '') as string,\n\t\t\t);\n\n\t\t\tconst updateKey = ((this.getNodeParameter('updateKey', 0) as string) || '').trim();\n\n\t\t\tconst updateOptions = (this.getNodeParameter('upsert', 0) as boolean)\n\t\t\t\t? { upsert: true }\n\t\t\t\t: undefined;\n\n\t\t\tconst updateItems = prepareItems({\n\t\t\t\titems,\n\t\t\t\tfields,\n\t\t\t\tupdateKey,\n\t\t\t\tuseDotNotation,\n\t\t\t\tdateFields,\n\t\t\t\tisUpdate: nodeVersion >= 1.2,\n\t\t\t});\n\n\t\t\tfor (const item of updateItems) {\n\t\t\t\ttry {\n\t\t\t\t\tconst filter = { [updateKey]: item[updateKey] };\n\t\t\t\t\tif (updateKey === '_id') {\n\t\t\t\t\t\tfilter[updateKey] = new ObjectId(item[updateKey] as string);\n\t\t\t\t\t\tdelete item._id;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait mdb\n\t\t\t\t\t\t.collection(this.getNodeParameter('collection', 0) as string)\n\t\t\t\t\t\t.updateOne(filter, { $set: item }, updateOptions as UpdateOptions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\titem.json = { error: (error as JsonObject).message };\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnData = this.helpers.constructExecutionMetaData(\n\t\t\t\tthis.helpers.returnJsonArray(updateItems),\n\t\t\t\t{ itemData: fallbackPairedItems },\n\t\t\t);\n\t\t}\n\n\t\tawait client.close();\n\n\t\treturn [stringifyObjectIDs(returnData)];\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/PostBin/BinDescription.ts"],"sourcesContent":["import type { INodeProperties } from 'n8n-workflow';\n\nimport { buildBinAPIURL, transformBinResponse } from './GenericFunctions';\n\n// Operations for the `Bin` resource:\nexport const binOperations: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Operation',\n\t\tname: 'operation',\n\t\ttype: 'options',\n\t\tnoDataExpression: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['bin'],\n\t\t\t},\n\t\t},\n\t\toptions: [\n\t\t\t{\n\t\t\t\tname: 'Create',\n\t\t\t\tvalue: 'create',\n\t\t\t\tdescription: 'Create bin',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\turl: '/
|
|
1
|
+
{"version":3,"sources":["../../../nodes/PostBin/BinDescription.ts"],"sourcesContent":["import type { INodeProperties } from 'n8n-workflow';\n\nimport { buildBinAPIURL, transformBinResponse } from './GenericFunctions';\n\n// Operations for the `Bin` resource:\nexport const binOperations: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Operation',\n\t\tname: 'operation',\n\t\ttype: 'options',\n\t\tnoDataExpression: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['bin'],\n\t\t\t},\n\t\t},\n\t\toptions: [\n\t\t\t{\n\t\t\t\tname: 'Create',\n\t\t\t\tvalue: 'create',\n\t\t\t\tdescription: 'Create bin',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\turl: '/api/bin',\n\t\t\t\t\t},\n\t\t\t\t\toutput: {\n\t\t\t\t\t\tpostReceive: [transformBinResponse],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taction: 'Create a bin',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Get',\n\t\t\t\tvalue: 'get',\n\t\t\t\tdescription: 'Get a bin',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t},\n\t\t\t\t\toutput: {\n\t\t\t\t\t\tpostReceive: [transformBinResponse],\n\t\t\t\t\t},\n\t\t\t\t\tsend: {\n\t\t\t\t\t\tpreSend: [\n\t\t\t\t\t\t\t// Parse binId before sending to make sure it's in the right format\n\t\t\t\t\t\t\tbuildBinAPIURL,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taction: 'Get a bin',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Delete',\n\t\t\t\tvalue: 'delete',\n\t\t\t\tdescription: 'Delete a bin',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\t},\n\t\t\t\t\tsend: {\n\t\t\t\t\t\tpreSend: [\n\t\t\t\t\t\t\t// Parse binId before sending to make sure it's in the right format\n\t\t\t\t\t\t\tbuildBinAPIURL,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taction: 'Delete a bin',\n\t\t\t},\n\t\t],\n\t\tdefault: 'create',\n\t},\n];\n\n// Properties of the `Bin` resource\nexport const binFields: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Bin ID',\n\t\tname: 'binId',\n\t\ttype: 'string',\n\t\tdefault: '',\n\t\trequired: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['bin'],\n\t\t\t\toperation: ['get', 'delete'],\n\t\t\t},\n\t\t},\n\t\tdescription: 'Unique identifier for each bin',\n\t},\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,8BAAqD;AAG9C,MAAM,gBAAmC;AAAA,EAC/C;AAAA,IACC,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,MACf,MAAM;AAAA,QACL,UAAU,CAAC,KAAK;AAAA,MACjB;AAAA,IACD;AAAA,IACA,SAAS;AAAA,MACR;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,UACR,SAAS;AAAA,YACR,QAAQ;AAAA,YACR,KAAK;AAAA,UACN;AAAA,UACA,QAAQ;AAAA,YACP,aAAa,CAAC,4CAAoB;AAAA,UACnC;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,MACT;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,UACR,SAAS;AAAA,YACR,QAAQ;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,YACP,aAAa,CAAC,4CAAoB;AAAA,UACnC;AAAA,UACA,MAAM;AAAA,YACL,SAAS;AAAA;AAAA,cAER;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,MACT;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,UACR,SAAS;AAAA,YACR,QAAQ;AAAA,UACT;AAAA,UACA,MAAM;AAAA,YACL,SAAS;AAAA;AAAA,cAER;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,MACT;AAAA,IACD;AAAA,IACA,SAAS;AAAA,EACV;AACD;AAGO,MAAM,YAA+B;AAAA,EAC3C;AAAA,IACC,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,gBAAgB;AAAA,MACf,MAAM;AAAA,QACL,UAAU,CAAC,KAAK;AAAA,QAChB,WAAW,CAAC,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACD;AAAA,IACA,aAAa;AAAA,EACd;AACD;","names":[]}
|
|
@@ -45,18 +45,18 @@ function parseBinId(context) {
|
|
|
45
45
|
}
|
|
46
46
|
async function buildBinAPIURL(requestOptions) {
|
|
47
47
|
const binId = parseBinId(this);
|
|
48
|
-
requestOptions.url = `/
|
|
48
|
+
requestOptions.url = `/api/bin/${binId}`;
|
|
49
49
|
return requestOptions;
|
|
50
50
|
}
|
|
51
51
|
async function buildBinTestURL(requestOptions) {
|
|
52
52
|
const binId = parseBinId(this);
|
|
53
|
-
requestOptions.url =
|
|
53
|
+
requestOptions.url = `/${binId}`;
|
|
54
54
|
return requestOptions;
|
|
55
55
|
}
|
|
56
56
|
async function buildRequestURL(requestOptions) {
|
|
57
57
|
const reqId = this.getNodeParameter("requestId", "shift");
|
|
58
58
|
const binId = parseBinId(this);
|
|
59
|
-
requestOptions.url = `/
|
|
59
|
+
requestOptions.url = `/api/bin/${binId}/req/${reqId}`;
|
|
60
60
|
return requestOptions;
|
|
61
61
|
}
|
|
62
62
|
async function transformBinResponse(items, _response) {
|
|
@@ -67,8 +67,8 @@ async function transformBinResponse(items, _response) {
|
|
|
67
67
|
nowIso: new Date(item.json.now).toISOString(),
|
|
68
68
|
expiresTimestamp: item.json.expires,
|
|
69
69
|
expiresIso: new Date(item.json.expires).toISOString(),
|
|
70
|
-
requestUrl: "https://www.
|
|
71
|
-
viewUrl: "https://www.
|
|
70
|
+
requestUrl: "https://www.postb.in/" + item.json.binId,
|
|
71
|
+
viewUrl: "https://www.postb.in/b/" + item.json.binId
|
|
72
72
|
}
|
|
73
73
|
);
|
|
74
74
|
return items;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/PostBin/GenericFunctions.ts"],"sourcesContent":["import type {\n\tIExecuteSingleFunctions,\n\tIHttpRequestOptions,\n\tIN8nHttpFullResponse,\n\tINodeExecutionData,\n} from 'n8n-workflow';\nimport { NodeApiError } from 'n8n-workflow';\n\n// Regular expressions used to extract binId from parameter value\nconst BIN_ID_REGEX = /\\b\\d{13}-\\d{13}\\b/g;\n\n/**\n * Extracts the PostBin Bin Id from the specified string.\n * This method should be able to extract bin Id from the\n * PostBin URL or from the string in the following format:\n * `Bin '<binId>'.`\n *\n */\nfunction parseBinId(context: IExecuteSingleFunctions) {\n\tconst binId = context.getNodeParameter('binId') as string;\n\t// Test if the Bin id is in the expected format\n\tBIN_ID_REGEX.lastIndex = 0;\n\tconst idMatch = BIN_ID_REGEX.exec(binId);\n\n\t// Return what is matched\n\tif (idMatch) {\n\t\treturn idMatch[0];\n\t}\n\n\t// If it's not recognized, error out\n\tthrow new NodeApiError(\n\t\tcontext.getNode(),\n\t\t{},\n\t\t{\n\t\t\tmessage: 'Bin ID format is not valid',\n\t\t\tdescription: 'Please check the provided Bin ID and try again.',\n\t\t\tparseXml: false,\n\t\t},\n\t);\n}\n\n/**\n * Creates correctly-formatted PostBin API URL based on the entered binId.\n * This function makes sure binId is in the expected format by parsing it\n * from current node parameter value.\n *\n */\nexport async function buildBinAPIURL(\n\tthis: IExecuteSingleFunctions,\n\trequestOptions: IHttpRequestOptions,\n): Promise<IHttpRequestOptions> {\n\tconst binId = parseBinId(this);\n\t// Assemble the PostBin API URL and put it back to requestOptions\n\trequestOptions.url = `/
|
|
1
|
+
{"version":3,"sources":["../../../nodes/PostBin/GenericFunctions.ts"],"sourcesContent":["import type {\n\tIExecuteSingleFunctions,\n\tIHttpRequestOptions,\n\tIN8nHttpFullResponse,\n\tINodeExecutionData,\n} from 'n8n-workflow';\nimport { NodeApiError } from 'n8n-workflow';\n\n// Regular expressions used to extract binId from parameter value\nconst BIN_ID_REGEX = /\\b\\d{13}-\\d{13}\\b/g;\n\n/**\n * Extracts the PostBin Bin Id from the specified string.\n * This method should be able to extract bin Id from the\n * PostBin URL or from the string in the following format:\n * `Bin '<binId>'.`\n *\n */\nfunction parseBinId(context: IExecuteSingleFunctions) {\n\tconst binId = context.getNodeParameter('binId') as string;\n\t// Test if the Bin id is in the expected format\n\tBIN_ID_REGEX.lastIndex = 0;\n\tconst idMatch = BIN_ID_REGEX.exec(binId);\n\n\t// Return what is matched\n\tif (idMatch) {\n\t\treturn idMatch[0];\n\t}\n\n\t// If it's not recognized, error out\n\tthrow new NodeApiError(\n\t\tcontext.getNode(),\n\t\t{},\n\t\t{\n\t\t\tmessage: 'Bin ID format is not valid',\n\t\t\tdescription: 'Please check the provided Bin ID and try again.',\n\t\t\tparseXml: false,\n\t\t},\n\t);\n}\n\n/**\n * Creates correctly-formatted PostBin API URL based on the entered binId.\n * This function makes sure binId is in the expected format by parsing it\n * from current node parameter value.\n *\n */\nexport async function buildBinAPIURL(\n\tthis: IExecuteSingleFunctions,\n\trequestOptions: IHttpRequestOptions,\n): Promise<IHttpRequestOptions> {\n\tconst binId = parseBinId(this);\n\t// Assemble the PostBin API URL and put it back to requestOptions\n\trequestOptions.url = `/api/bin/${binId}`;\n\n\treturn requestOptions;\n}\n\n/**\n * Creates correctly-formatted PostBin Bin test URL based on the entered binId.\n * This function makes sure binId is in the expected format by parsing it\n * from current node parameter value.\n *\n */\nexport async function buildBinTestURL(\n\tthis: IExecuteSingleFunctions,\n\trequestOptions: IHttpRequestOptions,\n): Promise<IHttpRequestOptions> {\n\tconst binId = parseBinId(this);\n\n\t// Assemble the PostBin API URL and put it back to requestOptions\n\trequestOptions.url = `/${binId}`;\n\treturn requestOptions;\n}\n\n/**\n * Creates correctly-formatted PostBin API URL based on the entered binId and reqId.\n * This function makes sure binId is in the expected format by parsing it\n * from current node parameter value.\n *\n */\nexport async function buildRequestURL(\n\tthis: IExecuteSingleFunctions,\n\trequestOptions: IHttpRequestOptions,\n): Promise<IHttpRequestOptions> {\n\tconst reqId = this.getNodeParameter('requestId', 'shift') as string;\n\tconst binId = parseBinId(this);\n\n\trequestOptions.url = `/api/bin/${binId}/req/${reqId}`;\n\treturn requestOptions;\n}\n\n/**\n * Converts the bin response data and adds additional properties\n *\n */\nexport async function transformBinResponse(\n\tthis: IExecuteSingleFunctions,\n\titems: INodeExecutionData[],\n\t_response: IN8nHttpFullResponse,\n): Promise<INodeExecutionData[]> {\n\titems.forEach(\n\t\t(item) =>\n\t\t\t(item.json = {\n\t\t\t\tbinId: item.json.binId,\n\t\t\t\tnowTimestamp: item.json.now,\n\t\t\t\tnowIso: new Date(item.json.now as string).toISOString(),\n\t\t\t\texpiresTimestamp: item.json.expires,\n\t\t\t\texpiresIso: new Date(item.json.expires as string).toISOString(),\n\t\t\t\trequestUrl: 'https://www.postb.in/' + (item.json.binId as string),\n\t\t\t\tviewUrl: 'https://www.postb.in/b/' + (item.json.binId as string),\n\t\t\t}),\n\t);\n\treturn items;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,0BAA6B;AAG7B,MAAM,eAAe;AASrB,SAAS,WAAW,SAAkC;AACrD,QAAM,QAAQ,QAAQ,iBAAiB,OAAO;AAE9C,eAAa,YAAY;AACzB,QAAM,UAAU,aAAa,KAAK,KAAK;AAGvC,MAAI,SAAS;AACZ,WAAO,QAAQ,CAAC;AAAA,EACjB;AAGA,QAAM,IAAI;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,CAAC;AAAA,IACD;AAAA,MACC,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,IACX;AAAA,EACD;AACD;AAQA,eAAsB,eAErB,gBAC+B;AAC/B,QAAM,QAAQ,WAAW,IAAI;AAE7B,iBAAe,MAAM,YAAY,KAAK;AAEtC,SAAO;AACR;AAQA,eAAsB,gBAErB,gBAC+B;AAC/B,QAAM,QAAQ,WAAW,IAAI;AAG7B,iBAAe,MAAM,IAAI,KAAK;AAC9B,SAAO;AACR;AAQA,eAAsB,gBAErB,gBAC+B;AAC/B,QAAM,QAAQ,KAAK,iBAAiB,aAAa,OAAO;AACxD,QAAM,QAAQ,WAAW,IAAI;AAE7B,iBAAe,MAAM,YAAY,KAAK,QAAQ,KAAK;AACnD,SAAO;AACR;AAMA,eAAsB,qBAErB,OACA,WACgC;AAChC,QAAM;AAAA,IACL,CAAC,SACC,KAAK,OAAO;AAAA,MACZ,OAAO,KAAK,KAAK;AAAA,MACjB,cAAc,KAAK,KAAK;AAAA,MACxB,QAAQ,IAAI,KAAK,KAAK,KAAK,GAAa,EAAE,YAAY;AAAA,MACtD,kBAAkB,KAAK,KAAK;AAAA,MAC5B,YAAY,IAAI,KAAK,KAAK,KAAK,OAAiB,EAAE,YAAY;AAAA,MAC9D,YAAY,0BAA2B,KAAK,KAAK;AAAA,MACjD,SAAS,4BAA6B,KAAK,KAAK;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACR;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/PostBin/PostBin.node.ts"],"sourcesContent":["import type { INodeType, INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionTypes } from 'n8n-workflow';\n\nimport { binFields, binOperations } from './BinDescription';\nimport { requestFields, requestOperations } from './RequestDescription';\n\nexport class PostBin implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'PostBin',\n\t\tname: 'postBin',\n\t\ticon: 'file:postbin.svg',\n\t\tgroup: ['transform'],\n\t\tversion: 1,\n\t\tsubtitle: '={{ $parameter[\"operation\"] + \": \" + $parameter[\"resource\"] }}',\n\t\tdescription: 'Consume PostBin API',\n\t\tdefaults: {\n\t\t\tname: 'PostBin',\n\t\t},\n\t\tusableAsTool: true,\n\t\tinputs: [NodeConnectionTypes.Main],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tcredentials: [],\n\t\trequestDefaults: {\n\t\t\tbaseURL: 'https://www.
|
|
1
|
+
{"version":3,"sources":["../../../nodes/PostBin/PostBin.node.ts"],"sourcesContent":["import type { INodeType, INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionTypes } from 'n8n-workflow';\n\nimport { binFields, binOperations } from './BinDescription';\nimport { requestFields, requestOperations } from './RequestDescription';\n\nexport class PostBin implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'PostBin',\n\t\tname: 'postBin',\n\t\ticon: 'file:postbin.svg',\n\t\tgroup: ['transform'],\n\t\tversion: 1,\n\t\tsubtitle: '={{ $parameter[\"operation\"] + \": \" + $parameter[\"resource\"] }}',\n\t\tdescription: 'Consume PostBin API',\n\t\tdefaults: {\n\t\t\tname: 'PostBin',\n\t\t},\n\t\tusableAsTool: true,\n\t\tinputs: [NodeConnectionTypes.Main],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tcredentials: [],\n\t\trequestDefaults: {\n\t\t\tbaseURL: 'https://www.postb.in',\n\t\t},\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Resource',\n\t\t\t\tname: 'resource',\n\t\t\t\ttype: 'options',\n\t\t\t\tnoDataExpression: true,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Bin',\n\t\t\t\t\t\tvalue: 'bin',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Request',\n\t\t\t\t\t\tvalue: 'request',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'bin',\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\t...binOperations,\n\t\t\t...binFields,\n\t\t\t...requestOperations,\n\t\t\t...requestFields,\n\t\t],\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAoC;AAEpC,4BAAyC;AACzC,gCAAiD;AAE1C,MAAM,QAA6B;AAAA,EAAnC;AACN,uBAAoC;AAAA,MACnC,aAAa;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,CAAC,WAAW;AAAA,MACnB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,QACT,MAAM;AAAA,MACP;AAAA,MACA,cAAc;AAAA,MACd,QAAQ,CAAC,wCAAoB,IAAI;AAAA,MACjC,SAAS,CAAC,wCAAoB,IAAI;AAAA,MAClC,aAAa,CAAC;AAAA,MACd,iBAAiB;AAAA,QAChB,SAAS;AAAA,MACV;AAAA,MACA,YAAY;AAAA,QACX;AAAA,UACC,aAAa;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,kBAAkB;AAAA,UAClB,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,OAAO;AAAA,YACR;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,OAAO;AAAA,YACR;AAAA,UACD;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,QACX;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACJ;AAAA,IACD;AAAA;AACD;","names":[]}
|
|
@@ -42,7 +42,7 @@ const requestOperations = [
|
|
|
42
42
|
routing: {
|
|
43
43
|
request: {
|
|
44
44
|
method: "GET",
|
|
45
|
-
url: '=/
|
|
45
|
+
url: '=/api/bin/{{$parameter["binId"]}}/req/{{$parameter["requestId"]}}'
|
|
46
46
|
},
|
|
47
47
|
send: {
|
|
48
48
|
preSend: [
|
|
@@ -60,7 +60,7 @@ const requestOperations = [
|
|
|
60
60
|
routing: {
|
|
61
61
|
request: {
|
|
62
62
|
method: "GET",
|
|
63
|
-
url: '=/
|
|
63
|
+
url: '=/api/bin/{{$parameter["binId"]}}/req/shift'
|
|
64
64
|
},
|
|
65
65
|
send: {
|
|
66
66
|
preSend: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/PostBin/RequestDescription.ts"],"sourcesContent":["import type { INodeProperties } from 'n8n-workflow';\n\nimport { buildBinTestURL, buildRequestURL } from './GenericFunctions';\n\n// Operations for the `Request` resource\nexport const requestOperations: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Operation',\n\t\tname: 'operation',\n\t\ttype: 'options',\n\t\tnoDataExpression: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['request'],\n\t\t\t},\n\t\t},\n\t\toptions: [\n\t\t\t{\n\t\t\t\tname: 'Get',\n\t\t\t\tvalue: 'get',\n\t\t\t\tdescription: 'Get a request',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\turl: '=/
|
|
1
|
+
{"version":3,"sources":["../../../nodes/PostBin/RequestDescription.ts"],"sourcesContent":["import type { INodeProperties } from 'n8n-workflow';\n\nimport { buildBinTestURL, buildRequestURL } from './GenericFunctions';\n\n// Operations for the `Request` resource\nexport const requestOperations: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Operation',\n\t\tname: 'operation',\n\t\ttype: 'options',\n\t\tnoDataExpression: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['request'],\n\t\t\t},\n\t\t},\n\t\toptions: [\n\t\t\t{\n\t\t\t\tname: 'Get',\n\t\t\t\tvalue: 'get',\n\t\t\t\tdescription: 'Get a request',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\turl: '=/api/bin/{{$parameter[\"binId\"]}}/req/{{$parameter[\"requestId\"]}}',\n\t\t\t\t\t},\n\t\t\t\t\tsend: {\n\t\t\t\t\t\tpreSend: [\n\t\t\t\t\t\t\t// Parse binId before sending to make sure it's in the right format\n\t\t\t\t\t\t\tbuildRequestURL,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taction: 'Get a request',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Remove First',\n\t\t\t\tvalue: 'removeFirst',\n\t\t\t\tdescription: 'Remove the first request from bin',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\turl: '=/api/bin/{{$parameter[\"binId\"]}}/req/shift',\n\t\t\t\t\t},\n\t\t\t\t\tsend: {\n\t\t\t\t\t\tpreSend: [\n\t\t\t\t\t\t\t// Parse binId before sending to make sure it's in the right format\n\t\t\t\t\t\t\tbuildRequestURL,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taction: 'Remove First a request',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Send',\n\t\t\t\tvalue: 'send',\n\t\t\t\tdescription: 'Send a test request to the bin',\n\t\t\t\trouting: {\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t},\n\t\t\t\t\tsend: {\n\t\t\t\t\t\tpreSend: [\n\t\t\t\t\t\t\t// Parse binId before sending to make sure it's in the right format\n\t\t\t\t\t\t\tbuildBinTestURL,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\toutput: {\n\t\t\t\t\t\tpostReceive: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'set',\n\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\tvalue: '={{ { \"requestId\": $response.body } }}',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\taction: 'Send a request',\n\t\t\t},\n\t\t],\n\t\tdefault: 'get',\n\t},\n];\n\n// Properties of the `Request` resource\nexport const requestFields: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Bin ID',\n\t\tname: 'binId',\n\t\ttype: 'string',\n\t\tdefault: '',\n\t\trequired: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['request'],\n\t\t\t\toperation: ['get', 'removeFirst', 'send'],\n\t\t\t},\n\t\t},\n\t\tdescription: 'Unique identifier for each bin',\n\t},\n\t{\n\t\tdisplayName: 'Bin Content',\n\t\tname: 'binContent',\n\t\ttype: 'string',\n\t\tdefault: '',\n\t\ttypeOptions: {\n\t\t\trows: 5,\n\t\t},\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['request'],\n\t\t\t\toperation: ['send'],\n\t\t\t},\n\t\t},\n\t\t// Content is sent in the body of POST requests\n\t\trouting: {\n\t\t\tsend: {\n\t\t\t\tproperty: 'content',\n\t\t\t\ttype: 'body',\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tdisplayName: 'Request ID',\n\t\tname: 'requestId',\n\t\ttype: 'string',\n\t\tdefault: '',\n\t\trequired: true,\n\t\tdisplayOptions: {\n\t\t\tshow: {\n\t\t\t\tresource: ['request'],\n\t\t\t\toperation: ['get'],\n\t\t\t},\n\t\t},\n\t\tdescription: 'Unique identifier for each request',\n\t},\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,8BAAiD;AAG1C,MAAM,oBAAuC;AAAA,EACnD;AAAA,IACC,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,MACf,MAAM;AAAA,QACL,UAAU,CAAC,SAAS;AAAA,MACrB;AAAA,IACD;AAAA,IACA,SAAS;AAAA,MACR;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,UACR,SAAS;AAAA,YACR,QAAQ;AAAA,YACR,KAAK;AAAA,UACN;AAAA,UACA,MAAM;AAAA,YACL,SAAS;AAAA;AAAA,cAER;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,MACT;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,UACR,SAAS;AAAA,YACR,QAAQ;AAAA,YACR,KAAK;AAAA,UACN;AAAA,UACA,MAAM;AAAA,YACL,SAAS;AAAA;AAAA,cAER;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,MACT;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,UACR,SAAS;AAAA,YACR,QAAQ;AAAA,UACT;AAAA,UACA,MAAM;AAAA,YACL,SAAS;AAAA;AAAA,cAER;AAAA,YACD;AAAA,UACD;AAAA,UACA,QAAQ;AAAA,YACP,aAAa;AAAA,cACZ;AAAA,gBACC,MAAM;AAAA,gBACN,YAAY;AAAA,kBACX,OAAO;AAAA,gBACR;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,QACA,QAAQ;AAAA,MACT;AAAA,IACD;AAAA,IACA,SAAS;AAAA,EACV;AACD;AAGO,MAAM,gBAAmC;AAAA,EAC/C;AAAA,IACC,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,gBAAgB;AAAA,MACf,MAAM;AAAA,QACL,UAAU,CAAC,SAAS;AAAA,QACpB,WAAW,CAAC,OAAO,eAAe,MAAM;AAAA,MACzC;AAAA,IACD;AAAA,IACA,aAAa;AAAA,EACd;AAAA,EACA;AAAA,IACC,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,MACZ,MAAM;AAAA,IACP;AAAA,IACA,gBAAgB;AAAA,MACf,MAAM;AAAA,QACL,UAAU,CAAC,SAAS;AAAA,QACpB,WAAW,CAAC,MAAM;AAAA,MACnB;AAAA,IACD;AAAA;AAAA,IAEA,SAAS;AAAA,MACR,MAAM;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA,EACA;AAAA,IACC,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,gBAAgB;AAAA,MACf,MAAM;AAAA,QACL,UAAU,CAAC,SAAS;AAAA,QACpB,WAAW,CAAC,KAAK;AAAA,MAClB;AAAA,IACD;AAAA,IACA,aAAa;AAAA,EACd;AACD;","names":[]}
|
|
@@ -39,8 +39,8 @@ class PostgresTrigger {
|
|
|
39
39
|
triggerPanel: {
|
|
40
40
|
header: "",
|
|
41
41
|
executionsHelp: {
|
|
42
|
-
inactive: "<b>While building your workflow</b>, click the '
|
|
43
|
-
active: "<b>While building your workflow</b>, click the '
|
|
42
|
+
inactive: "<b>While building your workflow</b>, click the 'execute step' button, then trigger a Postgres event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Once you're happy with your workflow</b>, <a data-key='activate'>activate</a> it. Then every time a change is detected, the workflow will execute. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor.",
|
|
43
|
+
active: "<b>While building your workflow</b>, click the 'execute step' button, then trigger a Postgres event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Your workflow will also execute automatically</b>, since it's activated. Every time a change is detected, this node will trigger an execution. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor."
|
|
44
44
|
},
|
|
45
45
|
activationHint: "Once you've finished building your workflow, <a data-key='activate'>activate</a> it to have it also listen continuously (you just won't see those executions here)."
|
|
46
46
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../nodes/Postgres/PostgresTrigger.node.ts"],"sourcesContent":["import {\n\tTriggerCloseError,\n\ttype IDataObject,\n\ttype INodeType,\n\ttype INodeTypeDescription,\n\ttype ITriggerFunctions,\n\ttype ITriggerResponse,\n\tNodeConnectionTypes,\n} from 'n8n-workflow';\n\nimport {\n\tpgTriggerFunction,\n\tinitDB,\n\tsearchSchema,\n\tsearchTables,\n\tprepareNames,\n} from './PostgresTrigger.functions';\n\nexport class PostgresTrigger implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'Postgres Trigger',\n\t\tname: 'postgresTrigger',\n\t\ticon: 'file:postgres.svg',\n\t\tgroup: ['trigger'],\n\t\tversion: 1,\n\t\tdescription: 'Listens to Postgres messages',\n\t\teventTriggerDescription: '',\n\t\tdefaults: {\n\t\t\tname: 'Postgres Trigger',\n\t\t},\n\t\ttriggerPanel: {\n\t\t\theader: '',\n\t\t\texecutionsHelp: {\n\t\t\t\tinactive:\n\t\t\t\t\t\"<b>While building your workflow</b>, click the 'test step' button, then trigger a Postgres event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Once you're happy with your workflow</b>, <a data-key='activate'>activate</a> it. Then every time a change is detected, the workflow will execute. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor.\",\n\t\t\t\tactive:\n\t\t\t\t\t\"<b>While building your workflow</b>, click the 'test step' button, then trigger a Postgres event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Your workflow will also execute automatically</b>, since it's activated. Every time a change is detected, this node will trigger an execution. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor.\",\n\t\t\t},\n\t\t\tactivationHint:\n\t\t\t\t\"Once you've finished building your workflow, <a data-key='activate'>activate</a> it to have it also listen continuously (you just won't see those executions here).\",\n\t\t},\n\t\tinputs: [],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tcredentials: [\n\t\t\t{\n\t\t\t\tname: 'postgres',\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Listen For',\n\t\t\t\tname: 'triggerMode',\n\t\t\t\ttype: 'options',\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Table Row Change Events',\n\t\t\t\t\t\tvalue: 'createTrigger',\n\t\t\t\t\t\tdescription: 'Insert, update or delete',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Advanced',\n\t\t\t\t\t\tvalue: 'listenTrigger',\n\t\t\t\t\t\tdescription: 'Listen to existing Postgres channel',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'createTrigger',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Schema Name',\n\t\t\t\tname: 'schema',\n\t\t\t\ttype: 'resourceLocator',\n\t\t\t\tdefault: { mode: 'list', value: 'public' },\n\t\t\t\trequired: true,\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmodes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'From List',\n\t\t\t\t\t\tname: 'list',\n\t\t\t\t\t\ttype: 'list',\n\t\t\t\t\t\tplaceholder: 'Select a schema',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tsearchListMethod: 'searchSchema',\n\t\t\t\t\t\t\tsearchFilterRequired: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Name',\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tplaceholder: 'e.g. public',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Table Name',\n\t\t\t\tname: 'tableName',\n\t\t\t\ttype: 'resourceLocator',\n\t\t\t\tdefault: { mode: 'list', value: '' },\n\t\t\t\trequired: true,\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmodes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'From List',\n\t\t\t\t\t\tname: 'list',\n\t\t\t\t\t\ttype: 'list',\n\t\t\t\t\t\tplaceholder: 'Select a table',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tsearchListMethod: 'searchTables',\n\t\t\t\t\t\t\tsearchFilterRequired: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Name',\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tplaceholder: 'e.g. table_name',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Channel Name',\n\t\t\t\tname: 'channelName',\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: '',\n\t\t\t\trequired: true,\n\t\t\t\tplaceholder: 'e.g. n8n_channel',\n\t\t\t\tdescription: 'Name of the channel to listen to',\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['listenTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Event to listen for',\n\t\t\t\tname: 'firesOn',\n\t\t\t\ttype: 'options',\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Insert',\n\t\t\t\t\t\tvalue: 'INSERT',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Update',\n\t\t\t\t\t\tvalue: 'UPDATE',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Delete',\n\t\t\t\t\t\tvalue: 'DELETE',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'INSERT',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Additional Fields',\n\t\t\t\tname: 'additionalFields',\n\t\t\t\ttype: 'collection',\n\t\t\t\tplaceholder: 'Add Field',\n\t\t\t\tdefault: {},\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Channel Name',\n\t\t\t\t\t\tname: 'channelName',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tplaceholder: 'e.g. n8n_channel',\n\t\t\t\t\t\tdescription: 'Name of the channel to listen to',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t},\n\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Function Name',\n\t\t\t\t\t\tname: 'functionName',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription: 'Name of the function to create',\n\t\t\t\t\t\tplaceholder: 'e.g. n8n_trigger_function()',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Replace if Exists',\n\t\t\t\t\t\tname: 'replaceIfExists',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdescription: 'Whether to replace an existing function and trigger with the same name',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Trigger Name',\n\t\t\t\t\t\tname: 'triggerName',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription: 'Name of the trigger to create',\n\t\t\t\t\t\tplaceholder: 'e.g. n8n_trigger',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Options',\n\t\t\t\tname: 'options',\n\t\t\t\ttype: 'collection',\n\t\t\t\tplaceholder: 'Add option',\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Connection Timeout',\n\t\t\t\t\t\tname: 'connectionTimeout',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 30,\n\t\t\t\t\t\tdescription: 'Number of seconds reserved for connecting to the database',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Delay Closing Idle Connection',\n\t\t\t\t\t\tname: 'delayClosingIdleConnection',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 0,\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Number of seconds to wait before idle connection would be eligible for closing',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tmethods = {\n\t\tlistSearch: {\n\t\t\tsearchSchema,\n\t\t\tsearchTables,\n\t\t},\n\t};\n\n\tasync trigger(this: ITriggerFunctions): Promise<ITriggerResponse> {\n\t\tconst triggerMode = this.getNodeParameter('triggerMode', 0) as string;\n\t\tconst additionalFields = this.getNodeParameter('additionalFields', 0) as IDataObject;\n\n\t\t// initialize and connect to database\n\t\tconst { db } = await initDB.call(this);\n\t\tconst connection = await db.connect({ direct: true });\n\n\t\t// prepare and set up listener\n\t\tconst onNotification = async (data: IDataObject) => {\n\t\t\tif (data.payload) {\n\t\t\t\ttry {\n\t\t\t\t\tdata.payload = JSON.parse(data.payload as string) as IDataObject;\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.emit([this.helpers.returnJsonArray([data])]);\n\t\t};\n\n\t\t// create trigger, function and channel or use existing channel\n\t\tconst pgNames = prepareNames(this.getNode().id, this.getMode(), additionalFields);\n\t\tif (triggerMode === 'createTrigger') {\n\t\t\tawait pgTriggerFunction.call(\n\t\t\t\tthis,\n\t\t\t\tdb,\n\t\t\t\tadditionalFields,\n\t\t\t\tpgNames.functionName,\n\t\t\t\tpgNames.triggerName,\n\t\t\t\tpgNames.channelName,\n\t\t\t);\n\t\t} else {\n\t\t\tpgNames.channelName = this.getNodeParameter('channelName', '') as string;\n\t\t}\n\n\t\t// listen to channel\n\t\tawait connection.none(`LISTEN ${pgNames.channelName}`);\n\n\t\tconst cleanUpDb = async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\t// check if the connection is healthy\n\t\t\t\t\tawait connection.query('SELECT 1');\n\t\t\t\t} catch {\n\t\t\t\t\t// connection already closed. Can't perform cleanup\n\n\t\t\t\t\tthrow new TriggerCloseError(this.getNode(), { level: 'warning' });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait connection.none('UNLISTEN $1:name', [pgNames.channelName]);\n\t\t\t\t\tif (triggerMode === 'createTrigger') {\n\t\t\t\t\t\tconst functionName = pgNames.functionName.includes('(')\n\t\t\t\t\t\t\t? pgNames.functionName.split('(')[0]\n\t\t\t\t\t\t\t: pgNames.functionName;\n\t\t\t\t\t\tawait connection.any('DROP FUNCTION IF EXISTS $1:name CASCADE', [functionName]);\n\n\t\t\t\t\t\tconst schema = this.getNodeParameter('schema', undefined, {\n\t\t\t\t\t\t\textractValue: true,\n\t\t\t\t\t\t}) as string;\n\t\t\t\t\t\tconst table = this.getNodeParameter('tableName', undefined, {\n\t\t\t\t\t\t\textractValue: true,\n\t\t\t\t\t\t}) as string;\n\n\t\t\t\t\t\tawait connection.any('DROP TRIGGER IF EXISTS $1:name ON $2:name.$3:name CASCADE', [\n\t\t\t\t\t\t\tpgNames.triggerName,\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new TriggerCloseError(this.getNode(), { cause: error as Error, level: 'error' });\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tconnection.client.removeListener('notification', onNotification);\n\t\t\t}\n\t\t};\n\n\t\tconnection.client.on('notification', onNotification);\n\n\t\t// The \"closeFunction\" function gets called by n8n whenever\n\t\t// the workflow gets deactivated and can so clean up.\n\t\tconst closeFunction = async () => {\n\t\t\tawait cleanUpDb();\n\t\t};\n\n\t\tconst manualTriggerFunction = async () => {\n\t\t\tawait new Promise(async (resolve, reject) => {\n\t\t\t\tconst timeoutHandler = setTimeout(async () => {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\tawait (async () => {\n\t\t\t\t\t\t\t\tawait cleanUpDb();\n\t\t\t\t\t\t\t\treturn 'Aborted, no data received within 30secs. This 30sec timeout is only set for \"manually triggered execution\". Active Workflows will listen indefinitely.';\n\t\t\t\t\t\t\t})(),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}, 60000);\n\t\t\t\tconnection.client.on('notification', async (data: IDataObject) => {\n\t\t\t\t\tif (data.payload) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata.payload = JSON.parse(data.payload as string) as IDataObject;\n\t\t\t\t\t\t} catch (error) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.emit([this.helpers.returnJsonArray([data])]);\n\t\t\t\t\tclearTimeout(timeoutHandler);\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tcloseFunction,\n\t\t\tmanualTriggerFunction: this.getMode() === 'manual' ? manualTriggerFunction : undefined,\n\t\t};\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../nodes/Postgres/PostgresTrigger.node.ts"],"sourcesContent":["import {\n\tTriggerCloseError,\n\ttype IDataObject,\n\ttype INodeType,\n\ttype INodeTypeDescription,\n\ttype ITriggerFunctions,\n\ttype ITriggerResponse,\n\tNodeConnectionTypes,\n} from 'n8n-workflow';\n\nimport {\n\tpgTriggerFunction,\n\tinitDB,\n\tsearchSchema,\n\tsearchTables,\n\tprepareNames,\n} from './PostgresTrigger.functions';\n\nexport class PostgresTrigger implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'Postgres Trigger',\n\t\tname: 'postgresTrigger',\n\t\ticon: 'file:postgres.svg',\n\t\tgroup: ['trigger'],\n\t\tversion: 1,\n\t\tdescription: 'Listens to Postgres messages',\n\t\teventTriggerDescription: '',\n\t\tdefaults: {\n\t\t\tname: 'Postgres Trigger',\n\t\t},\n\t\ttriggerPanel: {\n\t\t\theader: '',\n\t\t\texecutionsHelp: {\n\t\t\t\tinactive:\n\t\t\t\t\t\"<b>While building your workflow</b>, click the 'execute step' button, then trigger a Postgres event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Once you're happy with your workflow</b>, <a data-key='activate'>activate</a> it. Then every time a change is detected, the workflow will execute. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor.\",\n\t\t\t\tactive:\n\t\t\t\t\t\"<b>While building your workflow</b>, click the 'execute step' button, then trigger a Postgres event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Your workflow will also execute automatically</b>, since it's activated. Every time a change is detected, this node will trigger an execution. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor.\",\n\t\t\t},\n\t\t\tactivationHint:\n\t\t\t\t\"Once you've finished building your workflow, <a data-key='activate'>activate</a> it to have it also listen continuously (you just won't see those executions here).\",\n\t\t},\n\t\tinputs: [],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tcredentials: [\n\t\t\t{\n\t\t\t\tname: 'postgres',\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Listen For',\n\t\t\t\tname: 'triggerMode',\n\t\t\t\ttype: 'options',\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Table Row Change Events',\n\t\t\t\t\t\tvalue: 'createTrigger',\n\t\t\t\t\t\tdescription: 'Insert, update or delete',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Advanced',\n\t\t\t\t\t\tvalue: 'listenTrigger',\n\t\t\t\t\t\tdescription: 'Listen to existing Postgres channel',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'createTrigger',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Schema Name',\n\t\t\t\tname: 'schema',\n\t\t\t\ttype: 'resourceLocator',\n\t\t\t\tdefault: { mode: 'list', value: 'public' },\n\t\t\t\trequired: true,\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmodes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'From List',\n\t\t\t\t\t\tname: 'list',\n\t\t\t\t\t\ttype: 'list',\n\t\t\t\t\t\tplaceholder: 'Select a schema',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tsearchListMethod: 'searchSchema',\n\t\t\t\t\t\t\tsearchFilterRequired: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Name',\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tplaceholder: 'e.g. public',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Table Name',\n\t\t\t\tname: 'tableName',\n\t\t\t\ttype: 'resourceLocator',\n\t\t\t\tdefault: { mode: 'list', value: '' },\n\t\t\t\trequired: true,\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tmodes: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'From List',\n\t\t\t\t\t\tname: 'list',\n\t\t\t\t\t\ttype: 'list',\n\t\t\t\t\t\tplaceholder: 'Select a table',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tsearchListMethod: 'searchTables',\n\t\t\t\t\t\t\tsearchFilterRequired: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Name',\n\t\t\t\t\t\tname: 'name',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tplaceholder: 'e.g. table_name',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Channel Name',\n\t\t\t\tname: 'channelName',\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: '',\n\t\t\t\trequired: true,\n\t\t\t\tplaceholder: 'e.g. n8n_channel',\n\t\t\t\tdescription: 'Name of the channel to listen to',\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['listenTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Event to listen for',\n\t\t\t\tname: 'firesOn',\n\t\t\t\ttype: 'options',\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Insert',\n\t\t\t\t\t\tvalue: 'INSERT',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Update',\n\t\t\t\t\t\tvalue: 'UPDATE',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Delete',\n\t\t\t\t\t\tvalue: 'DELETE',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'INSERT',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Additional Fields',\n\t\t\t\tname: 'additionalFields',\n\t\t\t\ttype: 'collection',\n\t\t\t\tplaceholder: 'Add Field',\n\t\t\t\tdefault: {},\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\ttriggerMode: ['createTrigger'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Channel Name',\n\t\t\t\t\t\tname: 'channelName',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tplaceholder: 'e.g. n8n_channel',\n\t\t\t\t\t\tdescription: 'Name of the channel to listen to',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t},\n\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Function Name',\n\t\t\t\t\t\tname: 'functionName',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription: 'Name of the function to create',\n\t\t\t\t\t\tplaceholder: 'e.g. n8n_trigger_function()',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Replace if Exists',\n\t\t\t\t\t\tname: 'replaceIfExists',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdescription: 'Whether to replace an existing function and trigger with the same name',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Trigger Name',\n\t\t\t\t\t\tname: 'triggerName',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription: 'Name of the trigger to create',\n\t\t\t\t\t\tplaceholder: 'e.g. n8n_trigger',\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Options',\n\t\t\t\tname: 'options',\n\t\t\t\ttype: 'collection',\n\t\t\t\tplaceholder: 'Add option',\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Connection Timeout',\n\t\t\t\t\t\tname: 'connectionTimeout',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 30,\n\t\t\t\t\t\tdescription: 'Number of seconds reserved for connecting to the database',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Delay Closing Idle Connection',\n\t\t\t\t\t\tname: 'delayClosingIdleConnection',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 0,\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Number of seconds to wait before idle connection would be eligible for closing',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tmethods = {\n\t\tlistSearch: {\n\t\t\tsearchSchema,\n\t\t\tsearchTables,\n\t\t},\n\t};\n\n\tasync trigger(this: ITriggerFunctions): Promise<ITriggerResponse> {\n\t\tconst triggerMode = this.getNodeParameter('triggerMode', 0) as string;\n\t\tconst additionalFields = this.getNodeParameter('additionalFields', 0) as IDataObject;\n\n\t\t// initialize and connect to database\n\t\tconst { db } = await initDB.call(this);\n\t\tconst connection = await db.connect({ direct: true });\n\n\t\t// prepare and set up listener\n\t\tconst onNotification = async (data: IDataObject) => {\n\t\t\tif (data.payload) {\n\t\t\t\ttry {\n\t\t\t\t\tdata.payload = JSON.parse(data.payload as string) as IDataObject;\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.emit([this.helpers.returnJsonArray([data])]);\n\t\t};\n\n\t\t// create trigger, function and channel or use existing channel\n\t\tconst pgNames = prepareNames(this.getNode().id, this.getMode(), additionalFields);\n\t\tif (triggerMode === 'createTrigger') {\n\t\t\tawait pgTriggerFunction.call(\n\t\t\t\tthis,\n\t\t\t\tdb,\n\t\t\t\tadditionalFields,\n\t\t\t\tpgNames.functionName,\n\t\t\t\tpgNames.triggerName,\n\t\t\t\tpgNames.channelName,\n\t\t\t);\n\t\t} else {\n\t\t\tpgNames.channelName = this.getNodeParameter('channelName', '') as string;\n\t\t}\n\n\t\t// listen to channel\n\t\tawait connection.none(`LISTEN ${pgNames.channelName}`);\n\n\t\tconst cleanUpDb = async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\t// check if the connection is healthy\n\t\t\t\t\tawait connection.query('SELECT 1');\n\t\t\t\t} catch {\n\t\t\t\t\t// connection already closed. Can't perform cleanup\n\n\t\t\t\t\tthrow new TriggerCloseError(this.getNode(), { level: 'warning' });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait connection.none('UNLISTEN $1:name', [pgNames.channelName]);\n\t\t\t\t\tif (triggerMode === 'createTrigger') {\n\t\t\t\t\t\tconst functionName = pgNames.functionName.includes('(')\n\t\t\t\t\t\t\t? pgNames.functionName.split('(')[0]\n\t\t\t\t\t\t\t: pgNames.functionName;\n\t\t\t\t\t\tawait connection.any('DROP FUNCTION IF EXISTS $1:name CASCADE', [functionName]);\n\n\t\t\t\t\t\tconst schema = this.getNodeParameter('schema', undefined, {\n\t\t\t\t\t\t\textractValue: true,\n\t\t\t\t\t\t}) as string;\n\t\t\t\t\t\tconst table = this.getNodeParameter('tableName', undefined, {\n\t\t\t\t\t\t\textractValue: true,\n\t\t\t\t\t\t}) as string;\n\n\t\t\t\t\t\tawait connection.any('DROP TRIGGER IF EXISTS $1:name ON $2:name.$3:name CASCADE', [\n\t\t\t\t\t\t\tpgNames.triggerName,\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new TriggerCloseError(this.getNode(), { cause: error as Error, level: 'error' });\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tconnection.client.removeListener('notification', onNotification);\n\t\t\t}\n\t\t};\n\n\t\tconnection.client.on('notification', onNotification);\n\n\t\t// The \"closeFunction\" function gets called by n8n whenever\n\t\t// the workflow gets deactivated and can so clean up.\n\t\tconst closeFunction = async () => {\n\t\t\tawait cleanUpDb();\n\t\t};\n\n\t\tconst manualTriggerFunction = async () => {\n\t\t\tawait new Promise(async (resolve, reject) => {\n\t\t\t\tconst timeoutHandler = setTimeout(async () => {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\tawait (async () => {\n\t\t\t\t\t\t\t\tawait cleanUpDb();\n\t\t\t\t\t\t\t\treturn 'Aborted, no data received within 30secs. This 30sec timeout is only set for \"manually triggered execution\". Active Workflows will listen indefinitely.';\n\t\t\t\t\t\t\t})(),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}, 60000);\n\t\t\t\tconnection.client.on('notification', async (data: IDataObject) => {\n\t\t\t\t\tif (data.payload) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata.payload = JSON.parse(data.payload as string) as IDataObject;\n\t\t\t\t\t\t} catch (error) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.emit([this.helpers.returnJsonArray([data])]);\n\t\t\t\t\tclearTimeout(timeoutHandler);\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tcloseFunction,\n\t\t\tmanualTriggerFunction: this.getMode() === 'manual' ? manualTriggerFunction : undefined,\n\t\t};\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -40,8 +40,8 @@ class RabbitMQTrigger {
|
|
|
40
40
|
triggerPanel: {
|
|
41
41
|
header: "",
|
|
42
42
|
executionsHelp: {
|
|
43
|
-
inactive: "<b>While building your workflow</b>, click the '
|
|
44
|
-
active: "<b>While building your workflow</b>, click the '
|
|
43
|
+
inactive: "<b>While building your workflow</b>, click the 'execute step' button, then trigger a Rabbit MQ event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Once you're happy with your workflow</b>, <a data-key='activate'>activate</a> it. Then every time a change is detected, the workflow will execute. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor.",
|
|
44
|
+
active: "<b>While building your workflow</b>, click the 'execute step' button, then trigger a Rabbit MQ event. This will trigger an execution, which will show up in this editor.<br /> <br /><b>Your workflow will also execute automatically</b>, since it's activated. Every time a change is detected, this node will trigger an execution. These executions will show up in the <a data-key='executions'>executions list</a>, but not in the editor."
|
|
45
45
|
},
|
|
46
46
|
activationHint: "Once you\u2019ve finished building your workflow, <a data-key='activate'>activate</a> it to have it also listen continuously (you just won\u2019t see those executions here)."
|
|
47
47
|
},
|