n8n-nodes-base 1.95.1 → 1.96.1

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.
Files changed (148) hide show
  1. package/dist/credentials/PerplexityApi.credentials.js +1 -1
  2. package/dist/credentials/PerplexityApi.credentials.js.map +1 -1
  3. package/dist/nodes/Adalo/__schema__/v1.0.0/collection/getAll.json +21 -0
  4. package/dist/nodes/Airtable/test/v2/node/helpers.js +12 -2
  5. package/dist/nodes/Airtable/test/v2/node/helpers.js.map +1 -1
  6. package/dist/nodes/Airtop/__schema__/v1.0.0/extraction/query.json +7 -1
  7. package/dist/nodes/Airtop/__schema__/v1.0.0/session/create.json +9 -0
  8. package/dist/nodes/Airtop/__schema__/v1.0.0/window/create.json +40 -0
  9. package/dist/nodes/Airtop/test/node/helpers.js +12 -2
  10. package/dist/nodes/Airtop/test/node/helpers.js.map +1 -1
  11. package/dist/nodes/Asana/__schema__/v1.0.0/subtask/getAll.json +4 -1
  12. package/dist/nodes/Aws/S3/__schema__/v2.0.0/file/getAll.json +7 -1
  13. package/dist/nodes/Aws/S3/__schema__/v2.0.0/folder/getAll.json +7 -1
  14. package/dist/nodes/BambooHr/__schema__/v1.0.0/employee/getAll.json +1 -4
  15. package/dist/nodes/ClickUp/__schema__/v1.0.0/list/customFields.json +23 -1
  16. package/dist/nodes/Code/Pyodide.js +24 -0
  17. package/dist/nodes/Code/Pyodide.js.map +1 -1
  18. package/dist/nodes/CompareDatasets/GenericFunctions.js +5 -5
  19. package/dist/nodes/CompareDatasets/GenericFunctions.js.map +1 -1
  20. package/dist/nodes/Discord/__schema__/v2.0.0/message/sendAndWait.json +14 -0
  21. package/dist/nodes/Discord/v2/helpers/utils.js +2 -2
  22. package/dist/nodes/Discord/v2/helpers/utils.js.map +1 -1
  23. package/dist/nodes/Dropbox/__schema__/v1.0.0/file/download.json +31 -1
  24. package/dist/nodes/Dropcontact/__schema__/v1.0.0/contact/enrich.json +15 -1
  25. package/dist/nodes/Dropcontact/__schema__/v1.0.0/contact/fetchRequest.json +50 -0
  26. package/dist/nodes/EmailReadImap/v2/utils.js +16 -3
  27. package/dist/nodes/EmailReadImap/v2/utils.js.map +1 -1
  28. package/dist/nodes/EmailSend/__schema__/v2.1.0/email/send.json +1 -7
  29. package/dist/nodes/Evaluation/EvaluationTrigger/EvaluationTrigger.node.ee.js +1 -1
  30. package/dist/nodes/Evaluation/EvaluationTrigger/EvaluationTrigger.node.ee.js.map +1 -1
  31. package/dist/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js +2 -2
  32. package/dist/nodes/ExecuteWorkflow/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js.map +1 -1
  33. package/dist/nodes/Form/Form.node.js +3 -3
  34. package/dist/nodes/Form/Form.node.js.map +1 -1
  35. package/dist/nodes/Form/utils/formCompletionUtils.js.map +1 -0
  36. package/dist/nodes/Form/utils/formNodeUtils.js.map +1 -0
  37. package/dist/nodes/Form/{utils.js → utils/utils.js} +21 -7
  38. package/dist/nodes/Form/utils/utils.js.map +1 -0
  39. package/dist/nodes/Form/v1/FormTriggerV1.node.js +1 -1
  40. package/dist/nodes/Form/v1/FormTriggerV1.node.js.map +1 -1
  41. package/dist/nodes/Form/v2/FormTriggerV2.node.js +1 -1
  42. package/dist/nodes/Form/v2/FormTriggerV2.node.js.map +1 -1
  43. package/dist/nodes/Freshservice/GenericFunctions.js +12 -2
  44. package/dist/nodes/Freshservice/GenericFunctions.js.map +1 -1
  45. package/dist/nodes/Google/Ads/__schema__/v1.0.0/campaign/getAll.json +13 -1
  46. package/dist/nodes/Google/Analytics/__schema__/v2.0.0/report/get.json +1 -4
  47. package/dist/nodes/Google/Calendar/__schema__/v1.3.0/event/getAll.json +1 -4
  48. package/dist/nodes/Google/Chat/__schema__/v1.0.0/message/create.json +30 -1
  49. package/dist/nodes/Google/Drive/__schema__/v3.0.0/file/upload.json +4 -1
  50. package/dist/nodes/Google/Drive/test/v2/node/helpers.js +12 -2
  51. package/dist/nodes/Google/Drive/test/v2/node/helpers.js.map +1 -1
  52. package/dist/nodes/Google/Firebase/CloudFirestore/__schema__/v1.1.0/document/query.json +1 -7
  53. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/message/addLabels.json +13 -1
  54. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/message/get.json +1 -7
  55. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/message/markAsRead.json +13 -1
  56. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/thread/addLabels.json +16 -1
  57. package/dist/nodes/Google/Sheet/v2/actions/sheet/update.operation.js +10 -4
  58. package/dist/nodes/Google/Sheet/v2/actions/sheet/update.operation.js.map +1 -1
  59. package/dist/nodes/HaloPSA/__schema__/v1.0.0/ticket/getAll.json +1 -268
  60. package/dist/nodes/HttpRequest/shared/optimizeResponse.js +5 -3
  61. package/dist/nodes/HttpRequest/shared/optimizeResponse.js.map +1 -1
  62. package/dist/nodes/Hubspot/__schema__/v2.1.0/company/getAll.json +1 -4
  63. package/dist/nodes/Hubspot/__schema__/v2.1.0/deal/getAll.json +64 -1
  64. package/dist/nodes/Hubspot/__schema__/v2.1.0/deal/search.json +1 -4
  65. package/dist/nodes/Hubspot/__schema__/v2.1.0/ticket/get.json +1 -61
  66. package/dist/nodes/JinaAI/__schema__/v1.0.0/reader/read.json +26 -0
  67. package/dist/nodes/Jira/__schema__/v1.0.0/issue/get.json +604 -7
  68. package/dist/nodes/Jira/__schema__/v1.0.0/issue/getAll.json +1 -110
  69. package/dist/nodes/Lemlist/__schema__/v2.0.0/lead/create.json +1 -4
  70. package/dist/nodes/Lemlist/__schema__/v2.0.0/lead/get.json +30 -0
  71. package/dist/nodes/Line/__schema__/v1.0.0/notification/send.json +4 -7
  72. package/dist/nodes/Linear/__schema__/v1.0.0/issue/getAll.json +12 -1
  73. package/dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js +23 -3
  74. package/dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js.map +1 -1
  75. package/dist/nodes/Microsoft/Entra/__schema__/v1.0.0/user/getAll.json +1 -7
  76. package/dist/nodes/Microsoft/Entra/descriptions/GroupDescription.js +12 -2
  77. package/dist/nodes/Microsoft/Entra/descriptions/GroupDescription.js.map +1 -1
  78. package/dist/nodes/Microsoft/Entra/descriptions/UserDescription.js +13 -3
  79. package/dist/nodes/Microsoft/Entra/descriptions/UserDescription.js.map +1 -1
  80. package/dist/nodes/Microsoft/OneDrive/__schema__/v1.0.0/file/download.json +23 -10
  81. package/dist/nodes/Microsoft/OneDrive/__schema__/v1.0.0/folder/create.json +1 -15
  82. package/dist/nodes/Microsoft/Outlook/__schema__/v2.0.0/event/getAll.json +1 -4
  83. package/dist/nodes/Microsoft/Outlook/__schema__/v2.0.0/folderMessage/getAll.json +124 -1
  84. package/dist/nodes/Microsoft/Outlook/__schema__/v2.0.0/message/getAll.json +1 -56
  85. package/dist/nodes/Microsoft/Sql/MicrosoftSql.node.js +12 -2
  86. package/dist/nodes/Microsoft/Sql/MicrosoftSql.node.js.map +1 -1
  87. package/dist/nodes/Microsoft/Storage/__schema__/v1.0.0/blob/create.json +39 -0
  88. package/dist/nodes/Microsoft/Storage/__schema__/v1.0.0/blob/get.json +44 -0
  89. package/dist/nodes/Microsoft/ToDo/__schema__/v1.0.0/task/getAll.json +5 -21
  90. package/dist/nodes/N8n/WorkflowDescription.js +40 -0
  91. package/dist/nodes/N8n/WorkflowDescription.js.map +1 -1
  92. package/dist/nodes/Nasa/__schema__/v1.0.0/donkiSolarFlare/get.json +1 -4
  93. package/dist/nodes/Notion/__schema__/v2.2.0/database/get.json +2 -149
  94. package/dist/nodes/Odoo/__schema__/v1.0.0/contact/get.json +1 -4
  95. package/dist/nodes/Odoo/__schema__/v1.0.0/contact/getAll.json +1 -10
  96. package/dist/nodes/Odoo/__schema__/v1.0.0/opportunity/getAll.json +1 -40
  97. package/dist/nodes/OpenAi/__schema__/v1.1.0/chat/complete.json +29 -1
  98. package/dist/nodes/Pipedrive/__schema__/v1.0.0/person/search.json +7 -1
  99. package/dist/nodes/QuickBase/__schema__/v1.0.0/record/getAll.json +9 -0
  100. package/dist/nodes/QuickBooks/__schema__/v1.0.0/transaction/getReport.json +4 -1
  101. package/dist/nodes/RssFeedRead/RssFeedRead.node.js +9 -3
  102. package/dist/nodes/RssFeedRead/RssFeedRead.node.js.map +1 -1
  103. package/dist/nodes/S3/__schema__/v1.0.0/file/download.json +21 -0
  104. package/dist/nodes/Salesforce/__schema__/v1.0.0/customObject/getAll.json +1 -4
  105. package/dist/nodes/Salesforce/__schema__/v1.0.0/lead/getAll.json +1 -4
  106. package/dist/nodes/Salesforce/__schema__/v1.0.0/opportunity/getAll.json +1 -4
  107. package/dist/nodes/Salesforce/__schema__/v1.0.0/search/query.json +1 -4
  108. package/dist/nodes/Shopify/__schema__/v1.0.0/order/getAll.json +250 -3
  109. package/dist/nodes/Slack/__schema__/v2.3.0/channel/history.json +1 -50
  110. package/dist/nodes/Slack/__schema__/v2.3.0/channel/member.json +168 -2
  111. package/dist/nodes/Slack/__schema__/v2.3.0/message/post.json +1 -4
  112. package/dist/nodes/Sms77/__schema__/v1.0.0/sms/send.json +1 -10
  113. package/dist/nodes/Strapi/__schema__/v1.0.0/entry/getAll.json +10 -1
  114. package/dist/nodes/Telegram/__schema__/v1.2.0/chat/member.json +1 -4
  115. package/dist/nodes/Telegram/__schema__/v1.2.0/message/editMessageText.json +4 -1
  116. package/dist/nodes/Telegram/__schema__/v1.2.0/message/sendAndWait.json +14 -0
  117. package/dist/nodes/Telegram/__schema__/v1.2.0/message/sendMessage.json +4 -21
  118. package/dist/nodes/Telegram/__schema__/v1.2.0/message/sendPhoto.json +1 -7
  119. package/dist/nodes/Telegram/tests/Helpers.js +12 -2
  120. package/dist/nodes/Telegram/tests/Helpers.js.map +1 -1
  121. package/dist/nodes/Transform/RemoveDuplicates/utils.js +8 -6
  122. package/dist/nodes/Transform/RemoveDuplicates/utils.js.map +1 -1
  123. package/dist/nodes/Trello/__schema__/v1.0.0/list/getAll.json +1 -4
  124. package/dist/nodes/Trello/__schema__/v1.0.0/list/getCards.json +1 -4
  125. package/dist/nodes/Twitter/__schema__/v2.0.0/tweet/search.json +7 -1
  126. package/dist/nodes/Wait/Wait.node.js +1 -1
  127. package/dist/nodes/Wait/Wait.node.js.map +1 -1
  128. package/dist/nodes/Wordpress/__schema__/v1.0.0/post/get.json +1 -7
  129. package/dist/nodes/Zoho/__schema__/v1.0.0/contact/getAll.json +1 -4
  130. package/dist/nodes/Zoho/__schema__/v1.0.0/lead/getAll.json +99 -1
  131. package/dist/test/nodes/Helpers.js +12 -2
  132. package/dist/test/nodes/Helpers.js.map +1 -1
  133. package/dist/types/credentials.json +1 -1
  134. package/dist/types/nodes.json +13 -13
  135. package/dist/utils/binary.js +12 -9
  136. package/dist/utils/binary.js.map +1 -1
  137. package/dist/utils/sendAndWait/utils.js +21 -6
  138. package/dist/utils/sendAndWait/utils.js.map +1 -1
  139. package/dist/utils/utilities.js +31 -16
  140. package/dist/utils/utilities.js.map +1 -1
  141. package/dist/utils/workflowInputsResourceMapping/GenericFunctions.js +2 -2
  142. package/dist/utils/workflowInputsResourceMapping/GenericFunctions.js.map +1 -1
  143. package/package.json +9 -9
  144. package/dist/nodes/Form/formCompletionUtils.js.map +0 -1
  145. package/dist/nodes/Form/formNodeUtils.js.map +0 -1
  146. package/dist/nodes/Form/utils.js.map +0 -1
  147. /package/dist/nodes/Form/{formCompletionUtils.js → utils/formCompletionUtils.js} +0 -0
  148. /package/dist/nodes/Form/{formNodeUtils.js → utils/formNodeUtils.js} +0 -0
@@ -36,7 +36,6 @@ module.exports = __toCommonJS(binary_exports);
36
36
  var import_iconv_lite = __toESM(require("iconv-lite"));
37
37
  var import_get = __toESM(require("lodash/get"));
38
38
  var import_n8n_workflow = require("n8n-workflow");
39
- var import_pdfjs_dist = require("pdfjs-dist");
40
39
  var import_xlsx = require("xlsx");
41
40
  var import_utilities = require("./utilities");
42
41
  async function convertJsonToSpreadsheetBinary(items, fileFormat, options, defaultFileName = "spreadsheet") {
@@ -130,15 +129,19 @@ ${item.str}`);
130
129
  };
131
130
  async function extractDataFromPDF(binaryPropertyName, password, maxPages, joinPages = true, itemIndex = 0) {
132
131
  const binaryData = this.helpers.assertBinaryData(itemIndex, binaryPropertyName);
133
- const params = { password, isEvalSupported: false };
132
+ let buffer;
134
133
  if (binaryData.id) {
135
- params.data = await this.helpers.binaryToBuffer(
136
- await this.helpers.getBinaryStream(binaryData.id)
137
- );
134
+ const stream = await this.helpers.getBinaryStream(binaryData.id);
135
+ buffer = await this.helpers.binaryToBuffer(stream);
138
136
  } else {
139
- params.data = Buffer.from(binaryData.data, import_n8n_workflow.BINARY_ENCODING).buffer;
137
+ buffer = Buffer.from(binaryData.data, import_n8n_workflow.BINARY_ENCODING);
140
138
  }
141
- const document = await (0, import_pdfjs_dist.getDocument)(params).promise;
139
+ const { getDocument: readPDF, version: pdfJsVersion } = await import("pdfjs-dist/legacy/build/pdf.mjs");
140
+ const document = await readPDF({
141
+ password,
142
+ isEvalSupported: false,
143
+ data: new Uint8Array(buffer)
144
+ }).promise;
142
145
  const { info, metadata } = await document.getMetadata().catch(() => ({ info: null, metadata: null }));
143
146
  const pages = [];
144
147
  if (maxPages !== 0) {
@@ -157,9 +160,9 @@ async function extractDataFromPDF(binaryPropertyName, password, maxPages, joinPa
157
160
  numpages: document.numPages,
158
161
  numrender: document.numPages,
159
162
  info,
160
- metadata: metadata?.getAll(),
163
+ metadata: (metadata && Object.fromEntries([...metadata])) ?? void 0,
161
164
  text,
162
- version: import_pdfjs_dist.version
165
+ version: pdfJsVersion
163
166
  };
164
167
  return returnData;
165
168
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../utils/binary.ts"],"sourcesContent":["import iconv from 'iconv-lite';\nimport get from 'lodash/get';\nimport type { IBinaryData, IDataObject, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';\nimport { NodeOperationError, BINARY_ENCODING } from 'n8n-workflow';\nimport { getDocument as readPDF, version as pdfJsVersion } from 'pdfjs-dist';\nimport type { DocumentInitParameters } from 'pdfjs-dist/types/src/display/api';\nimport type { WorkBook, WritingOptions } from 'xlsx';\nimport { utils as xlsxUtils, write as xlsxWrite } from 'xlsx';\n\nimport { flattenObject } from '@utils/utilities';\n\nexport type JsonToSpreadsheetBinaryFormat = 'csv' | 'html' | 'rtf' | 'ods' | 'xls' | 'xlsx';\n\nexport type JsonToSpreadsheetBinaryOptions = {\n\theaderRow?: boolean;\n\tcompression?: boolean;\n\tfileName?: string;\n\tsheetName?: string;\n\tdelimiter?: string;\n};\n\nexport type JsonToBinaryOptions = {\n\tfileName?: string;\n\tsourceKey?: string;\n\tencoding?: string;\n\taddBOM?: boolean;\n\tmimeType?: string;\n\tdataIsBase64?: boolean;\n\titemIndex?: number;\n\tformat?: boolean;\n};\n\ntype PdfDocument = Awaited<ReturnType<Awaited<typeof readPDF>>['promise']>;\ntype PdfPage = Awaited<ReturnType<Awaited<PdfDocument['getPage']>>>;\ntype PdfTextContent = Awaited<ReturnType<PdfPage['getTextContent']>>;\n\nexport async function convertJsonToSpreadsheetBinary(\n\tthis: IExecuteFunctions,\n\titems: INodeExecutionData[],\n\tfileFormat: JsonToSpreadsheetBinaryFormat,\n\toptions: JsonToSpreadsheetBinaryOptions,\n\tdefaultFileName = 'spreadsheet',\n): Promise<IBinaryData> {\n\tconst itemData: IDataObject[] = [];\n\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\titemData.push(flattenObject(items[itemIndex].json));\n\t}\n\n\tlet sheetToJsonOptions;\n\tif (options.headerRow === false) {\n\t\tsheetToJsonOptions = { skipHeader: true };\n\t}\n\n\tconst sheet = xlsxUtils.json_to_sheet(itemData, sheetToJsonOptions);\n\n\tconst writingOptions: WritingOptions = {\n\t\tbookType: fileFormat,\n\t\tbookSST: false,\n\t\ttype: 'buffer',\n\t};\n\n\tif (fileFormat === 'csv' && options.delimiter?.length) {\n\t\twritingOptions.FS = options.delimiter ?? ',';\n\t}\n\n\tif (['xlsx', 'ods'].includes(fileFormat) && options.compression) {\n\t\twritingOptions.compression = true;\n\t}\n\n\t// Convert the data in the correct format\n\tconst sheetName = (options.sheetName as string) || 'Sheet';\n\tconst workbook: WorkBook = {\n\t\tSheetNames: [sheetName],\n\t\tSheets: {\n\t\t\t[sheetName]: sheet,\n\t\t},\n\t};\n\n\tconst buffer: Buffer = xlsxWrite(workbook, writingOptions);\n\tconst fileName =\n\t\toptions.fileName !== undefined ? options.fileName : `${defaultFileName}.${fileFormat}`;\n\tconst binaryData = await this.helpers.prepareBinaryData(buffer, fileName);\n\n\treturn binaryData;\n}\n\nexport async function createBinaryFromJson(\n\tthis: IExecuteFunctions,\n\tdata: IDataObject | IDataObject[],\n\toptions: JsonToBinaryOptions,\n): Promise<IBinaryData> {\n\tlet value;\n\tif (options.sourceKey) {\n\t\tvalue = get(data, options.sourceKey) as IDataObject;\n\t} else {\n\t\tvalue = data;\n\t}\n\n\tif (value === undefined) {\n\t\tthrow new NodeOperationError(this.getNode(), `The value in \"${options.sourceKey}\" is not set`, {\n\t\t\titemIndex: options.itemIndex || 0,\n\t\t});\n\t}\n\n\tlet buffer: Buffer;\n\tif (!options.dataIsBase64) {\n\t\tlet valueAsString = value as unknown as string;\n\n\t\tif (typeof value === 'object') {\n\t\t\toptions.mimeType = 'application/json';\n\t\t\tif (options.format) {\n\t\t\t\tvalueAsString = JSON.stringify(value, null, 2);\n\t\t\t} else {\n\t\t\t\tvalueAsString = JSON.stringify(value);\n\t\t\t}\n\t\t}\n\n\t\tbuffer = iconv.encode(valueAsString, options.encoding || 'utf8', {\n\t\t\taddBOM: options.addBOM,\n\t\t});\n\t} else {\n\t\tbuffer = Buffer.from(value as unknown as string, BINARY_ENCODING);\n\t}\n\n\tconst binaryData = await this.helpers.prepareBinaryData(\n\t\tbuffer,\n\t\toptions.fileName,\n\t\toptions.mimeType,\n\t);\n\n\tif (!binaryData.fileName) {\n\t\tconst fileExtension = binaryData.fileExtension ? `.${binaryData.fileExtension}` : '';\n\t\tbinaryData.fileName = `file${fileExtension}`;\n\t}\n\n\treturn binaryData;\n}\n\nconst parseText = (textContent: PdfTextContent) => {\n\tlet lastY = undefined;\n\tconst text = [];\n\tfor (const item of textContent.items) {\n\t\tif ('str' in item) {\n\t\t\tif (lastY == item.transform[5] || !lastY) {\n\t\t\t\ttext.push(item.str);\n\t\t\t} else {\n\t\t\t\ttext.push(`\\n${item.str}`);\n\t\t\t}\n\t\t\tlastY = item.transform[5];\n\t\t}\n\t}\n\treturn text.join('');\n};\n\nexport async function extractDataFromPDF(\n\tthis: IExecuteFunctions,\n\tbinaryPropertyName: string,\n\tpassword?: string,\n\tmaxPages?: number,\n\tjoinPages = true,\n\titemIndex = 0,\n) {\n\tconst binaryData = this.helpers.assertBinaryData(itemIndex, binaryPropertyName);\n\n\tconst params: DocumentInitParameters = { password, isEvalSupported: false };\n\n\tif (binaryData.id) {\n\t\tparams.data = await this.helpers.binaryToBuffer(\n\t\t\tawait this.helpers.getBinaryStream(binaryData.id),\n\t\t);\n\t} else {\n\t\tparams.data = Buffer.from(binaryData.data, BINARY_ENCODING).buffer;\n\t}\n\n\tconst document = await readPDF(params).promise;\n\tconst { info, metadata } = await document\n\t\t.getMetadata()\n\t\t.catch(() => ({ info: null, metadata: null }));\n\n\tconst pages = [];\n\tif (maxPages !== 0) {\n\t\tlet pagesToRead = document.numPages;\n\t\tif (maxPages && maxPages < document.numPages) {\n\t\t\tpagesToRead = maxPages;\n\t\t}\n\t\tfor (let i = 1; i <= pagesToRead; i++) {\n\t\t\tconst page = await document.getPage(i);\n\t\t\tconst text = await page.getTextContent().then(parseText);\n\t\t\tpages.push(text);\n\t\t}\n\t}\n\n\tconst text = joinPages ? pages.join('\\n\\n') : pages;\n\n\tconst returnData = {\n\t\tnumpages: document.numPages,\n\t\tnumrender: document.numPages,\n\t\tinfo,\n\t\tmetadata: metadata?.getAll(),\n\t\ttext,\n\t\tversion: pdfJsVersion,\n\t};\n\n\treturn returnData;\n}\n"],"mappings":"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","names":["xlsxUtils","xlsxWrite","get","iconv","readPDF","text","pdfJsVersion"]}
1
+ {"version":3,"sources":["../../utils/binary.ts"],"sourcesContent":["import iconv from 'iconv-lite';\nimport get from 'lodash/get';\nimport type { IBinaryData, IDataObject, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';\nimport { NodeOperationError, BINARY_ENCODING } from 'n8n-workflow';\nimport type { TextContent as PdfTextContent } from 'pdfjs-dist/types/src/display/api';\nimport type { WorkBook, WritingOptions } from 'xlsx';\nimport { utils as xlsxUtils, write as xlsxWrite } from 'xlsx';\n\nimport { flattenObject } from '@utils/utilities';\n\nexport type JsonToSpreadsheetBinaryFormat = 'csv' | 'html' | 'rtf' | 'ods' | 'xls' | 'xlsx';\n\nexport type JsonToSpreadsheetBinaryOptions = {\n\theaderRow?: boolean;\n\tcompression?: boolean;\n\tfileName?: string;\n\tsheetName?: string;\n\tdelimiter?: string;\n};\n\nexport type JsonToBinaryOptions = {\n\tfileName?: string;\n\tsourceKey?: string;\n\tencoding?: string;\n\taddBOM?: boolean;\n\tmimeType?: string;\n\tdataIsBase64?: boolean;\n\titemIndex?: number;\n\tformat?: boolean;\n};\n\nexport async function convertJsonToSpreadsheetBinary(\n\tthis: IExecuteFunctions,\n\titems: INodeExecutionData[],\n\tfileFormat: JsonToSpreadsheetBinaryFormat,\n\toptions: JsonToSpreadsheetBinaryOptions,\n\tdefaultFileName = 'spreadsheet',\n): Promise<IBinaryData> {\n\tconst itemData: IDataObject[] = [];\n\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\titemData.push(flattenObject(items[itemIndex].json));\n\t}\n\n\tlet sheetToJsonOptions;\n\tif (options.headerRow === false) {\n\t\tsheetToJsonOptions = { skipHeader: true };\n\t}\n\n\tconst sheet = xlsxUtils.json_to_sheet(itemData, sheetToJsonOptions);\n\n\tconst writingOptions: WritingOptions = {\n\t\tbookType: fileFormat,\n\t\tbookSST: false,\n\t\ttype: 'buffer',\n\t};\n\n\tif (fileFormat === 'csv' && options.delimiter?.length) {\n\t\twritingOptions.FS = options.delimiter ?? ',';\n\t}\n\n\tif (['xlsx', 'ods'].includes(fileFormat) && options.compression) {\n\t\twritingOptions.compression = true;\n\t}\n\n\t// Convert the data in the correct format\n\tconst sheetName = (options.sheetName as string) || 'Sheet';\n\tconst workbook: WorkBook = {\n\t\tSheetNames: [sheetName],\n\t\tSheets: {\n\t\t\t[sheetName]: sheet,\n\t\t},\n\t};\n\n\tconst buffer: Buffer = xlsxWrite(workbook, writingOptions);\n\tconst fileName =\n\t\toptions.fileName !== undefined ? options.fileName : `${defaultFileName}.${fileFormat}`;\n\tconst binaryData = await this.helpers.prepareBinaryData(buffer, fileName);\n\n\treturn binaryData;\n}\n\nexport async function createBinaryFromJson(\n\tthis: IExecuteFunctions,\n\tdata: IDataObject | IDataObject[],\n\toptions: JsonToBinaryOptions,\n): Promise<IBinaryData> {\n\tlet value;\n\tif (options.sourceKey) {\n\t\tvalue = get(data, options.sourceKey) as IDataObject;\n\t} else {\n\t\tvalue = data;\n\t}\n\n\tif (value === undefined) {\n\t\tthrow new NodeOperationError(this.getNode(), `The value in \"${options.sourceKey}\" is not set`, {\n\t\t\titemIndex: options.itemIndex || 0,\n\t\t});\n\t}\n\n\tlet buffer: Buffer;\n\tif (!options.dataIsBase64) {\n\t\tlet valueAsString = value as unknown as string;\n\n\t\tif (typeof value === 'object') {\n\t\t\toptions.mimeType = 'application/json';\n\t\t\tif (options.format) {\n\t\t\t\tvalueAsString = JSON.stringify(value, null, 2);\n\t\t\t} else {\n\t\t\t\tvalueAsString = JSON.stringify(value);\n\t\t\t}\n\t\t}\n\n\t\tbuffer = iconv.encode(valueAsString, options.encoding || 'utf8', {\n\t\t\taddBOM: options.addBOM,\n\t\t});\n\t} else {\n\t\tbuffer = Buffer.from(value as unknown as string, BINARY_ENCODING);\n\t}\n\n\tconst binaryData = await this.helpers.prepareBinaryData(\n\t\tbuffer,\n\t\toptions.fileName,\n\t\toptions.mimeType,\n\t);\n\n\tif (!binaryData.fileName) {\n\t\tconst fileExtension = binaryData.fileExtension ? `.${binaryData.fileExtension}` : '';\n\t\tbinaryData.fileName = `file${fileExtension}`;\n\t}\n\n\treturn binaryData;\n}\n\nconst parseText = (textContent: PdfTextContent) => {\n\tlet lastY = undefined;\n\tconst text = [];\n\tfor (const item of textContent.items) {\n\t\tif ('str' in item) {\n\t\t\tif (lastY == item.transform[5] || !lastY) {\n\t\t\t\ttext.push(item.str);\n\t\t\t} else {\n\t\t\t\ttext.push(`\\n${item.str}`);\n\t\t\t}\n\t\t\tlastY = item.transform[5];\n\t\t}\n\t}\n\treturn text.join('');\n};\n\nexport async function extractDataFromPDF(\n\tthis: IExecuteFunctions,\n\tbinaryPropertyName: string,\n\tpassword?: string,\n\tmaxPages?: number,\n\tjoinPages = true,\n\titemIndex = 0,\n) {\n\tconst binaryData = this.helpers.assertBinaryData(itemIndex, binaryPropertyName);\n\n\tlet buffer: Buffer;\n\tif (binaryData.id) {\n\t\tconst stream = await this.helpers.getBinaryStream(binaryData.id);\n\t\tbuffer = await this.helpers.binaryToBuffer(stream);\n\t} else {\n\t\tbuffer = Buffer.from(binaryData.data, BINARY_ENCODING);\n\t}\n\n\tconst { getDocument: readPDF, version: pdfJsVersion } = await import(\n\t\t'pdfjs-dist/legacy/build/pdf.mjs'\n\t);\n\tconst document = await readPDF({\n\t\tpassword,\n\t\tisEvalSupported: false,\n\t\tdata: new Uint8Array(buffer),\n\t}).promise;\n\tconst { info, metadata } = await document\n\t\t.getMetadata()\n\t\t.catch(() => ({ info: null, metadata: null }));\n\n\tconst pages = [];\n\tif (maxPages !== 0) {\n\t\tlet pagesToRead = document.numPages;\n\t\tif (maxPages && maxPages < document.numPages) {\n\t\t\tpagesToRead = maxPages;\n\t\t}\n\t\tfor (let i = 1; i <= pagesToRead; i++) {\n\t\t\tconst page = await document.getPage(i);\n\t\t\tconst text = await page.getTextContent().then(parseText);\n\t\t\tpages.push(text);\n\t\t}\n\t}\n\n\tconst text = joinPages ? pages.join('\\n\\n') : pages;\n\n\tconst returnData = {\n\t\tnumpages: document.numPages,\n\t\tnumrender: document.numPages,\n\t\tinfo,\n\t\tmetadata: (metadata && Object.fromEntries([...metadata])) ?? undefined,\n\t\ttext,\n\t\tversion: pdfJsVersion,\n\t};\n\n\treturn returnData;\n}\n"],"mappings":"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","names":["xlsxUtils","xlsxWrite","get","iconv","text"]}
@@ -39,8 +39,9 @@ var import_isbot = __toESM(require("isbot"));
39
39
  var import_n8n_workflow = require("n8n-workflow");
40
40
  var import_descriptions = require("./descriptions");
41
41
  var import_email_templates = require("./email-templates");
42
+ var import_cssVariables = require("../../nodes/Form/cssVariables");
42
43
  var import_Form = require("../../nodes/Form/Form.node");
43
- var import_utils = require("../../nodes/Form/utils");
44
+ var import_utils = require("../../nodes/Form/utils/utils");
44
45
  var import_utilities = require("../utilities");
45
46
  const INPUT_FIELD_IDENTIFIER = "field-0";
46
47
  const limitWaitTimeOption = {
@@ -263,6 +264,17 @@ function getSendAndWaitProperties(targetProperties, resource = "message", additi
263
264
  type: "string",
264
265
  default: "Submit"
265
266
  },
267
+ {
268
+ displayName: "Response Form Custom Styling",
269
+ name: "responseFormCustomCss",
270
+ type: "string",
271
+ typeOptions: {
272
+ rows: 10,
273
+ editor: "cssEditor"
274
+ },
275
+ default: import_cssVariables.cssVariables.trim(),
276
+ description: "Override default styling of the response form with CSS"
277
+ },
266
278
  limitWaitTimeOption,
267
279
  appendAttributionOption
268
280
  ],
@@ -303,7 +315,8 @@ const getFormResponseCustomizations = (context) => {
303
315
  return {
304
316
  formTitle,
305
317
  formDescription,
306
- buttonLabel
318
+ buttonLabel,
319
+ customCss: options.responseFormCustomCss
307
320
  };
308
321
  };
309
322
  async function sendAndWaitWebhook() {
@@ -317,7 +330,7 @@ async function sendAndWaitWebhook() {
317
330
  }
318
331
  if (responseType === "freeText") {
319
332
  if (method === "GET") {
320
- const { formTitle, formDescription, buttonLabel } = getFormResponseCustomizations(this);
333
+ const { formTitle, formDescription, buttonLabel, customCss } = getFormResponseCustomizations(this);
321
334
  const data = (0, import_utils.prepareFormData)({
322
335
  formTitle,
323
336
  formDescription,
@@ -333,7 +346,8 @@ async function sendAndWaitWebhook() {
333
346
  }
334
347
  ],
335
348
  testRun: false,
336
- query: {}
349
+ query: {},
350
+ customCss
337
351
  });
338
352
  res.render("form-trigger", data);
339
353
  return {
@@ -366,7 +380,7 @@ async function sendAndWaitWebhook() {
366
380
  fields = this.getNodeParameter("formFields.values", []);
367
381
  }
368
382
  if (method === "GET") {
369
- const { formTitle, formDescription, buttonLabel } = getFormResponseCustomizations(this);
383
+ const { formTitle, formDescription, buttonLabel, customCss } = getFormResponseCustomizations(this);
370
384
  const data = (0, import_utils.prepareFormData)({
371
385
  formTitle,
372
386
  formDescription,
@@ -376,7 +390,8 @@ async function sendAndWaitWebhook() {
376
390
  redirectUrl: void 0,
377
391
  formFields: fields,
378
392
  testRun: false,
379
- query: {}
393
+ query: {},
394
+ customCss
380
395
  });
381
396
  res.render("form-trigger", data);
382
397
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../utils/sendAndWait/utils.ts"],"sourcesContent":["import isbot from 'isbot';\nimport {\n\tNodeOperationError,\n\tSEND_AND_WAIT_OPERATION,\n\ttryToParseJsonToFormFields,\n\tupdateDisplayOptions,\n} from 'n8n-workflow';\nimport type {\n\tINodeProperties,\n\tIExecuteFunctions,\n\tIWebhookFunctions,\n\tIDataObject,\n\tFormFieldsParameter,\n} from 'n8n-workflow';\n\nimport { limitWaitTimeProperties } from './descriptions';\nimport {\n\tACTION_RECORDED_PAGE,\n\tBUTTON_STYLE_PRIMARY,\n\tBUTTON_STYLE_SECONDARY,\n\tcreateEmailBodyWithN8nAttribution,\n\tcreateEmailBodyWithoutN8nAttribution,\n} from './email-templates';\nimport type { IEmail } from './interfaces';\nimport { formFieldsProperties } from '../../nodes/Form/Form.node';\nimport { prepareFormData, prepareFormReturnItem, resolveRawData } from '../../nodes/Form/utils';\nimport { escapeHtml } from '../utilities';\n\nexport type SendAndWaitConfig = {\n\ttitle: string;\n\tmessage: string;\n\turl: string;\n\toptions: Array<{ label: string; value: string; style: string }>;\n\tappendAttribution?: boolean;\n};\n\ntype FormResponseTypeOptions = {\n\tmessageButtonLabel?: string;\n\tresponseFormTitle?: string;\n\tresponseFormDescription?: string;\n\tresponseFormButtonLabel?: string;\n};\n\nconst INPUT_FIELD_IDENTIFIER = 'field-0';\n\nconst limitWaitTimeOption: INodeProperties = {\n\tdisplayName: 'Limit Wait Time',\n\tname: 'limitWaitTime',\n\ttype: 'fixedCollection',\n\tdescription:\n\t\t'Whether the workflow will automatically resume execution after the specified limit type',\n\tdefault: { values: { limitType: 'afterTimeInterval', resumeAmount: 45, resumeUnit: 'minutes' } },\n\toptions: [\n\t\t{\n\t\t\tdisplayName: 'Values',\n\t\t\tname: 'values',\n\t\t\tvalues: limitWaitTimeProperties,\n\t\t},\n\t],\n};\n\nconst appendAttributionOption: INodeProperties = {\n\tdisplayName: 'Append n8n Attribution',\n\tname: 'appendAttribution',\n\ttype: 'boolean',\n\tdefault: true,\n\tdescription:\n\t\t'Whether to include the phrase \"This message was sent automatically with n8n\" to the end of the message',\n};\n\n// Operation Properties ----------------------------------------------------------\nexport function getSendAndWaitProperties(\n\ttargetProperties: INodeProperties[],\n\tresource: string = 'message',\n\tadditionalProperties: INodeProperties[] = [],\n\toptions?: {\n\t\tnoButtonStyle?: boolean;\n\t\tdefaultApproveLabel?: string;\n\t\tdefaultDisapproveLabel?: string;\n\t},\n) {\n\tconst buttonStyle: INodeProperties = {\n\t\tdisplayName: 'Button Style',\n\t\tname: 'buttonStyle',\n\t\ttype: 'options',\n\t\tdefault: 'primary',\n\t\toptions: [\n\t\t\t{\n\t\t\t\tname: 'Primary',\n\t\t\t\tvalue: 'primary',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Secondary',\n\t\t\t\tvalue: 'secondary',\n\t\t\t},\n\t\t],\n\t};\n\tconst approvalOptionsValues = [\n\t\t{\n\t\t\tdisplayName: 'Type of Approval',\n\t\t\tname: 'approvalType',\n\t\t\ttype: 'options',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: 'single',\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Approve Only',\n\t\t\t\t\tvalue: 'single',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Approve and Disapprove',\n\t\t\t\t\tvalue: 'double',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Approve Button Label',\n\t\t\tname: 'approveLabel',\n\t\t\ttype: 'string',\n\t\t\tdefault: options?.defaultApproveLabel || 'Approve',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tapprovalType: ['single', 'double'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t...[\n\t\t\toptions?.noButtonStyle\n\t\t\t\t? ({} as INodeProperties)\n\t\t\t\t: {\n\t\t\t\t\t\t...buttonStyle,\n\t\t\t\t\t\tdisplayName: 'Approve Button Style',\n\t\t\t\t\t\tname: 'buttonApprovalStyle',\n\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\tapprovalType: ['single', 'double'],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t],\n\t\t{\n\t\t\tdisplayName: 'Disapprove Button Label',\n\t\t\tname: 'disapproveLabel',\n\t\t\ttype: 'string',\n\t\t\tdefault: options?.defaultDisapproveLabel || 'Decline',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tapprovalType: ['double'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t...[\n\t\t\toptions?.noButtonStyle\n\t\t\t\t? ({} as INodeProperties)\n\t\t\t\t: {\n\t\t\t\t\t\t...buttonStyle,\n\t\t\t\t\t\tdisplayName: 'Disapprove Button Style',\n\t\t\t\t\t\tname: 'buttonDisapprovalStyle',\n\t\t\t\t\t\tdefault: 'secondary',\n\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\tapprovalType: ['double'],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t],\n\t].filter((p) => Object.keys(p).length) as INodeProperties[];\n\n\tconst sendAndWait: INodeProperties[] = [\n\t\t...targetProperties,\n\t\t{\n\t\t\tdisplayName: 'Subject',\n\t\t\tname: 'subject',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\tplaceholder: 'e.g. Approval required',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Message',\n\t\t\tname: 'message',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\ttypeOptions: {\n\t\t\t\trows: 4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Response Type',\n\t\t\tname: 'responseType',\n\t\t\ttype: 'options',\n\t\t\tdefault: 'approval',\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Approval',\n\t\t\t\t\tvalue: 'approval',\n\t\t\t\t\tdescription: 'User can approve/disapprove from within the message',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Free Text',\n\t\t\t\t\tvalue: 'freeText',\n\t\t\t\t\tdescription: 'User can submit a response via a form',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Custom Form',\n\t\t\t\t\tvalue: 'customForm',\n\t\t\t\t\tdescription: 'User can submit a response via a custom form',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t...updateDisplayOptions(\n\t\t\t{\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['customForm'],\n\t\t\t\t},\n\t\t\t},\n\t\t\tformFieldsProperties,\n\t\t),\n\n\t\t{\n\t\t\tdisplayName: 'Approval Options',\n\t\t\tname: 'approvalOptions',\n\t\t\ttype: 'fixedCollection',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: {},\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Values',\n\t\t\t\t\tname: 'values',\n\t\t\t\t\tvalues: approvalOptionsValues,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['approval'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Options',\n\t\t\tname: 'options',\n\t\t\ttype: 'collection',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: {},\n\t\t\toptions: [limitWaitTimeOption, appendAttributionOption],\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['approval'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Options',\n\t\t\tname: 'options',\n\t\t\ttype: 'collection',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: {},\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Message Button Label',\n\t\t\t\t\tname: 'messageButtonLabel',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: 'Respond',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Title',\n\t\t\t\t\tname: 'responseFormTitle',\n\t\t\t\t\tdescription: 'Title of the form that the user can access to provide their response',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: '',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Description',\n\t\t\t\t\tname: 'responseFormDescription',\n\t\t\t\t\tdescription: 'Description of the form that the user can access to provide their response',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: '',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Button Label',\n\t\t\t\t\tname: 'responseFormButtonLabel',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: 'Submit',\n\t\t\t\t},\n\t\t\t\tlimitWaitTimeOption,\n\t\t\t\tappendAttributionOption,\n\t\t\t],\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['freeText', 'customForm'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t...additionalProperties,\n\t];\n\n\treturn updateDisplayOptions(\n\t\t{\n\t\t\tshow: {\n\t\t\t\tresource: [resource],\n\t\t\t\toperation: [SEND_AND_WAIT_OPERATION],\n\t\t\t},\n\t\t},\n\t\tsendAndWait,\n\t);\n}\n\n// Webhook Function --------------------------------------------------------------\nconst getFormResponseCustomizations = (context: IWebhookFunctions) => {\n\tconst message = context.getNodeParameter('message', '') as string;\n\tconst options = context.getNodeParameter('options', {}) as FormResponseTypeOptions;\n\n\tlet formTitle = '';\n\tif (options.responseFormTitle) {\n\t\tformTitle = options.responseFormTitle;\n\t}\n\n\tlet formDescription = message;\n\tif (options.responseFormDescription) {\n\t\tformDescription = options.responseFormDescription;\n\t}\n\tformDescription = formDescription.replace(/\\\\n/g, '\\n').replace(/<br>/g, '\\n');\n\n\tlet buttonLabel = 'Submit';\n\tif (options.responseFormButtonLabel) {\n\t\tbuttonLabel = options.responseFormButtonLabel;\n\t}\n\n\treturn {\n\t\tformTitle,\n\t\tformDescription,\n\t\tbuttonLabel,\n\t};\n};\n\nexport async function sendAndWaitWebhook(this: IWebhookFunctions) {\n\tconst method = this.getRequestObject().method;\n\tconst res = this.getResponseObject();\n\tconst req = this.getRequestObject();\n\n\tconst responseType = this.getNodeParameter('responseType', 'approval') as\n\t\t| 'approval'\n\t\t| 'freeText'\n\t\t| 'customForm';\n\n\tif (responseType === 'approval' && isbot(req.headers['user-agent'])) {\n\t\tres.send('');\n\t\treturn { noWebhookResponse: true };\n\t}\n\n\tif (responseType === 'freeText') {\n\t\tif (method === 'GET') {\n\t\t\tconst { formTitle, formDescription, buttonLabel } = getFormResponseCustomizations(this);\n\n\t\t\tconst data = prepareFormData({\n\t\t\t\tformTitle,\n\t\t\t\tformDescription,\n\t\t\t\tformSubmittedHeader: 'Got it, thanks',\n\t\t\t\tformSubmittedText: 'This page can be closed now',\n\t\t\t\tbuttonLabel,\n\t\t\t\tredirectUrl: undefined,\n\t\t\t\tformFields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfieldLabel: 'Response',\n\t\t\t\t\t\tfieldType: 'textarea',\n\t\t\t\t\t\trequiredField: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\ttestRun: false,\n\t\t\t\tquery: {},\n\t\t\t});\n\n\t\t\tres.render('form-trigger', data);\n\n\t\t\treturn {\n\t\t\t\tnoWebhookResponse: true,\n\t\t\t};\n\t\t}\n\t\tif (method === 'POST') {\n\t\t\tconst data = this.getBodyData().data as IDataObject;\n\n\t\t\treturn {\n\t\t\t\twebhookResponse: ACTION_RECORDED_PAGE,\n\t\t\t\tworkflowData: [[{ json: { data: { text: data[INPUT_FIELD_IDENTIFIER] } } }]],\n\t\t\t};\n\t\t}\n\t}\n\n\tif (responseType === 'customForm') {\n\t\tconst defineForm = this.getNodeParameter('defineForm', 'fields') as 'fields' | 'json';\n\t\tlet fields: FormFieldsParameter = [];\n\n\t\tif (defineForm === 'json') {\n\t\t\ttry {\n\t\t\t\tconst jsonOutput = this.getNodeParameter('jsonOutput', '', {\n\t\t\t\t\trawExpressions: true,\n\t\t\t\t}) as string;\n\n\t\t\t\tfields = tryToParseJsonToFormFields(resolveRawData(this, jsonOutput));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeOperationError(this.getNode(), error.message, {\n\t\t\t\t\tdescription: error.message,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tfields = this.getNodeParameter('formFields.values', []) as FormFieldsParameter;\n\t\t}\n\n\t\tif (method === 'GET') {\n\t\t\tconst { formTitle, formDescription, buttonLabel } = getFormResponseCustomizations(this);\n\n\t\t\tconst data = prepareFormData({\n\t\t\t\tformTitle,\n\t\t\t\tformDescription,\n\t\t\t\tformSubmittedHeader: 'Got it, thanks',\n\t\t\t\tformSubmittedText: 'This page can be closed now',\n\t\t\t\tbuttonLabel,\n\t\t\t\tredirectUrl: undefined,\n\t\t\t\tformFields: fields,\n\t\t\t\ttestRun: false,\n\t\t\t\tquery: {},\n\t\t\t});\n\n\t\t\tres.render('form-trigger', data);\n\n\t\t\treturn {\n\t\t\t\tnoWebhookResponse: true,\n\t\t\t};\n\t\t}\n\t\tif (method === 'POST') {\n\t\t\tconst returnItem = await prepareFormReturnItem(this, fields, 'production', true);\n\t\t\tconst json = returnItem.json;\n\n\t\t\tdelete json.submittedAt;\n\t\t\tdelete json.formMode;\n\n\t\t\treturnItem.json = { data: json };\n\n\t\t\treturn {\n\t\t\t\twebhookResponse: ACTION_RECORDED_PAGE,\n\t\t\t\tworkflowData: [[returnItem]],\n\t\t\t};\n\t\t}\n\t}\n\n\tconst query = req.query as { approved: 'false' | 'true' };\n\tconst approved = query.approved === 'true';\n\treturn {\n\t\twebhookResponse: ACTION_RECORDED_PAGE,\n\t\tworkflowData: [[{ json: { data: { approved } } }]],\n\t};\n}\n\n// Send and Wait Config -----------------------------------------------------------\nexport function getSendAndWaitConfig(context: IExecuteFunctions): SendAndWaitConfig {\n\tconst message = escapeHtml((context.getNodeParameter('message', 0, '') as string).trim())\n\t\t.replace(/\\\\n/g, '\\n')\n\t\t.replace(/<br>/g, '\\n');\n\tconst subject = escapeHtml(context.getNodeParameter('subject', 0, '') as string);\n\tconst resumeUrl = context.evaluateExpression('{{ $execution?.resumeUrl }}', 0) as string;\n\tconst nodeId = context.evaluateExpression('{{ $nodeId }}', 0) as string;\n\tconst approvalOptions = context.getNodeParameter('approvalOptions.values', 0, {}) as {\n\t\tapprovalType?: 'single' | 'double';\n\t\tapproveLabel?: string;\n\t\tbuttonApprovalStyle?: string;\n\t\tdisapproveLabel?: string;\n\t\tbuttonDisapprovalStyle?: string;\n\t};\n\n\tconst options = context.getNodeParameter('options', 0, {});\n\n\tconst config: SendAndWaitConfig = {\n\t\ttitle: subject,\n\t\tmessage,\n\t\turl: `${resumeUrl}/${nodeId}`,\n\t\toptions: [],\n\t\tappendAttribution: options?.appendAttribution as boolean,\n\t};\n\n\tconst responseType = context.getNodeParameter('responseType', 0, 'approval') as string;\n\n\tif (responseType === 'freeText' || responseType === 'customForm') {\n\t\tconst label = context.getNodeParameter('options.messageButtonLabel', 0, 'Respond') as string;\n\t\tconfig.options.push({\n\t\t\tlabel,\n\t\t\tvalue: 'true',\n\t\t\tstyle: 'primary',\n\t\t});\n\t} else if (approvalOptions.approvalType === 'double') {\n\t\tconst approveLabel = escapeHtml(approvalOptions.approveLabel || 'Approve');\n\t\tconst buttonApprovalStyle = approvalOptions.buttonApprovalStyle || 'primary';\n\t\tconst disapproveLabel = escapeHtml(approvalOptions.disapproveLabel || 'Disapprove');\n\t\tconst buttonDisapprovalStyle = approvalOptions.buttonDisapprovalStyle || 'secondary';\n\n\t\tconfig.options.push({\n\t\t\tlabel: disapproveLabel,\n\t\t\tvalue: 'false',\n\t\t\tstyle: buttonDisapprovalStyle,\n\t\t});\n\t\tconfig.options.push({\n\t\t\tlabel: approveLabel,\n\t\t\tvalue: 'true',\n\t\t\tstyle: buttonApprovalStyle,\n\t\t});\n\t} else {\n\t\tconst label = escapeHtml(approvalOptions.approveLabel || 'Approve');\n\t\tconst style = approvalOptions.buttonApprovalStyle || 'primary';\n\t\tconfig.options.push({\n\t\t\tlabel,\n\t\t\tvalue: 'true',\n\t\t\tstyle,\n\t\t});\n\t}\n\n\treturn config;\n}\n\nexport function createButton(url: string, label: string, approved: string, style: string) {\n\tlet buttonStyle = BUTTON_STYLE_PRIMARY;\n\tif (style === 'secondary') {\n\t\tbuttonStyle = BUTTON_STYLE_SECONDARY;\n\t}\n\treturn `<a href=\"${url}?approved=${approved}\" target=\"_blank\" style=\"${buttonStyle}\">${label}</a>`;\n}\n\nexport function createEmail(context: IExecuteFunctions) {\n\tconst to = (context.getNodeParameter('sendTo', 0, '') as string).trim();\n\tconst config = getSendAndWaitConfig(context);\n\n\tif (to.indexOf('@') === -1 || (to.match(/@/g) || []).length > 1) {\n\t\tconst description = `The email address '${to}' in the 'To' field isn't valid or contains multiple addresses. Please provide only a single email address.`;\n\t\tthrow new NodeOperationError(context.getNode(), 'Invalid email address', {\n\t\t\tdescription,\n\t\t\titemIndex: 0,\n\t\t});\n\t}\n\n\tconst buttons: string[] = [];\n\tfor (const option of config.options) {\n\t\tbuttons.push(createButton(config.url, option.label, option.value, option.style));\n\t}\n\tlet emailBody: string;\n\tif (config.appendAttribution !== false) {\n\t\tconst instanceId = context.getInstanceId();\n\t\temailBody = createEmailBodyWithN8nAttribution(config.message, buttons.join('\\n'), instanceId);\n\t} else {\n\t\temailBody = createEmailBodyWithoutN8nAttribution(config.message, buttons.join('\\n'));\n\t}\n\n\tconst email: IEmail = {\n\t\tto,\n\t\tsubject: config.title,\n\t\tbody: '',\n\t\thtmlBody: emailBody,\n\t};\n\n\treturn email;\n}\n"],"mappings":"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","names":["isbot"]}
1
+ {"version":3,"sources":["../../../utils/sendAndWait/utils.ts"],"sourcesContent":["import isbot from 'isbot';\nimport {\n\tNodeOperationError,\n\tSEND_AND_WAIT_OPERATION,\n\ttryToParseJsonToFormFields,\n\tupdateDisplayOptions,\n} from 'n8n-workflow';\nimport type {\n\tINodeProperties,\n\tIExecuteFunctions,\n\tIWebhookFunctions,\n\tIDataObject,\n\tFormFieldsParameter,\n} from 'n8n-workflow';\n\nimport { limitWaitTimeProperties } from './descriptions';\nimport {\n\tACTION_RECORDED_PAGE,\n\tBUTTON_STYLE_PRIMARY,\n\tBUTTON_STYLE_SECONDARY,\n\tcreateEmailBodyWithN8nAttribution,\n\tcreateEmailBodyWithoutN8nAttribution,\n} from './email-templates';\nimport type { IEmail } from './interfaces';\nimport { cssVariables } from '../../nodes/Form/cssVariables';\nimport { formFieldsProperties } from '../../nodes/Form/Form.node';\nimport {\n\tprepareFormData,\n\tprepareFormReturnItem,\n\tresolveRawData,\n} from '../../nodes/Form/utils/utils';\nimport { escapeHtml } from '../utilities';\n\nexport type SendAndWaitConfig = {\n\ttitle: string;\n\tmessage: string;\n\turl: string;\n\toptions: Array<{ label: string; value: string; style: string }>;\n\tappendAttribution?: boolean;\n};\n\ntype FormResponseTypeOptions = {\n\tmessageButtonLabel?: string;\n\tresponseFormTitle?: string;\n\tresponseFormDescription?: string;\n\tresponseFormButtonLabel?: string;\n\tresponseFormCustomCss?: string;\n};\n\nconst INPUT_FIELD_IDENTIFIER = 'field-0';\n\nconst limitWaitTimeOption: INodeProperties = {\n\tdisplayName: 'Limit Wait Time',\n\tname: 'limitWaitTime',\n\ttype: 'fixedCollection',\n\tdescription:\n\t\t'Whether the workflow will automatically resume execution after the specified limit type',\n\tdefault: { values: { limitType: 'afterTimeInterval', resumeAmount: 45, resumeUnit: 'minutes' } },\n\toptions: [\n\t\t{\n\t\t\tdisplayName: 'Values',\n\t\t\tname: 'values',\n\t\t\tvalues: limitWaitTimeProperties,\n\t\t},\n\t],\n};\n\nconst appendAttributionOption: INodeProperties = {\n\tdisplayName: 'Append n8n Attribution',\n\tname: 'appendAttribution',\n\ttype: 'boolean',\n\tdefault: true,\n\tdescription:\n\t\t'Whether to include the phrase \"This message was sent automatically with n8n\" to the end of the message',\n};\n\n// Operation Properties ----------------------------------------------------------\nexport function getSendAndWaitProperties(\n\ttargetProperties: INodeProperties[],\n\tresource: string = 'message',\n\tadditionalProperties: INodeProperties[] = [],\n\toptions?: {\n\t\tnoButtonStyle?: boolean;\n\t\tdefaultApproveLabel?: string;\n\t\tdefaultDisapproveLabel?: string;\n\t},\n) {\n\tconst buttonStyle: INodeProperties = {\n\t\tdisplayName: 'Button Style',\n\t\tname: 'buttonStyle',\n\t\ttype: 'options',\n\t\tdefault: 'primary',\n\t\toptions: [\n\t\t\t{\n\t\t\t\tname: 'Primary',\n\t\t\t\tvalue: 'primary',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Secondary',\n\t\t\t\tvalue: 'secondary',\n\t\t\t},\n\t\t],\n\t};\n\tconst approvalOptionsValues = [\n\t\t{\n\t\t\tdisplayName: 'Type of Approval',\n\t\t\tname: 'approvalType',\n\t\t\ttype: 'options',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: 'single',\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Approve Only',\n\t\t\t\t\tvalue: 'single',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Approve and Disapprove',\n\t\t\t\t\tvalue: 'double',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Approve Button Label',\n\t\t\tname: 'approveLabel',\n\t\t\ttype: 'string',\n\t\t\tdefault: options?.defaultApproveLabel || 'Approve',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tapprovalType: ['single', 'double'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t...[\n\t\t\toptions?.noButtonStyle\n\t\t\t\t? ({} as INodeProperties)\n\t\t\t\t: {\n\t\t\t\t\t\t...buttonStyle,\n\t\t\t\t\t\tdisplayName: 'Approve Button Style',\n\t\t\t\t\t\tname: 'buttonApprovalStyle',\n\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\tapprovalType: ['single', 'double'],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t],\n\t\t{\n\t\t\tdisplayName: 'Disapprove Button Label',\n\t\t\tname: 'disapproveLabel',\n\t\t\ttype: 'string',\n\t\t\tdefault: options?.defaultDisapproveLabel || 'Decline',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tapprovalType: ['double'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t...[\n\t\t\toptions?.noButtonStyle\n\t\t\t\t? ({} as INodeProperties)\n\t\t\t\t: {\n\t\t\t\t\t\t...buttonStyle,\n\t\t\t\t\t\tdisplayName: 'Disapprove Button Style',\n\t\t\t\t\t\tname: 'buttonDisapprovalStyle',\n\t\t\t\t\t\tdefault: 'secondary',\n\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\tapprovalType: ['double'],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t],\n\t].filter((p) => Object.keys(p).length) as INodeProperties[];\n\n\tconst sendAndWait: INodeProperties[] = [\n\t\t...targetProperties,\n\t\t{\n\t\t\tdisplayName: 'Subject',\n\t\t\tname: 'subject',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\tplaceholder: 'e.g. Approval required',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Message',\n\t\t\tname: 'message',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\ttypeOptions: {\n\t\t\t\trows: 4,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Response Type',\n\t\t\tname: 'responseType',\n\t\t\ttype: 'options',\n\t\t\tdefault: 'approval',\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Approval',\n\t\t\t\t\tvalue: 'approval',\n\t\t\t\t\tdescription: 'User can approve/disapprove from within the message',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Free Text',\n\t\t\t\t\tvalue: 'freeText',\n\t\t\t\t\tdescription: 'User can submit a response via a form',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Custom Form',\n\t\t\t\t\tvalue: 'customForm',\n\t\t\t\t\tdescription: 'User can submit a response via a custom form',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t...updateDisplayOptions(\n\t\t\t{\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['customForm'],\n\t\t\t\t},\n\t\t\t},\n\t\t\tformFieldsProperties,\n\t\t),\n\n\t\t{\n\t\t\tdisplayName: 'Approval Options',\n\t\t\tname: 'approvalOptions',\n\t\t\ttype: 'fixedCollection',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: {},\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Values',\n\t\t\t\t\tname: 'values',\n\t\t\t\t\tvalues: approvalOptionsValues,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['approval'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Options',\n\t\t\tname: 'options',\n\t\t\ttype: 'collection',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: {},\n\t\t\toptions: [limitWaitTimeOption, appendAttributionOption],\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['approval'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Options',\n\t\t\tname: 'options',\n\t\t\ttype: 'collection',\n\t\t\tplaceholder: 'Add option',\n\t\t\tdefault: {},\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Message Button Label',\n\t\t\t\t\tname: 'messageButtonLabel',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: 'Respond',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Title',\n\t\t\t\t\tname: 'responseFormTitle',\n\t\t\t\t\tdescription: 'Title of the form that the user can access to provide their response',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: '',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Description',\n\t\t\t\t\tname: 'responseFormDescription',\n\t\t\t\t\tdescription: 'Description of the form that the user can access to provide their response',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: '',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Button Label',\n\t\t\t\t\tname: 'responseFormButtonLabel',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tdefault: 'Submit',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdisplayName: 'Response Form Custom Styling',\n\t\t\t\t\tname: 'responseFormCustomCss',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\trows: 10,\n\t\t\t\t\t\teditor: 'cssEditor',\n\t\t\t\t\t},\n\t\t\t\t\tdefault: cssVariables.trim(),\n\t\t\t\t\tdescription: 'Override default styling of the response form with CSS',\n\t\t\t\t},\n\t\t\t\tlimitWaitTimeOption,\n\t\t\t\tappendAttributionOption,\n\t\t\t],\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tresponseType: ['freeText', 'customForm'],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t...additionalProperties,\n\t];\n\n\treturn updateDisplayOptions(\n\t\t{\n\t\t\tshow: {\n\t\t\t\tresource: [resource],\n\t\t\t\toperation: [SEND_AND_WAIT_OPERATION],\n\t\t\t},\n\t\t},\n\t\tsendAndWait,\n\t);\n}\n\n// Webhook Function --------------------------------------------------------------\nconst getFormResponseCustomizations = (context: IWebhookFunctions) => {\n\tconst message = context.getNodeParameter('message', '') as string;\n\tconst options = context.getNodeParameter('options', {}) as FormResponseTypeOptions;\n\n\tlet formTitle = '';\n\tif (options.responseFormTitle) {\n\t\tformTitle = options.responseFormTitle;\n\t}\n\n\tlet formDescription = message;\n\tif (options.responseFormDescription) {\n\t\tformDescription = options.responseFormDescription;\n\t}\n\tformDescription = formDescription.replace(/\\\\n/g, '\\n').replace(/<br>/g, '\\n');\n\n\tlet buttonLabel = 'Submit';\n\tif (options.responseFormButtonLabel) {\n\t\tbuttonLabel = options.responseFormButtonLabel;\n\t}\n\n\treturn {\n\t\tformTitle,\n\t\tformDescription,\n\t\tbuttonLabel,\n\t\tcustomCss: options.responseFormCustomCss,\n\t};\n};\n\nexport async function sendAndWaitWebhook(this: IWebhookFunctions) {\n\tconst method = this.getRequestObject().method;\n\tconst res = this.getResponseObject();\n\tconst req = this.getRequestObject();\n\n\tconst responseType = this.getNodeParameter('responseType', 'approval') as\n\t\t| 'approval'\n\t\t| 'freeText'\n\t\t| 'customForm';\n\n\tif (responseType === 'approval' && isbot(req.headers['user-agent'])) {\n\t\tres.send('');\n\t\treturn { noWebhookResponse: true };\n\t}\n\n\tif (responseType === 'freeText') {\n\t\tif (method === 'GET') {\n\t\t\tconst { formTitle, formDescription, buttonLabel, customCss } =\n\t\t\t\tgetFormResponseCustomizations(this);\n\n\t\t\tconst data = prepareFormData({\n\t\t\t\tformTitle,\n\t\t\t\tformDescription,\n\t\t\t\tformSubmittedHeader: 'Got it, thanks',\n\t\t\t\tformSubmittedText: 'This page can be closed now',\n\t\t\t\tbuttonLabel,\n\t\t\t\tredirectUrl: undefined,\n\t\t\t\tformFields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfieldLabel: 'Response',\n\t\t\t\t\t\tfieldType: 'textarea',\n\t\t\t\t\t\trequiredField: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\ttestRun: false,\n\t\t\t\tquery: {},\n\t\t\t\tcustomCss,\n\t\t\t});\n\n\t\t\tres.render('form-trigger', data);\n\n\t\t\treturn {\n\t\t\t\tnoWebhookResponse: true,\n\t\t\t};\n\t\t}\n\t\tif (method === 'POST') {\n\t\t\tconst data = this.getBodyData().data as IDataObject;\n\n\t\t\treturn {\n\t\t\t\twebhookResponse: ACTION_RECORDED_PAGE,\n\t\t\t\tworkflowData: [[{ json: { data: { text: data[INPUT_FIELD_IDENTIFIER] } } }]],\n\t\t\t};\n\t\t}\n\t}\n\n\tif (responseType === 'customForm') {\n\t\tconst defineForm = this.getNodeParameter('defineForm', 'fields') as 'fields' | 'json';\n\t\tlet fields: FormFieldsParameter = [];\n\n\t\tif (defineForm === 'json') {\n\t\t\ttry {\n\t\t\t\tconst jsonOutput = this.getNodeParameter('jsonOutput', '', {\n\t\t\t\t\trawExpressions: true,\n\t\t\t\t}) as string;\n\n\t\t\t\tfields = tryToParseJsonToFormFields(resolveRawData(this, jsonOutput));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeOperationError(this.getNode(), error.message, {\n\t\t\t\t\tdescription: error.message,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tfields = this.getNodeParameter('formFields.values', []) as FormFieldsParameter;\n\t\t}\n\n\t\tif (method === 'GET') {\n\t\t\tconst { formTitle, formDescription, buttonLabel, customCss } =\n\t\t\t\tgetFormResponseCustomizations(this);\n\n\t\t\tconst data = prepareFormData({\n\t\t\t\tformTitle,\n\t\t\t\tformDescription,\n\t\t\t\tformSubmittedHeader: 'Got it, thanks',\n\t\t\t\tformSubmittedText: 'This page can be closed now',\n\t\t\t\tbuttonLabel,\n\t\t\t\tredirectUrl: undefined,\n\t\t\t\tformFields: fields,\n\t\t\t\ttestRun: false,\n\t\t\t\tquery: {},\n\t\t\t\tcustomCss,\n\t\t\t});\n\n\t\t\tres.render('form-trigger', data);\n\n\t\t\treturn {\n\t\t\t\tnoWebhookResponse: true,\n\t\t\t};\n\t\t}\n\t\tif (method === 'POST') {\n\t\t\tconst returnItem = await prepareFormReturnItem(this, fields, 'production', true);\n\t\t\tconst json = returnItem.json;\n\n\t\t\tdelete json.submittedAt;\n\t\t\tdelete json.formMode;\n\n\t\t\treturnItem.json = { data: json };\n\n\t\t\treturn {\n\t\t\t\twebhookResponse: ACTION_RECORDED_PAGE,\n\t\t\t\tworkflowData: [[returnItem]],\n\t\t\t};\n\t\t}\n\t}\n\n\tconst query = req.query as { approved: 'false' | 'true' };\n\tconst approved = query.approved === 'true';\n\treturn {\n\t\twebhookResponse: ACTION_RECORDED_PAGE,\n\t\tworkflowData: [[{ json: { data: { approved } } }]],\n\t};\n}\n\n// Send and Wait Config -----------------------------------------------------------\nexport function getSendAndWaitConfig(context: IExecuteFunctions): SendAndWaitConfig {\n\tconst message = escapeHtml((context.getNodeParameter('message', 0, '') as string).trim())\n\t\t.replace(/\\\\n/g, '\\n')\n\t\t.replace(/<br>/g, '\\n');\n\tconst subject = escapeHtml(context.getNodeParameter('subject', 0, '') as string);\n\tconst resumeUrl = context.evaluateExpression('{{ $execution?.resumeUrl }}', 0) as string;\n\tconst nodeId = context.evaluateExpression('{{ $nodeId }}', 0) as string;\n\tconst approvalOptions = context.getNodeParameter('approvalOptions.values', 0, {}) as {\n\t\tapprovalType?: 'single' | 'double';\n\t\tapproveLabel?: string;\n\t\tbuttonApprovalStyle?: string;\n\t\tdisapproveLabel?: string;\n\t\tbuttonDisapprovalStyle?: string;\n\t};\n\n\tconst options = context.getNodeParameter('options', 0, {});\n\n\tconst config: SendAndWaitConfig = {\n\t\ttitle: subject,\n\t\tmessage,\n\t\turl: `${resumeUrl}/${nodeId}`,\n\t\toptions: [],\n\t\tappendAttribution: options?.appendAttribution as boolean,\n\t};\n\n\tconst responseType = context.getNodeParameter('responseType', 0, 'approval') as string;\n\n\tif (responseType === 'freeText' || responseType === 'customForm') {\n\t\tconst label = context.getNodeParameter('options.messageButtonLabel', 0, 'Respond') as string;\n\t\tconfig.options.push({\n\t\t\tlabel,\n\t\t\tvalue: 'true',\n\t\t\tstyle: 'primary',\n\t\t});\n\t} else if (approvalOptions.approvalType === 'double') {\n\t\tconst approveLabel = escapeHtml(approvalOptions.approveLabel || 'Approve');\n\t\tconst buttonApprovalStyle = approvalOptions.buttonApprovalStyle || 'primary';\n\t\tconst disapproveLabel = escapeHtml(approvalOptions.disapproveLabel || 'Disapprove');\n\t\tconst buttonDisapprovalStyle = approvalOptions.buttonDisapprovalStyle || 'secondary';\n\n\t\tconfig.options.push({\n\t\t\tlabel: disapproveLabel,\n\t\t\tvalue: 'false',\n\t\t\tstyle: buttonDisapprovalStyle,\n\t\t});\n\t\tconfig.options.push({\n\t\t\tlabel: approveLabel,\n\t\t\tvalue: 'true',\n\t\t\tstyle: buttonApprovalStyle,\n\t\t});\n\t} else {\n\t\tconst label = escapeHtml(approvalOptions.approveLabel || 'Approve');\n\t\tconst style = approvalOptions.buttonApprovalStyle || 'primary';\n\t\tconfig.options.push({\n\t\t\tlabel,\n\t\t\tvalue: 'true',\n\t\t\tstyle,\n\t\t});\n\t}\n\n\treturn config;\n}\n\nexport function createButton(url: string, label: string, approved: string, style: string) {\n\tlet buttonStyle = BUTTON_STYLE_PRIMARY;\n\tif (style === 'secondary') {\n\t\tbuttonStyle = BUTTON_STYLE_SECONDARY;\n\t}\n\treturn `<a href=\"${url}?approved=${approved}\" target=\"_blank\" style=\"${buttonStyle}\">${label}</a>`;\n}\n\nexport function createEmail(context: IExecuteFunctions) {\n\tconst to = (context.getNodeParameter('sendTo', 0, '') as string).trim();\n\tconst config = getSendAndWaitConfig(context);\n\n\tif (to.indexOf('@') === -1 || (to.match(/@/g) || []).length > 1) {\n\t\tconst description = `The email address '${to}' in the 'To' field isn't valid or contains multiple addresses. Please provide only a single email address.`;\n\t\tthrow new NodeOperationError(context.getNode(), 'Invalid email address', {\n\t\t\tdescription,\n\t\t\titemIndex: 0,\n\t\t});\n\t}\n\n\tconst buttons: string[] = [];\n\tfor (const option of config.options) {\n\t\tbuttons.push(createButton(config.url, option.label, option.value, option.style));\n\t}\n\tlet emailBody: string;\n\tif (config.appendAttribution !== false) {\n\t\tconst instanceId = context.getInstanceId();\n\t\temailBody = createEmailBodyWithN8nAttribution(config.message, buttons.join('\\n'), instanceId);\n\t} else {\n\t\temailBody = createEmailBodyWithoutN8nAttribution(config.message, buttons.join('\\n'));\n\t}\n\n\tconst email: IEmail = {\n\t\tto,\n\t\tsubject: config.title,\n\t\tbody: '',\n\t\thtmlBody: emailBody,\n\t};\n\n\treturn email;\n}\n"],"mappings":"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","names":["isbot"]}
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
  var utilities_exports = {};
20
30
  __export(utilities_exports, {
@@ -40,7 +50,12 @@ __export(utilities_exports, {
40
50
  wrapData: () => wrapData
41
51
  });
42
52
  module.exports = __toCommonJS(utilities_exports);
43
- var import_lodash = require("lodash");
53
+ var import_get = __toESM(require("lodash/get"));
54
+ var import_isEqual = __toESM(require("lodash/isEqual"));
55
+ var import_isNull = __toESM(require("lodash/isNull"));
56
+ var import_isObject = __toESM(require("lodash/isObject"));
57
+ var import_merge = __toESM(require("lodash/merge"));
58
+ var import_reduce = __toESM(require("lodash/reduce"));
44
59
  var import_n8n_workflow = require("n8n-workflow");
45
60
  function chunk(array, size = 1) {
46
61
  const length = array === null ? 0 : array.length;
@@ -62,9 +77,9 @@ const shuffleArray = (array) => {
62
77
  }
63
78
  };
64
79
  const flattenKeys = (obj, prefix = []) => {
65
- return !(0, import_lodash.isObject)(obj) ? { [prefix.join(".")]: obj } : (0, import_lodash.reduce)(
80
+ return !(0, import_isObject.default)(obj) ? { [prefix.join(".")]: obj } : (0, import_reduce.default)(
66
81
  obj,
67
- (cum, next, key) => (0, import_lodash.merge)(cum, flattenKeys(next, [...prefix, key])),
82
+ (cum, next, key) => (0, import_merge.default)(cum, flattenKeys(next, [...prefix, key])),
68
83
  {}
69
84
  );
70
85
  };
@@ -85,12 +100,12 @@ const compareItems = (obj1, obj2, keys, disableDotNotation = false) => {
85
100
  let result = true;
86
101
  for (const key of keys) {
87
102
  if (!disableDotNotation) {
88
- if (!(0, import_lodash.isEqual)((0, import_lodash.get)(obj1.json, key), (0, import_lodash.get)(obj2.json, key))) {
103
+ if (!(0, import_isEqual.default)((0, import_get.default)(obj1.json, key), (0, import_get.default)(obj2.json, key))) {
89
104
  result = false;
90
105
  break;
91
106
  }
92
107
  } else {
93
- if (!(0, import_lodash.isEqual)(obj1.json[key], obj2.json[key])) {
108
+ if (!(0, import_isEqual.default)(obj1.json[key], obj2.json[key])) {
94
109
  result = false;
95
110
  break;
96
111
  }
@@ -102,7 +117,7 @@ function updateDisplayOptions(displayOptions, properties) {
102
117
  return properties.map((nodeProperty) => {
103
118
  return {
104
119
  ...nodeProperty,
105
- displayOptions: (0, import_lodash.merge)({}, nodeProperty.displayOptions, displayOptions)
120
+ displayOptions: (0, import_merge.default)({}, nodeProperty.displayOptions, displayOptions)
106
121
  };
107
122
  });
108
123
  }
@@ -123,7 +138,7 @@ function processJsonInput(jsonData, inputName) {
123
138
  return values;
124
139
  }
125
140
  function isFalsy(value) {
126
- if ((0, import_lodash.isNull)(value)) return true;
141
+ if ((0, import_isNull.default)(value)) return true;
127
142
  if (typeof value === "string" && value === "") return true;
128
143
  if (Array.isArray(value) && value.length === 0) return true;
129
144
  return false;
@@ -131,24 +146,24 @@ function isFalsy(value) {
131
146
  const parseStringAndCompareToObject = (str, arr) => {
132
147
  try {
133
148
  const parsedArray = (0, import_n8n_workflow.jsonParse)(str);
134
- return (0, import_lodash.isEqual)(parsedArray, arr);
149
+ return (0, import_isEqual.default)(parsedArray, arr);
135
150
  } catch (error) {
136
151
  return false;
137
152
  }
138
153
  };
139
154
  const fuzzyCompare = (useFuzzyCompare, compareVersion = 1) => {
140
155
  if (!useFuzzyCompare) {
141
- return (item1, item2) => (0, import_lodash.isEqual)(item1, item2);
156
+ return (item1, item2) => (0, import_isEqual.default)(item1, item2);
142
157
  }
143
158
  return (item1, item2) => {
144
- if (!(0, import_lodash.isNull)(item1) && !(0, import_lodash.isNull)(item2) && typeof item1 === typeof item2) {
145
- return (0, import_lodash.isEqual)(item1, item2);
159
+ if (!(0, import_isNull.default)(item1) && !(0, import_isNull.default)(item2) && typeof item1 === typeof item2) {
160
+ return (0, import_isEqual.default)(item1, item2);
146
161
  }
147
162
  if (compareVersion >= 2) {
148
- if ((0, import_lodash.isNull)(item1) && ((0, import_lodash.isNull)(item2) || item2 === 0 || item2 === "0")) {
163
+ if ((0, import_isNull.default)(item1) && ((0, import_isNull.default)(item2) || item2 === 0 || item2 === "0")) {
149
164
  return true;
150
165
  }
151
- if ((0, import_lodash.isNull)(item2) && ((0, import_lodash.isNull)(item1) || item1 === 0 || item1 === "0")) {
166
+ if ((0, import_isNull.default)(item2) && ((0, import_isNull.default)(item1) || item1 === 0 || item1 === "0")) {
152
167
  return true;
153
168
  }
154
169
  }
@@ -161,10 +176,10 @@ const fuzzyCompare = (useFuzzyCompare, compareVersion = 1) => {
161
176
  if (typeof item1 === "string" && typeof item2 === "number") {
162
177
  return item1 === item2.toString();
163
178
  }
164
- if (!(0, import_lodash.isNull)(item1) && typeof item1 === "object" && typeof item2 === "string") {
179
+ if (!(0, import_isNull.default)(item1) && typeof item1 === "object" && typeof item2 === "string") {
165
180
  return parseStringAndCompareToObject(item2, item1);
166
181
  }
167
- if (!(0, import_lodash.isNull)(item2) && typeof item1 === "string" && typeof item2 === "object") {
182
+ if (!(0, import_isNull.default)(item2) && typeof item1 === "string" && typeof item2 === "object") {
168
183
  return parseStringAndCompareToObject(item1, item2);
169
184
  }
170
185
  if (typeof item1 === "boolean" && typeof item2 === "string") {
@@ -191,7 +206,7 @@ const fuzzyCompare = (useFuzzyCompare, compareVersion = 1) => {
191
206
  if (item2 === true && item1 === "1") return true;
192
207
  if (item2 === false && item1 === "0") return true;
193
208
  }
194
- return (0, import_lodash.isEqual)(item1, item2);
209
+ return (0, import_isEqual.default)(item1, item2);
195
210
  };
196
211
  };
197
212
  function wrapData(data) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../utils/utilities.ts"],"sourcesContent":["import { isEqual, isNull, merge, isObject, reduce, get } from 'lodash';\nimport type {\n\tIDataObject,\n\tIDisplayOptions,\n\tINodeExecutionData,\n\tINodeProperties,\n\tIPairedItemData,\n} from 'n8n-workflow';\nimport { ApplicationError, jsonParse, randomInt } from 'n8n-workflow';\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @example\n *\n * chunk(['a', 'b', 'c', 'd'], 2)\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(['a', 'b', 'c', 'd'], 3)\n * // => [['a', 'b', 'c'], ['d']]\n */\n\nexport function chunk<T>(array: T[], size = 1) {\n\tconst length = array === null ? 0 : array.length;\n\tif (!length || size < 1) {\n\t\treturn [];\n\t}\n\tlet index = 0;\n\tlet resIndex = 0;\n\tconst result = new Array(Math.ceil(length / size));\n\n\twhile (index < length) {\n\t\tresult[resIndex++] = array.slice(index, (index += size));\n\t}\n\treturn result as T[][];\n}\n\n/**\n * Shuffles an array in place using the Fisher-Yates shuffle algorithm\n * @param {Array} array The array to shuffle.\n */\nexport const shuffleArray = <T>(array: T[]): void => {\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tconst j = randomInt(i + 1);\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n};\n\n/**\n * Flattens an object with deep data\n * @param {IDataObject} data The object to flatten\n * @param {string[]} prefix The prefix to add to each key in the returned flat object\n */\nexport const flattenKeys = (obj: IDataObject, prefix: string[] = []): IDataObject => {\n\treturn !isObject(obj)\n\t\t? { [prefix.join('.')]: obj }\n\t\t: reduce(\n\t\t\t\tobj,\n\t\t\t\t(cum, next, key) => merge(cum, flattenKeys(next as IDataObject, [...prefix, key])),\n\t\t\t\t{},\n\t\t\t);\n};\n\n/**\n * Takes a multidimensional array and converts it to a one-dimensional array.\n *\n * @param {Array} nestedArray The array to be flattened.\n * @example\n *\n * flatten([['a', 'b'], ['c', 'd']])\n * // => ['a', 'b', 'c', 'd']\n *\n */\n\nexport function flatten<T>(nestedArray: T[][]) {\n\tconst result = [];\n\n\t(function loop(array: T[] | T[][]) {\n\t\tfor (let i = 0; i < array.length; i++) {\n\t\t\tif (Array.isArray(array[i])) {\n\t\t\t\tloop(array[i] as T[]);\n\t\t\t} else {\n\t\t\t\tresult.push(array[i]);\n\t\t\t}\n\t\t}\n\t})(nestedArray);\n\n\t//TODO: check logic in MicrosoftSql.node.ts\n\n\treturn result as any;\n}\n\n/**\n * Compares the values of specified keys in two objects.\n *\n * @param {T} obj1 - The first object to compare.\n * @param {T} obj2 - The second object to compare.\n * @param {string[]} keys - An array of keys to compare.\n * @param {boolean} disableDotNotation - Whether to use dot notation to access nested properties.\n * @returns {boolean} - Whether the values of the specified keys are equal in both objects.\n */\nexport const compareItems = <T extends { json: Record<string, unknown> }>(\n\tobj1: T,\n\tobj2: T,\n\tkeys: string[],\n\tdisableDotNotation: boolean = false,\n): boolean => {\n\tlet result = true;\n\tfor (const key of keys) {\n\t\tif (!disableDotNotation) {\n\t\t\tif (!isEqual(get(obj1.json, key), get(obj2.json, key))) {\n\t\t\t\tresult = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!isEqual(obj1.json[key], obj2.json[key])) {\n\t\t\t\tresult = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n};\n\nexport function updateDisplayOptions(\n\tdisplayOptions: IDisplayOptions,\n\tproperties: INodeProperties[],\n) {\n\treturn properties.map((nodeProperty) => {\n\t\treturn {\n\t\t\t...nodeProperty,\n\t\t\tdisplayOptions: merge({}, nodeProperty.displayOptions, displayOptions),\n\t\t};\n\t});\n}\n\nexport function processJsonInput<T>(jsonData: T, inputName?: string) {\n\tlet values;\n\tconst input = inputName ? `'${inputName}' ` : '';\n\n\tif (typeof jsonData === 'string') {\n\t\ttry {\n\t\t\tvalues = jsonParse(jsonData);\n\t\t} catch (error) {\n\t\t\tthrow new ApplicationError(`Input ${input} must contain a valid JSON`, { level: 'warning' });\n\t\t}\n\t} else if (typeof jsonData === 'object') {\n\t\tvalues = jsonData;\n\t} else {\n\t\tthrow new ApplicationError(`Input ${input} must contain a valid JSON`, { level: 'warning' });\n\t}\n\n\treturn values;\n}\n\nfunction isFalsy<T>(value: T) {\n\tif (isNull(value)) return true;\n\tif (typeof value === 'string' && value === '') return true;\n\tif (Array.isArray(value) && value.length === 0) return true;\n\treturn false;\n}\n\nconst parseStringAndCompareToObject = (str: string, arr: IDataObject) => {\n\ttry {\n\t\tconst parsedArray = jsonParse(str);\n\t\treturn isEqual(parsedArray, arr);\n\t} catch (error) {\n\t\treturn false;\n\t}\n};\n\nexport const fuzzyCompare = (useFuzzyCompare: boolean, compareVersion = 1) => {\n\tif (!useFuzzyCompare) {\n\t\t//Fuzzy compare is false we do strict comparison\n\t\treturn <T, U>(item1: T, item2: U) => isEqual(item1, item2);\n\t}\n\n\treturn <T, U>(item1: T, item2: U) => {\n\t\t//Both types are the same, so we do strict comparison\n\t\tif (!isNull(item1) && !isNull(item2) && typeof item1 === typeof item2) {\n\t\t\treturn isEqual(item1, item2);\n\t\t}\n\n\t\tif (compareVersion >= 2) {\n\t\t\t//Null, 0 and \"0\" treated as equal\n\t\t\tif (isNull(item1) && (isNull(item2) || item2 === 0 || item2 === '0')) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (isNull(item2) && (isNull(item1) || item1 === 0 || item1 === '0')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t//Null, empty strings, empty arrays all treated as the same\n\t\tif (isFalsy(item1) && isFalsy(item2)) return true;\n\n\t\t//When a field is missing in one branch and isFalsy() in another, treat them as matching\n\t\tif (isFalsy(item1) && item2 === undefined) return true;\n\t\tif (item1 === undefined && isFalsy(item2)) return true;\n\n\t\t//Compare numbers and strings representing that number\n\t\tif (typeof item1 === 'number' && typeof item2 === 'string') {\n\t\t\treturn item1.toString() === item2;\n\t\t}\n\n\t\tif (typeof item1 === 'string' && typeof item2 === 'number') {\n\t\t\treturn item1 === item2.toString();\n\t\t}\n\n\t\t//Compare objects/arrays and their stringified version\n\t\tif (!isNull(item1) && typeof item1 === 'object' && typeof item2 === 'string') {\n\t\t\treturn parseStringAndCompareToObject(item2, item1 as IDataObject);\n\t\t}\n\n\t\tif (!isNull(item2) && typeof item1 === 'string' && typeof item2 === 'object') {\n\t\t\treturn parseStringAndCompareToObject(item1, item2 as IDataObject);\n\t\t}\n\n\t\t//Compare booleans and strings representing the boolean (’true’, ‘True’, ‘TRUE’)\n\t\tif (typeof item1 === 'boolean' && typeof item2 === 'string') {\n\t\t\tif (item1 === true && item2.toLocaleLowerCase() === 'true') return true;\n\t\t\tif (item1 === false && item2.toLocaleLowerCase() === 'false') return true;\n\t\t}\n\n\t\tif (typeof item2 === 'boolean' && typeof item1 === 'string') {\n\t\t\tif (item2 === true && item1.toLocaleLowerCase() === 'true') return true;\n\t\t\tif (item2 === false && item1.toLocaleLowerCase() === 'false') return true;\n\t\t}\n\n\t\t//Compare booleans and the numbers/string 0 and 1\n\t\tif (typeof item1 === 'boolean' && typeof item2 === 'number') {\n\t\t\tif (item1 === true && item2 === 1) return true;\n\t\t\tif (item1 === false && item2 === 0) return true;\n\t\t}\n\n\t\tif (typeof item2 === 'boolean' && typeof item1 === 'number') {\n\t\t\tif (item2 === true && item1 === 1) return true;\n\t\t\tif (item2 === false && item1 === 0) return true;\n\t\t}\n\n\t\tif (typeof item1 === 'boolean' && typeof item2 === 'string') {\n\t\t\tif (item1 === true && item2 === '1') return true;\n\t\t\tif (item1 === false && item2 === '0') return true;\n\t\t}\n\n\t\tif (typeof item2 === 'boolean' && typeof item1 === 'string') {\n\t\t\tif (item2 === true && item1 === '1') return true;\n\t\t\tif (item2 === false && item1 === '0') return true;\n\t\t}\n\n\t\treturn isEqual(item1, item2);\n\t};\n};\n\nexport function wrapData(data: IDataObject | IDataObject[]): INodeExecutionData[] {\n\tif (!Array.isArray(data)) {\n\t\treturn [{ json: data }];\n\t}\n\treturn data.map((item) => ({\n\t\tjson: item,\n\t}));\n}\n\nexport const keysToLowercase = <T>(headers: T) => {\n\tif (typeof headers !== 'object' || Array.isArray(headers) || headers === null) return headers;\n\treturn Object.entries(headers).reduce((acc, [key, value]) => {\n\t\tacc[key.toLowerCase()] = value as IDataObject;\n\t\treturn acc;\n\t}, {} as IDataObject);\n};\n\n/**\n * Formats a private key by removing unnecessary whitespace and adding line breaks.\n * @param privateKey - The private key to format.\n * @returns The formatted private key.\n */\nexport function formatPrivateKey(privateKey: string, keyIsPublic = false): string {\n\tlet regex = /(PRIVATE KEY|CERTIFICATE)/;\n\tif (keyIsPublic) {\n\t\tregex = /(PUBLIC KEY)/;\n\t}\n\tif (!privateKey || /\\n/.test(privateKey)) {\n\t\treturn privateKey;\n\t}\n\tlet formattedPrivateKey = '';\n\tconst parts = privateKey.split('-----').filter((item) => item !== '');\n\tparts.forEach((part) => {\n\t\tif (regex.test(part)) {\n\t\t\tformattedPrivateKey += `-----${part}-----`;\n\t\t} else {\n\t\t\tconst passRegex = /Proc-Type|DEK-Info/;\n\t\t\tif (passRegex.test(part)) {\n\t\t\t\tpart = part.replace(/:\\s+/g, ':');\n\t\t\t\tformattedPrivateKey += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t} else {\n\t\t\t\tformattedPrivateKey += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t}\n\t\t}\n\t});\n\treturn formattedPrivateKey;\n}\n\n/**\n * @TECH_DEBT Explore replacing with handlebars\n */\nexport function getResolvables(expression: string) {\n\tif (!expression) return [];\n\n\tconst resolvables = [];\n\tconst resolvableRegex = /({{[\\s\\S]*?}})/g;\n\n\tlet match;\n\n\twhile ((match = resolvableRegex.exec(expression)) !== null) {\n\t\tif (match[1]) {\n\t\t\tresolvables.push(match[1]);\n\t\t}\n\t}\n\n\treturn resolvables;\n}\n\n/**\n * Flattens an object with deep data\n *\n * @param {IDataObject} data The object to flatten\n */\nexport function flattenObject(data: IDataObject) {\n\tconst returnData: IDataObject = {};\n\tfor (const key1 of Object.keys(data)) {\n\t\tif (data[key1] !== null && typeof data[key1] === 'object') {\n\t\t\tif (data[key1] instanceof Date) {\n\t\t\t\treturnData[key1] = data[key1]?.toString();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst flatObject = flattenObject(data[key1] as IDataObject);\n\t\t\tfor (const key2 in flatObject) {\n\t\t\t\tif (flatObject[key2] === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturnData[`${key1}.${key2}`] = flatObject[key2];\n\t\t\t}\n\t\t} else {\n\t\t\treturnData[key1] = data[key1];\n\t\t}\n\t}\n\treturn returnData;\n}\n\n/**\n * Capitalizes the first letter of a string\n *\n * @param {string} string The string to capitalize\n */\nexport function capitalize(str: string): string {\n\tif (!str) return str;\n\n\tconst chars = str.split('');\n\tchars[0] = chars[0].toUpperCase();\n\n\treturn chars.join('');\n}\n\nexport function generatePairedItemData(length: number): IPairedItemData[] {\n\treturn Array.from({ length }, (_, item) => ({\n\t\titem,\n\t}));\n}\n\n/**\n * Output Paired Item Data Array\n *\n * @param {number | IPairedItemData | IPairedItemData[] | undefined} pairedItem\n */\nexport function preparePairedItemDataArray(\n\tpairedItem: number | IPairedItemData | IPairedItemData[] | undefined,\n): IPairedItemData[] {\n\tif (pairedItem === undefined) return [];\n\tif (typeof pairedItem === 'number') return [{ item: pairedItem }];\n\tif (Array.isArray(pairedItem)) return pairedItem;\n\treturn [pairedItem];\n}\n\nexport const sanitizeDataPathKey = (item: IDataObject, key: string) => {\n\tif (item[key] !== undefined) {\n\t\treturn key;\n\t}\n\n\tif (\n\t\t(key.startsWith(\"['\") && key.endsWith(\"']\")) ||\n\t\t(key.startsWith('[\"') && key.endsWith('\"]'))\n\t) {\n\t\tkey = key.slice(2, -2);\n\t\tif (item[key] !== undefined) {\n\t\t\treturn key;\n\t\t}\n\t}\n\treturn key;\n};\n\n/**\n * Escape HTML\n *\n * @param {string} text The text to escape\n */\nexport function escapeHtml(text: string): string {\n\tif (!text) return '';\n\treturn text.replace(/&amp;|&lt;|&gt;|&#39;|&quot;/g, (match) => {\n\t\tswitch (match) {\n\t\t\tcase '&amp;':\n\t\t\t\treturn '&';\n\t\t\tcase '&lt;':\n\t\t\t\treturn '<';\n\t\t\tcase '&gt;':\n\t\t\t\treturn '>';\n\t\t\tcase '&#39;':\n\t\t\t\treturn \"'\";\n\t\t\tcase '&quot;':\n\t\t\t\treturn '\"';\n\t\t\tdefault:\n\t\t\t\treturn match;\n\t\t}\n\t});\n}\n\n/**\n * Sorts each item json's keys by a priority list\n *\n * @param {INodeExecutionData[]} data The array of items which keys will be sorted\n * @param {string[]} priorityList The priority list, keys of item.json will be sorted in this order first then alphabetically\n */\nexport function sortItemKeysByPriorityList(data: INodeExecutionData[], priorityList: string[]) {\n\treturn data.map((item) => {\n\t\tconst itemKeys = Object.keys(item.json);\n\n\t\tconst updatedKeysOrder = itemKeys.sort((a, b) => {\n\t\t\tconst indexA = priorityList.indexOf(a);\n\t\t\tconst indexB = priorityList.indexOf(b);\n\n\t\t\tif (indexA !== -1 && indexB !== -1) {\n\t\t\t\treturn indexA - indexB;\n\t\t\t} else if (indexA !== -1) {\n\t\t\t\treturn -1;\n\t\t\t} else if (indexB !== -1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn a.localeCompare(b);\n\t\t});\n\n\t\tconst updatedItem: IDataObject = {};\n\t\tfor (const key of updatedKeysOrder) {\n\t\t\tupdatedItem[key] = item.json[key];\n\t\t}\n\n\t\titem.json = updatedItem;\n\t\treturn item;\n\t});\n}\n\nexport function createUtmCampaignLink(nodeType: string, instanceId?: string) {\n\treturn `https://n8n.io/?utm_source=n8n-internal&utm_medium=powered_by&utm_campaign=${encodeURIComponent(\n\t\tnodeType,\n\t)}${instanceId ? '_' + instanceId : ''}`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../utils/utilities.ts"],"sourcesContent":["import get from 'lodash/get';\nimport isEqual from 'lodash/isEqual';\nimport isNull from 'lodash/isNull';\nimport isObject from 'lodash/isObject';\nimport merge from 'lodash/merge';\nimport reduce from 'lodash/reduce';\nimport type {\n\tIDataObject,\n\tIDisplayOptions,\n\tINodeExecutionData,\n\tINodeProperties,\n\tIPairedItemData,\n} from 'n8n-workflow';\nimport { ApplicationError, jsonParse, randomInt } from 'n8n-workflow';\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @example\n *\n * chunk(['a', 'b', 'c', 'd'], 2)\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(['a', 'b', 'c', 'd'], 3)\n * // => [['a', 'b', 'c'], ['d']]\n */\n\nexport function chunk<T>(array: T[], size = 1) {\n\tconst length = array === null ? 0 : array.length;\n\tif (!length || size < 1) {\n\t\treturn [];\n\t}\n\tlet index = 0;\n\tlet resIndex = 0;\n\tconst result = new Array(Math.ceil(length / size));\n\n\twhile (index < length) {\n\t\tresult[resIndex++] = array.slice(index, (index += size));\n\t}\n\treturn result as T[][];\n}\n\n/**\n * Shuffles an array in place using the Fisher-Yates shuffle algorithm\n * @param {Array} array The array to shuffle.\n */\nexport const shuffleArray = <T>(array: T[]): void => {\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tconst j = randomInt(i + 1);\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n};\n\n/**\n * Flattens an object with deep data\n * @param {IDataObject} data The object to flatten\n * @param {string[]} prefix The prefix to add to each key in the returned flat object\n */\nexport const flattenKeys = (obj: IDataObject, prefix: string[] = []): IDataObject => {\n\treturn !isObject(obj)\n\t\t? { [prefix.join('.')]: obj }\n\t\t: reduce(\n\t\t\t\tobj,\n\t\t\t\t(cum, next, key) => merge(cum, flattenKeys(next as IDataObject, [...prefix, key])),\n\t\t\t\t{},\n\t\t\t);\n};\n\n/**\n * Takes a multidimensional array and converts it to a one-dimensional array.\n *\n * @param {Array} nestedArray The array to be flattened.\n * @example\n *\n * flatten([['a', 'b'], ['c', 'd']])\n * // => ['a', 'b', 'c', 'd']\n *\n */\n\nexport function flatten<T>(nestedArray: T[][]) {\n\tconst result = [];\n\n\t(function loop(array: T[] | T[][]) {\n\t\tfor (let i = 0; i < array.length; i++) {\n\t\t\tif (Array.isArray(array[i])) {\n\t\t\t\tloop(array[i] as T[]);\n\t\t\t} else {\n\t\t\t\tresult.push(array[i]);\n\t\t\t}\n\t\t}\n\t})(nestedArray);\n\n\t//TODO: check logic in MicrosoftSql.node.ts\n\n\treturn result as any;\n}\n\n/**\n * Compares the values of specified keys in two objects.\n *\n * @param {T} obj1 - The first object to compare.\n * @param {T} obj2 - The second object to compare.\n * @param {string[]} keys - An array of keys to compare.\n * @param {boolean} disableDotNotation - Whether to use dot notation to access nested properties.\n * @returns {boolean} - Whether the values of the specified keys are equal in both objects.\n */\nexport const compareItems = <T extends { json: Record<string, unknown> }>(\n\tobj1: T,\n\tobj2: T,\n\tkeys: string[],\n\tdisableDotNotation: boolean = false,\n): boolean => {\n\tlet result = true;\n\tfor (const key of keys) {\n\t\tif (!disableDotNotation) {\n\t\t\tif (!isEqual(get(obj1.json, key), get(obj2.json, key))) {\n\t\t\t\tresult = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!isEqual(obj1.json[key], obj2.json[key])) {\n\t\t\t\tresult = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n};\n\nexport function updateDisplayOptions(\n\tdisplayOptions: IDisplayOptions,\n\tproperties: INodeProperties[],\n) {\n\treturn properties.map((nodeProperty) => {\n\t\treturn {\n\t\t\t...nodeProperty,\n\t\t\tdisplayOptions: merge({}, nodeProperty.displayOptions, displayOptions),\n\t\t};\n\t});\n}\n\nexport function processJsonInput<T>(jsonData: T, inputName?: string) {\n\tlet values;\n\tconst input = inputName ? `'${inputName}' ` : '';\n\n\tif (typeof jsonData === 'string') {\n\t\ttry {\n\t\t\tvalues = jsonParse(jsonData);\n\t\t} catch (error) {\n\t\t\tthrow new ApplicationError(`Input ${input} must contain a valid JSON`, { level: 'warning' });\n\t\t}\n\t} else if (typeof jsonData === 'object') {\n\t\tvalues = jsonData;\n\t} else {\n\t\tthrow new ApplicationError(`Input ${input} must contain a valid JSON`, { level: 'warning' });\n\t}\n\n\treturn values;\n}\n\nfunction isFalsy<T>(value: T) {\n\tif (isNull(value)) return true;\n\tif (typeof value === 'string' && value === '') return true;\n\tif (Array.isArray(value) && value.length === 0) return true;\n\treturn false;\n}\n\nconst parseStringAndCompareToObject = (str: string, arr: IDataObject) => {\n\ttry {\n\t\tconst parsedArray = jsonParse(str);\n\t\treturn isEqual(parsedArray, arr);\n\t} catch (error) {\n\t\treturn false;\n\t}\n};\n\nexport const fuzzyCompare = (useFuzzyCompare: boolean, compareVersion = 1) => {\n\tif (!useFuzzyCompare) {\n\t\t//Fuzzy compare is false we do strict comparison\n\t\treturn <T, U>(item1: T, item2: U) => isEqual(item1, item2);\n\t}\n\n\treturn <T, U>(item1: T, item2: U) => {\n\t\t//Both types are the same, so we do strict comparison\n\t\tif (!isNull(item1) && !isNull(item2) && typeof item1 === typeof item2) {\n\t\t\treturn isEqual(item1, item2);\n\t\t}\n\n\t\tif (compareVersion >= 2) {\n\t\t\t//Null, 0 and \"0\" treated as equal\n\t\t\tif (isNull(item1) && (isNull(item2) || item2 === 0 || item2 === '0')) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (isNull(item2) && (isNull(item1) || item1 === 0 || item1 === '0')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t//Null, empty strings, empty arrays all treated as the same\n\t\tif (isFalsy(item1) && isFalsy(item2)) return true;\n\n\t\t//When a field is missing in one branch and isFalsy() in another, treat them as matching\n\t\tif (isFalsy(item1) && item2 === undefined) return true;\n\t\tif (item1 === undefined && isFalsy(item2)) return true;\n\n\t\t//Compare numbers and strings representing that number\n\t\tif (typeof item1 === 'number' && typeof item2 === 'string') {\n\t\t\treturn item1.toString() === item2;\n\t\t}\n\n\t\tif (typeof item1 === 'string' && typeof item2 === 'number') {\n\t\t\treturn item1 === item2.toString();\n\t\t}\n\n\t\t//Compare objects/arrays and their stringified version\n\t\tif (!isNull(item1) && typeof item1 === 'object' && typeof item2 === 'string') {\n\t\t\treturn parseStringAndCompareToObject(item2, item1 as IDataObject);\n\t\t}\n\n\t\tif (!isNull(item2) && typeof item1 === 'string' && typeof item2 === 'object') {\n\t\t\treturn parseStringAndCompareToObject(item1, item2 as IDataObject);\n\t\t}\n\n\t\t//Compare booleans and strings representing the boolean (’true’, ‘True’, ‘TRUE’)\n\t\tif (typeof item1 === 'boolean' && typeof item2 === 'string') {\n\t\t\tif (item1 === true && item2.toLocaleLowerCase() === 'true') return true;\n\t\t\tif (item1 === false && item2.toLocaleLowerCase() === 'false') return true;\n\t\t}\n\n\t\tif (typeof item2 === 'boolean' && typeof item1 === 'string') {\n\t\t\tif (item2 === true && item1.toLocaleLowerCase() === 'true') return true;\n\t\t\tif (item2 === false && item1.toLocaleLowerCase() === 'false') return true;\n\t\t}\n\n\t\t//Compare booleans and the numbers/string 0 and 1\n\t\tif (typeof item1 === 'boolean' && typeof item2 === 'number') {\n\t\t\tif (item1 === true && item2 === 1) return true;\n\t\t\tif (item1 === false && item2 === 0) return true;\n\t\t}\n\n\t\tif (typeof item2 === 'boolean' && typeof item1 === 'number') {\n\t\t\tif (item2 === true && item1 === 1) return true;\n\t\t\tif (item2 === false && item1 === 0) return true;\n\t\t}\n\n\t\tif (typeof item1 === 'boolean' && typeof item2 === 'string') {\n\t\t\tif (item1 === true && item2 === '1') return true;\n\t\t\tif (item1 === false && item2 === '0') return true;\n\t\t}\n\n\t\tif (typeof item2 === 'boolean' && typeof item1 === 'string') {\n\t\t\tif (item2 === true && item1 === '1') return true;\n\t\t\tif (item2 === false && item1 === '0') return true;\n\t\t}\n\n\t\treturn isEqual(item1, item2);\n\t};\n};\n\nexport function wrapData(data: IDataObject | IDataObject[]): INodeExecutionData[] {\n\tif (!Array.isArray(data)) {\n\t\treturn [{ json: data }];\n\t}\n\treturn data.map((item) => ({\n\t\tjson: item,\n\t}));\n}\n\nexport const keysToLowercase = <T>(headers: T) => {\n\tif (typeof headers !== 'object' || Array.isArray(headers) || headers === null) return headers;\n\treturn Object.entries(headers).reduce((acc, [key, value]) => {\n\t\tacc[key.toLowerCase()] = value as IDataObject;\n\t\treturn acc;\n\t}, {} as IDataObject);\n};\n\n/**\n * Formats a private key by removing unnecessary whitespace and adding line breaks.\n * @param privateKey - The private key to format.\n * @returns The formatted private key.\n */\nexport function formatPrivateKey(privateKey: string, keyIsPublic = false): string {\n\tlet regex = /(PRIVATE KEY|CERTIFICATE)/;\n\tif (keyIsPublic) {\n\t\tregex = /(PUBLIC KEY)/;\n\t}\n\tif (!privateKey || /\\n/.test(privateKey)) {\n\t\treturn privateKey;\n\t}\n\tlet formattedPrivateKey = '';\n\tconst parts = privateKey.split('-----').filter((item) => item !== '');\n\tparts.forEach((part) => {\n\t\tif (regex.test(part)) {\n\t\t\tformattedPrivateKey += `-----${part}-----`;\n\t\t} else {\n\t\t\tconst passRegex = /Proc-Type|DEK-Info/;\n\t\t\tif (passRegex.test(part)) {\n\t\t\t\tpart = part.replace(/:\\s+/g, ':');\n\t\t\t\tformattedPrivateKey += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t} else {\n\t\t\t\tformattedPrivateKey += part.replace(/\\\\n/g, '\\n').replace(/\\s+/g, '\\n');\n\t\t\t}\n\t\t}\n\t});\n\treturn formattedPrivateKey;\n}\n\n/**\n * @TECH_DEBT Explore replacing with handlebars\n */\nexport function getResolvables(expression: string) {\n\tif (!expression) return [];\n\n\tconst resolvables = [];\n\tconst resolvableRegex = /({{[\\s\\S]*?}})/g;\n\n\tlet match;\n\n\twhile ((match = resolvableRegex.exec(expression)) !== null) {\n\t\tif (match[1]) {\n\t\t\tresolvables.push(match[1]);\n\t\t}\n\t}\n\n\treturn resolvables;\n}\n\n/**\n * Flattens an object with deep data\n *\n * @param {IDataObject} data The object to flatten\n */\nexport function flattenObject(data: IDataObject) {\n\tconst returnData: IDataObject = {};\n\tfor (const key1 of Object.keys(data)) {\n\t\tif (data[key1] !== null && typeof data[key1] === 'object') {\n\t\t\tif (data[key1] instanceof Date) {\n\t\t\t\treturnData[key1] = data[key1]?.toString();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst flatObject = flattenObject(data[key1] as IDataObject);\n\t\t\tfor (const key2 in flatObject) {\n\t\t\t\tif (flatObject[key2] === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturnData[`${key1}.${key2}`] = flatObject[key2];\n\t\t\t}\n\t\t} else {\n\t\t\treturnData[key1] = data[key1];\n\t\t}\n\t}\n\treturn returnData;\n}\n\n/**\n * Capitalizes the first letter of a string\n *\n * @param {string} string The string to capitalize\n */\nexport function capitalize(str: string): string {\n\tif (!str) return str;\n\n\tconst chars = str.split('');\n\tchars[0] = chars[0].toUpperCase();\n\n\treturn chars.join('');\n}\n\nexport function generatePairedItemData(length: number): IPairedItemData[] {\n\treturn Array.from({ length }, (_, item) => ({\n\t\titem,\n\t}));\n}\n\n/**\n * Output Paired Item Data Array\n *\n * @param {number | IPairedItemData | IPairedItemData[] | undefined} pairedItem\n */\nexport function preparePairedItemDataArray(\n\tpairedItem: number | IPairedItemData | IPairedItemData[] | undefined,\n): IPairedItemData[] {\n\tif (pairedItem === undefined) return [];\n\tif (typeof pairedItem === 'number') return [{ item: pairedItem }];\n\tif (Array.isArray(pairedItem)) return pairedItem;\n\treturn [pairedItem];\n}\n\nexport const sanitizeDataPathKey = (item: IDataObject, key: string) => {\n\tif (item[key] !== undefined) {\n\t\treturn key;\n\t}\n\n\tif (\n\t\t(key.startsWith(\"['\") && key.endsWith(\"']\")) ||\n\t\t(key.startsWith('[\"') && key.endsWith('\"]'))\n\t) {\n\t\tkey = key.slice(2, -2);\n\t\tif (item[key] !== undefined) {\n\t\t\treturn key;\n\t\t}\n\t}\n\treturn key;\n};\n\n/**\n * Escape HTML\n *\n * @param {string} text The text to escape\n */\nexport function escapeHtml(text: string): string {\n\tif (!text) return '';\n\treturn text.replace(/&amp;|&lt;|&gt;|&#39;|&quot;/g, (match) => {\n\t\tswitch (match) {\n\t\t\tcase '&amp;':\n\t\t\t\treturn '&';\n\t\t\tcase '&lt;':\n\t\t\t\treturn '<';\n\t\t\tcase '&gt;':\n\t\t\t\treturn '>';\n\t\t\tcase '&#39;':\n\t\t\t\treturn \"'\";\n\t\t\tcase '&quot;':\n\t\t\t\treturn '\"';\n\t\t\tdefault:\n\t\t\t\treturn match;\n\t\t}\n\t});\n}\n\n/**\n * Sorts each item json's keys by a priority list\n *\n * @param {INodeExecutionData[]} data The array of items which keys will be sorted\n * @param {string[]} priorityList The priority list, keys of item.json will be sorted in this order first then alphabetically\n */\nexport function sortItemKeysByPriorityList(data: INodeExecutionData[], priorityList: string[]) {\n\treturn data.map((item) => {\n\t\tconst itemKeys = Object.keys(item.json);\n\n\t\tconst updatedKeysOrder = itemKeys.sort((a, b) => {\n\t\t\tconst indexA = priorityList.indexOf(a);\n\t\t\tconst indexB = priorityList.indexOf(b);\n\n\t\t\tif (indexA !== -1 && indexB !== -1) {\n\t\t\t\treturn indexA - indexB;\n\t\t\t} else if (indexA !== -1) {\n\t\t\t\treturn -1;\n\t\t\t} else if (indexB !== -1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn a.localeCompare(b);\n\t\t});\n\n\t\tconst updatedItem: IDataObject = {};\n\t\tfor (const key of updatedKeysOrder) {\n\t\t\tupdatedItem[key] = item.json[key];\n\t\t}\n\n\t\titem.json = updatedItem;\n\t\treturn item;\n\t});\n}\n\nexport function createUtmCampaignLink(nodeType: string, instanceId?: string) {\n\treturn `https://n8n.io/?utm_source=n8n-internal&utm_medium=powered_by&utm_campaign=${encodeURIComponent(\n\t\tnodeType,\n\t)}${instanceId ? '_' + instanceId : ''}`;\n}\n"],"mappings":"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","names":["isObject","reduce","merge","isEqual","get","isNull"]}
@@ -35,7 +35,7 @@ __export(GenericFunctions_exports, {
35
35
  });
36
36
  module.exports = __toCommonJS(GenericFunctions_exports);
37
37
  var import_generate_schema = require("generate-schema");
38
- var import_lodash = __toESM(require("lodash"));
38
+ var import_pickBy = __toESM(require("lodash/pickBy"));
39
39
  var import_n8n_workflow = require("n8n-workflow");
40
40
  var import_constants = require("./constants");
41
41
  const SUPPORTED_TYPES = import_constants.TYPE_OPTIONS.map((x) => x.value);
@@ -142,7 +142,7 @@ function getCurrentWorkflowInputData() {
142
142
  const filteredInputData = inputData.map(({ json, binary }, index) => ({
143
143
  index,
144
144
  pairedItem: { item: index },
145
- json: import_lodash.default.pickBy(json, (_v, key) => !removedKeys.has(key)),
145
+ json: (0, import_pickBy.default)(json, (_v, key) => !removedKeys.has(key)),
146
146
  binary
147
147
  }));
148
148
  return filteredInputData;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../utils/workflowInputsResourceMapping/GenericFunctions.ts"],"sourcesContent":["import { json as generateSchemaFromExample, type SchemaObject } from 'generate-schema';\nimport type { JSONSchema7 } from 'json-schema';\nimport _ from 'lodash';\nimport type {\n\tFieldValueOption,\n\tFieldType,\n\tIWorkflowNodeContext,\n\tINodeExecutionData,\n\tIDataObject,\n\tResourceMapperField,\n\tILocalLoadOptionsFunctions,\n\tWorkflowInputsData,\n\tIExecuteFunctions,\n\tISupplyDataFunctions,\n} from 'n8n-workflow';\nimport { jsonParse, NodeOperationError, EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE } from 'n8n-workflow';\n\nimport {\n\tJSON_EXAMPLE,\n\tINPUT_SOURCE,\n\tWORKFLOW_INPUTS,\n\tVALUES,\n\tTYPE_OPTIONS,\n\tPASSTHROUGH,\n} from './constants';\n\nconst SUPPORTED_TYPES = TYPE_OPTIONS.map((x) => x.value);\n\nfunction parseJsonSchema(schema: JSONSchema7): FieldValueOption[] | string {\n\tif (schema.type !== 'object') {\n\t\tif (schema.type === undefined) {\n\t\t\treturn 'Invalid JSON schema. Missing key `type` in schema';\n\t\t}\n\n\t\tif (Array.isArray(schema.type)) {\n\t\t\treturn `Invalid JSON schema type. Only object type is supported, but got an array of types: ${schema.type.join(', ')}`;\n\t\t}\n\n\t\treturn `Invalid JSON schema type. Only object type is supported, but got ${schema.type}`;\n\t}\n\n\tif (!schema?.properties) {\n\t\treturn 'Invalid JSON schema. Missing key `properties` in schema';\n\t}\n\n\tif (typeof schema.properties !== 'object') {\n\t\treturn 'Invalid JSON schema. Key `properties` is not an object';\n\t}\n\n\tconst result: FieldValueOption[] = [];\n\tfor (const [name, v] of Object.entries(schema.properties)) {\n\t\tif (typeof v !== 'object') {\n\t\t\treturn `Invalid JSON schema. Value for property '${name}' is not an object`;\n\t\t}\n\n\t\tconst type = v?.type;\n\n\t\tif (type === 'null') {\n\t\t\tresult.push({ name, type: 'any' });\n\t\t} else if (Array.isArray(type)) {\n\t\t\t// Schema allows an array of types, but we don't\n\t\t\treturn `Invalid JSON schema. Array of types for property '${name}' is not supported by n8n. Either provide a single type or use type 'any' to allow any type`;\n\t\t} else if (typeof type !== 'string') {\n\t\t\treturn `Invalid JSON schema. Unexpected non-string type ${type} for property '${name}'`;\n\t\t} else if (!SUPPORTED_TYPES.includes(type as never)) {\n\t\t\treturn `Invalid JSON schema. Unsupported type ${type} for property '${name}'. Supported types are ${JSON.stringify(SUPPORTED_TYPES, null, 1)}`;\n\t\t} else {\n\t\t\tresult.push({ name, type: type as FieldType });\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction parseJsonExample(context: IWorkflowNodeContext): JSONSchema7 {\n\tconst jsonString = context.getNodeParameter(JSON_EXAMPLE, 0, '') as string;\n\tconst json = jsonParse<SchemaObject>(jsonString);\n\n\treturn generateSchemaFromExample(json) as JSONSchema7;\n}\n\nexport function getFieldEntries(context: IWorkflowNodeContext): {\n\tdataMode: WorkflowInputsData['dataMode'];\n\tfields: FieldValueOption[];\n\tsubworkflowInfo?: WorkflowInputsData['subworkflowInfo'];\n} {\n\tconst inputSource = context.getNodeParameter(INPUT_SOURCE, 0, PASSTHROUGH);\n\tlet result: FieldValueOption[] | string = 'Internal Error: Invalid input source';\n\ttry {\n\t\tif (inputSource === WORKFLOW_INPUTS) {\n\t\t\tresult = context.getNodeParameter(\n\t\t\t\t`${WORKFLOW_INPUTS}.${VALUES}`,\n\t\t\t\t0,\n\t\t\t\t[],\n\t\t\t) as FieldValueOption[];\n\t\t} else if (inputSource === JSON_EXAMPLE) {\n\t\t\tconst schema = parseJsonExample(context);\n\t\t\tresult = parseJsonSchema(schema);\n\t\t} else if (inputSource === PASSTHROUGH) {\n\t\t\tresult = [];\n\t\t}\n\t} catch (e: unknown) {\n\t\tresult =\n\t\t\te && typeof e === 'object' && 'message' in e && typeof e.message === 'string'\n\t\t\t\t? e.message\n\t\t\t\t: `Unknown error occurred: ${JSON.stringify(e)}`;\n\t}\n\n\tif (Array.isArray(result)) {\n\t\tconst dataMode = String(inputSource);\n\t\tconst workflow = context.getWorkflow();\n\t\tconst node = context.getNode();\n\t\treturn {\n\t\t\tfields: result,\n\t\t\tdataMode,\n\t\t\tsubworkflowInfo: { workflowId: workflow.id, triggerId: node.id },\n\t\t};\n\t}\n\tthrow new NodeOperationError(context.getNode(), result);\n}\n\nexport function getWorkflowInputValues(\n\tthis: IExecuteFunctions | ISupplyDataFunctions,\n): INodeExecutionData[] {\n\tconst inputData = this.getInputData();\n\n\treturn inputData.map(({ json, binary }, itemIndex) => {\n\t\tconst itemFieldValues = this.getNodeParameter(\n\t\t\t'workflowInputs.value',\n\t\t\titemIndex,\n\t\t\t{},\n\t\t) as IDataObject;\n\n\t\treturn {\n\t\t\tjson: {\n\t\t\t\t...json,\n\t\t\t\t...itemFieldValues,\n\t\t\t},\n\t\t\tindex: itemIndex,\n\t\t\tpairedItem: {\n\t\t\t\titem: itemIndex,\n\t\t\t},\n\t\t\tbinary,\n\t\t};\n\t});\n}\n\nexport function getCurrentWorkflowInputData(this: IExecuteFunctions | ISupplyDataFunctions) {\n\tconst inputData: INodeExecutionData[] = getWorkflowInputValues.call(this);\n\n\tconst schema = this.getNodeParameter('workflowInputs.schema', 0, []) as ResourceMapperField[];\n\n\tif (schema.length === 0) {\n\t\treturn inputData;\n\t} else {\n\t\tconst removedKeys = new Set(schema.filter((x) => x.removed).map((x) => x.displayName));\n\n\t\tconst filteredInputData: INodeExecutionData[] = inputData.map(({ json, binary }, index) => ({\n\t\t\tindex,\n\t\t\tpairedItem: { item: index },\n\t\t\tjson: _.pickBy(json, (_v, key) => !removedKeys.has(key)),\n\t\t\tbinary,\n\t\t}));\n\n\t\treturn filteredInputData;\n\t}\n}\n\nexport async function loadWorkflowInputMappings(\n\tthis: ILocalLoadOptionsFunctions,\n): Promise<WorkflowInputsData> {\n\tconst nodeLoadContext = await this.getWorkflowNodeContext(EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE);\n\tlet fields: ResourceMapperField[] = [];\n\tlet dataMode: string = PASSTHROUGH;\n\tlet subworkflowInfo: { workflowId?: string; triggerId?: string } | undefined;\n\n\tif (nodeLoadContext) {\n\t\tconst fieldValues = getFieldEntries(nodeLoadContext);\n\t\tdataMode = fieldValues.dataMode;\n\t\tsubworkflowInfo = fieldValues.subworkflowInfo;\n\n\t\tfields = fieldValues.fields.map((currentWorkflowInput) => {\n\t\t\tconst field: ResourceMapperField = {\n\t\t\t\tid: currentWorkflowInput.name,\n\t\t\t\tdisplayName: currentWorkflowInput.name,\n\t\t\t\trequired: false,\n\t\t\t\tdefaultMatch: false,\n\t\t\t\tdisplay: true,\n\t\t\t\tcanBeUsedToMatch: true,\n\t\t\t};\n\n\t\t\tif (currentWorkflowInput.type !== 'any') {\n\t\t\t\tfield.type = currentWorkflowInput.type;\n\t\t\t}\n\n\t\t\treturn field;\n\t\t});\n\t}\n\treturn { fields, dataMode, subworkflowInfo };\n}\n"],"mappings":"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","names":["generateSchemaFromExample","_"]}
1
+ {"version":3,"sources":["../../../utils/workflowInputsResourceMapping/GenericFunctions.ts"],"sourcesContent":["import { json as generateSchemaFromExample, type SchemaObject } from 'generate-schema';\nimport type { JSONSchema7 } from 'json-schema';\nimport pickBy from 'lodash/pickBy';\nimport type {\n\tFieldValueOption,\n\tFieldType,\n\tIWorkflowNodeContext,\n\tINodeExecutionData,\n\tIDataObject,\n\tResourceMapperField,\n\tILocalLoadOptionsFunctions,\n\tWorkflowInputsData,\n\tIExecuteFunctions,\n\tISupplyDataFunctions,\n} from 'n8n-workflow';\nimport { jsonParse, NodeOperationError, EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE } from 'n8n-workflow';\n\nimport {\n\tJSON_EXAMPLE,\n\tINPUT_SOURCE,\n\tWORKFLOW_INPUTS,\n\tVALUES,\n\tTYPE_OPTIONS,\n\tPASSTHROUGH,\n} from './constants';\n\nconst SUPPORTED_TYPES = TYPE_OPTIONS.map((x) => x.value);\n\nfunction parseJsonSchema(schema: JSONSchema7): FieldValueOption[] | string {\n\tif (schema.type !== 'object') {\n\t\tif (schema.type === undefined) {\n\t\t\treturn 'Invalid JSON schema. Missing key `type` in schema';\n\t\t}\n\n\t\tif (Array.isArray(schema.type)) {\n\t\t\treturn `Invalid JSON schema type. Only object type is supported, but got an array of types: ${schema.type.join(', ')}`;\n\t\t}\n\n\t\treturn `Invalid JSON schema type. Only object type is supported, but got ${schema.type}`;\n\t}\n\n\tif (!schema?.properties) {\n\t\treturn 'Invalid JSON schema. Missing key `properties` in schema';\n\t}\n\n\tif (typeof schema.properties !== 'object') {\n\t\treturn 'Invalid JSON schema. Key `properties` is not an object';\n\t}\n\n\tconst result: FieldValueOption[] = [];\n\tfor (const [name, v] of Object.entries(schema.properties)) {\n\t\tif (typeof v !== 'object') {\n\t\t\treturn `Invalid JSON schema. Value for property '${name}' is not an object`;\n\t\t}\n\n\t\tconst type = v?.type;\n\n\t\tif (type === 'null') {\n\t\t\tresult.push({ name, type: 'any' });\n\t\t} else if (Array.isArray(type)) {\n\t\t\t// Schema allows an array of types, but we don't\n\t\t\treturn `Invalid JSON schema. Array of types for property '${name}' is not supported by n8n. Either provide a single type or use type 'any' to allow any type`;\n\t\t} else if (typeof type !== 'string') {\n\t\t\treturn `Invalid JSON schema. Unexpected non-string type ${type} for property '${name}'`;\n\t\t} else if (!SUPPORTED_TYPES.includes(type as never)) {\n\t\t\treturn `Invalid JSON schema. Unsupported type ${type} for property '${name}'. Supported types are ${JSON.stringify(SUPPORTED_TYPES, null, 1)}`;\n\t\t} else {\n\t\t\tresult.push({ name, type: type as FieldType });\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction parseJsonExample(context: IWorkflowNodeContext): JSONSchema7 {\n\tconst jsonString = context.getNodeParameter(JSON_EXAMPLE, 0, '') as string;\n\tconst json = jsonParse<SchemaObject>(jsonString);\n\n\treturn generateSchemaFromExample(json) as JSONSchema7;\n}\n\nexport function getFieldEntries(context: IWorkflowNodeContext): {\n\tdataMode: WorkflowInputsData['dataMode'];\n\tfields: FieldValueOption[];\n\tsubworkflowInfo?: WorkflowInputsData['subworkflowInfo'];\n} {\n\tconst inputSource = context.getNodeParameter(INPUT_SOURCE, 0, PASSTHROUGH);\n\tlet result: FieldValueOption[] | string = 'Internal Error: Invalid input source';\n\ttry {\n\t\tif (inputSource === WORKFLOW_INPUTS) {\n\t\t\tresult = context.getNodeParameter(\n\t\t\t\t`${WORKFLOW_INPUTS}.${VALUES}`,\n\t\t\t\t0,\n\t\t\t\t[],\n\t\t\t) as FieldValueOption[];\n\t\t} else if (inputSource === JSON_EXAMPLE) {\n\t\t\tconst schema = parseJsonExample(context);\n\t\t\tresult = parseJsonSchema(schema);\n\t\t} else if (inputSource === PASSTHROUGH) {\n\t\t\tresult = [];\n\t\t}\n\t} catch (e: unknown) {\n\t\tresult =\n\t\t\te && typeof e === 'object' && 'message' in e && typeof e.message === 'string'\n\t\t\t\t? e.message\n\t\t\t\t: `Unknown error occurred: ${JSON.stringify(e)}`;\n\t}\n\n\tif (Array.isArray(result)) {\n\t\tconst dataMode = String(inputSource);\n\t\tconst workflow = context.getWorkflow();\n\t\tconst node = context.getNode();\n\t\treturn {\n\t\t\tfields: result,\n\t\t\tdataMode,\n\t\t\tsubworkflowInfo: { workflowId: workflow.id, triggerId: node.id },\n\t\t};\n\t}\n\tthrow new NodeOperationError(context.getNode(), result);\n}\n\nexport function getWorkflowInputValues(\n\tthis: IExecuteFunctions | ISupplyDataFunctions,\n): INodeExecutionData[] {\n\tconst inputData = this.getInputData();\n\n\treturn inputData.map(({ json, binary }, itemIndex) => {\n\t\tconst itemFieldValues = this.getNodeParameter(\n\t\t\t'workflowInputs.value',\n\t\t\titemIndex,\n\t\t\t{},\n\t\t) as IDataObject;\n\n\t\treturn {\n\t\t\tjson: {\n\t\t\t\t...json,\n\t\t\t\t...itemFieldValues,\n\t\t\t},\n\t\t\tindex: itemIndex,\n\t\t\tpairedItem: {\n\t\t\t\titem: itemIndex,\n\t\t\t},\n\t\t\tbinary,\n\t\t};\n\t});\n}\n\nexport function getCurrentWorkflowInputData(this: IExecuteFunctions | ISupplyDataFunctions) {\n\tconst inputData: INodeExecutionData[] = getWorkflowInputValues.call(this);\n\n\tconst schema = this.getNodeParameter('workflowInputs.schema', 0, []) as ResourceMapperField[];\n\n\tif (schema.length === 0) {\n\t\treturn inputData;\n\t} else {\n\t\tconst removedKeys = new Set(schema.filter((x) => x.removed).map((x) => x.displayName));\n\n\t\tconst filteredInputData: INodeExecutionData[] = inputData.map(({ json, binary }, index) => ({\n\t\t\tindex,\n\t\t\tpairedItem: { item: index },\n\t\t\tjson: pickBy(json, (_v, key) => !removedKeys.has(key)),\n\t\t\tbinary,\n\t\t}));\n\n\t\treturn filteredInputData;\n\t}\n}\n\nexport async function loadWorkflowInputMappings(\n\tthis: ILocalLoadOptionsFunctions,\n): Promise<WorkflowInputsData> {\n\tconst nodeLoadContext = await this.getWorkflowNodeContext(EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE);\n\tlet fields: ResourceMapperField[] = [];\n\tlet dataMode: string = PASSTHROUGH;\n\tlet subworkflowInfo: { workflowId?: string; triggerId?: string } | undefined;\n\n\tif (nodeLoadContext) {\n\t\tconst fieldValues = getFieldEntries(nodeLoadContext);\n\t\tdataMode = fieldValues.dataMode;\n\t\tsubworkflowInfo = fieldValues.subworkflowInfo;\n\n\t\tfields = fieldValues.fields.map((currentWorkflowInput) => {\n\t\t\tconst field: ResourceMapperField = {\n\t\t\t\tid: currentWorkflowInput.name,\n\t\t\t\tdisplayName: currentWorkflowInput.name,\n\t\t\t\trequired: false,\n\t\t\t\tdefaultMatch: false,\n\t\t\t\tdisplay: true,\n\t\t\t\tcanBeUsedToMatch: true,\n\t\t\t};\n\n\t\t\tif (currentWorkflowInput.type !== 'any') {\n\t\t\t\tfield.type = currentWorkflowInput.type;\n\t\t\t}\n\n\t\t\treturn field;\n\t\t});\n\t}\n\treturn { fields, dataMode, subworkflowInfo };\n}\n"],"mappings":"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","names":["generateSchemaFromExample","pickBy"]}