n8n-nodes-base 1.87.0 → 1.89.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/credentials/Aws.credentials.js +16 -2
  2. package/dist/credentials/Aws.credentials.js.map +1 -1
  3. package/dist/credentials/SalesforceJwtApi.credentials.js +60 -0
  4. package/dist/credentials/SalesforceJwtApi.credentials.js.map +1 -1
  5. package/dist/nodes/Airtable/v2/actions/record/update.operation.js +15 -3
  6. package/dist/nodes/Airtable/v2/actions/record/update.operation.js.map +1 -1
  7. package/dist/nodes/Brevo/__schema__/v1.0.0/contact/getAll.json +1 -9
  8. package/dist/nodes/Dropbox/__schema__/v1.0.0/file/download.json +2 -5
  9. package/dist/nodes/Form/utils.js +2 -7
  10. package/dist/nodes/Form/utils.js.map +1 -1
  11. package/dist/nodes/Freshdesk/Freshdesk.node.js +3 -6
  12. package/dist/nodes/Freshdesk/Freshdesk.node.js.map +1 -1
  13. package/dist/nodes/Google/Analytics/__schema__/v2.0.0/report/get.json +2 -2
  14. package/dist/nodes/Google/Calendar/__schema__/v1.3.0/event/getAll.json +7 -1
  15. package/dist/nodes/Google/Firebase/CloudFirestore/__schema__/v1.1.0/document/get.json +1 -13
  16. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/message/get.json +1 -7
  17. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/message/getAll.json +1 -7
  18. package/dist/nodes/Google/Gmail/__schema__/v2.1.0/thread/get.json +4 -4
  19. package/dist/nodes/Google/YouTube/__schema__/v1.0.0/video/get.json +1 -35
  20. package/dist/nodes/Google/YouTube/__schema__/v1.0.0/video/rate.json +9 -0
  21. package/dist/nodes/HaloPSA/__schema__/v1.0.0/client/getAll.json +147 -1
  22. package/dist/nodes/HttpRequest/V3/Description.js +8 -0
  23. package/dist/nodes/HttpRequest/V3/Description.js.map +1 -1
  24. package/dist/nodes/HttpRequest/V3/HttpRequestV3.node.js +23 -5
  25. package/dist/nodes/HttpRequest/V3/HttpRequestV3.node.js.map +1 -1
  26. package/dist/nodes/HttpRequest/shared/optimizeResponse.js +387 -0
  27. package/dist/nodes/HttpRequest/shared/optimizeResponse.js.map +1 -0
  28. package/dist/nodes/Hubspot/V2/HubspotV2.node.js +10 -2
  29. package/dist/nodes/Hubspot/V2/HubspotV2.node.js.map +1 -1
  30. package/dist/nodes/Hubspot/__schema__/v2.1.0/company/getAll.json +1 -4
  31. package/dist/nodes/Hubspot/__schema__/v2.1.0/contact/search.json +4 -1
  32. package/dist/nodes/Hubspot/__schema__/v2.1.0/deal/getAll.json +1 -52
  33. package/dist/nodes/Hubspot/__schema__/v2.1.0/deal/search.json +5 -2
  34. package/dist/nodes/Hubspot/__schema__/v2.1.0/ticket/get.json +1 -258
  35. package/dist/nodes/ItemLists/__schema__/v3.0.0/itemList/limit.json +9 -0
  36. package/dist/nodes/Jira/__schema__/v1.0.0/issue/get.json +84 -1
  37. package/dist/nodes/Jira/__schema__/v1.0.0/issue/getAll.json +4 -565
  38. package/dist/nodes/Lemlist/__schema__/v2.0.0/campaign/getAll.json +1 -10
  39. package/dist/nodes/Linear/__schema__/v1.0.0/issue/create.json +12 -1
  40. package/dist/nodes/LinkedIn/GenericFunctions.js +1 -1
  41. package/dist/nodes/LinkedIn/GenericFunctions.js.map +1 -1
  42. package/dist/nodes/Microsoft/OneDrive/__schema__/v1.0.0/file/download.json +92 -1
  43. package/dist/nodes/Microsoft/Outlook/__schema__/v2.0.0/folderMessage/getAll.json +3 -81
  44. package/dist/nodes/Microsoft/Outlook/__schema__/v2.0.0/message/get.json +28 -1
  45. package/dist/nodes/Microsoft/Outlook/__schema__/v2.0.0/message/getAll.json +82 -1
  46. package/dist/nodes/Nasa/__schema__/v1.0.0/donkiSolarFlare/get.json +4 -1
  47. package/dist/nodes/Notion/__schema__/v2.2.0/databasePage/create.json +1 -4
  48. package/dist/nodes/Notion/__schema__/v2.2.0/databasePage/getAll.json +1 -4
  49. package/dist/nodes/Odoo/__schema__/v1.0.0/custom/get.json +1 -4
  50. package/dist/nodes/Odoo/__schema__/v1.0.0/custom/getAll.json +4 -1
  51. package/dist/nodes/Odoo/__schema__/v1.0.0/opportunity/getAll.json +1 -4
  52. package/dist/nodes/Phantombuster/__schema__/v1.0.0/agent/getOutput.json +1 -10
  53. package/dist/nodes/Pipedrive/__schema__/v1.0.0/person/search.json +12 -1
  54. package/dist/nodes/Postgres/v2/helpers/utils.js +3 -1
  55. package/dist/nodes/Postgres/v2/helpers/utils.js.map +1 -1
  56. package/dist/nodes/RespondToWebhook/RespondToWebhook.node.js +57 -48
  57. package/dist/nodes/RespondToWebhook/RespondToWebhook.node.js.map +1 -1
  58. package/dist/nodes/Salesforce/__schema__/v1.0.0/customObject/getAll.json +2 -2
  59. package/dist/nodes/Salesforce/__schema__/v1.0.0/opportunity/getAll.json +4 -1
  60. package/dist/nodes/Salesforce/__schema__/v1.0.0/search/query.json +1 -4
  61. package/dist/nodes/ServiceNow/__schema__/v1.0.0/tableRecord/getAll.json +1 -4
  62. package/dist/nodes/Slack/__schema__/v2.3.0/channel/history.json +4 -44
  63. package/dist/nodes/Ssh/__schema__/v1.0.0/command/execute.json +1 -4
  64. package/dist/nodes/Supabase/GenericFunctions.js +13 -4
  65. package/dist/nodes/Supabase/GenericFunctions.js.map +1 -1
  66. package/dist/nodes/Supabase/RowDescription.js +1 -0
  67. package/dist/nodes/Supabase/RowDescription.js.map +1 -1
  68. package/dist/nodes/Supabase/Supabase.node.js +17 -0
  69. package/dist/nodes/Supabase/Supabase.node.js.map +1 -1
  70. package/dist/nodes/Supabase/__schema__/v1.0.0/row/delete.json +7 -1
  71. package/dist/nodes/Telegram/TelegramTrigger.node.js +4 -60
  72. package/dist/nodes/Telegram/TelegramTrigger.node.js.map +1 -1
  73. package/dist/nodes/Telegram/__schema__/v1.2.0/chat/get.json +1 -10
  74. package/dist/nodes/Telegram/__schema__/v1.2.0/chat/member.json +1 -4
  75. package/dist/nodes/Telegram/util/triggerUtils.js +88 -0
  76. package/dist/nodes/Telegram/util/triggerUtils.js.map +1 -0
  77. package/dist/nodes/Transform/Summarize/utils.js +1 -1
  78. package/dist/nodes/Transform/Summarize/utils.js.map +1 -1
  79. package/dist/nodes/Trello/__schema__/v1.0.0/list/getAll.json +1 -4
  80. package/dist/nodes/Trello/__schema__/v1.0.0/list/getCards.json +4 -7
  81. package/dist/nodes/Twitter/__schema__/v2.0.0/tweet/search.json +1 -4
  82. package/dist/nodes/Wait/Wait.node.js +5 -6
  83. package/dist/nodes/Wait/Wait.node.js.map +1 -1
  84. package/dist/nodes/Wordpress/__schema__/v1.0.0/post/getAll.json +9 -1
  85. package/dist/nodes/Zoho/__schema__/v1.0.0/contact/getAll.json +1 -15
  86. package/dist/test/nodes/FakeCredentialsMap.js +30 -0
  87. package/dist/test/nodes/FakeCredentialsMap.js.map +1 -1
  88. package/dist/test/nodes/Helpers.js +5 -3
  89. package/dist/test/nodes/Helpers.js.map +1 -1
  90. package/dist/test/nodes/TriggerHelpers.js +5 -2
  91. package/dist/test/nodes/TriggerHelpers.js.map +1 -1
  92. package/dist/types/credentials.json +1 -1
  93. package/dist/types/nodes.json +5 -5
  94. package/package.json +11 -9
@@ -453,13 +453,27 @@ class Aws {
453
453
  body = "";
454
454
  }
455
455
  path = endpoint.pathname + endpoint.search;
456
+ const requestWithForm = requestOptions;
457
+ let bodyContent = body !== "" ? body : void 0;
458
+ let contentTypeHeader = void 0;
459
+ if (requestWithForm.form) {
460
+ const params = new URLSearchParams();
461
+ for (const key in requestWithForm.form) {
462
+ params.append(key, requestWithForm.form[key]);
463
+ }
464
+ bodyContent = params.toString();
465
+ contentTypeHeader = "application/x-www-form-urlencoded";
466
+ }
456
467
  const signOpts = {
457
468
  ...requestOptions,
458
- headers: requestOptions.headers ?? {},
469
+ headers: {
470
+ ...requestOptions.headers ?? {},
471
+ ...contentTypeHeader && { "content-type": contentTypeHeader }
472
+ },
459
473
  host: endpoint.host,
460
474
  method,
461
475
  path,
462
- body: body !== "" ? body : void 0,
476
+ body: bodyContent,
463
477
  region
464
478
  };
465
479
  const securityHeaders = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../credentials/Aws.credentials.ts"],"sourcesContent":["import type { Request } from 'aws4';\nimport { sign } from 'aws4';\nimport type {\n\tICredentialDataDecryptedObject,\n\tICredentialTestRequest,\n\tICredentialType,\n\tIDataObject,\n\tIHttpRequestOptions,\n\tINodeProperties,\n\tIRequestOptions,\n} from 'n8n-workflow';\nimport { isObjectEmpty } from 'n8n-workflow';\n\nexport const regions = [\n\t{\n\t\tname: 'af-south-1',\n\t\tdisplayName: 'Africa',\n\t\tlocation: 'Cape Town',\n\t},\n\t{\n\t\tname: 'ap-east-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Hong Kong',\n\t},\n\t{\n\t\tname: 'ap-south-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Mumbai',\n\t},\n\t{\n\t\tname: 'ap-south-2',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Hyderabad',\n\t},\n\t{\n\t\tname: 'ap-southeast-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Singapore',\n\t},\n\t{\n\t\tname: 'ap-southeast-2',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Sydney',\n\t},\n\t{\n\t\tname: 'ap-southeast-3',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Jakarta',\n\t},\n\t{\n\t\tname: 'ap-southeast-4',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Melbourne',\n\t},\n\t{\n\t\tname: 'ap-southeast-5',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Malaysia',\n\t},\n\t{\n\t\tname: 'ap-southeast-7',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Thailand',\n\t},\n\t{\n\t\tname: 'ap-northeast-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Tokyo',\n\t},\n\t{\n\t\tname: 'ap-northeast-2',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Seoul',\n\t},\n\t{\n\t\tname: 'ap-northeast-3',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Osaka',\n\t},\n\t{\n\t\tname: 'ca-central-1',\n\t\tdisplayName: 'Canada',\n\t\tlocation: 'Central',\n\t},\n\t{\n\t\tname: 'ca-west-1',\n\t\tdisplayName: 'Canada West',\n\t\tlocation: 'Calgary',\n\t},\n\t{\n\t\tname: 'cn-north-1',\n\t\tdisplayName: 'China',\n\t\tlocation: 'Beijing',\n\t},\n\t{\n\t\tname: 'cn-northwest-1',\n\t\tdisplayName: 'China',\n\t\tlocation: 'Ningxia',\n\t},\n\t{\n\t\tname: 'eu-central-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Frankfurt',\n\t},\n\t{\n\t\tname: 'eu-central-2',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Zurich',\n\t},\n\t{\n\t\tname: 'eu-north-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Stockholm',\n\t},\n\t{\n\t\tname: 'eu-south-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Milan',\n\t},\n\t{\n\t\tname: 'eu-south-2',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Spain',\n\t},\n\t{\n\t\tname: 'eu-west-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Ireland',\n\t},\n\t{\n\t\tname: 'eu-west-2',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'London',\n\t},\n\t{\n\t\tname: 'eu-west-3',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Paris',\n\t},\n\t{\n\t\tname: 'il-central-1',\n\t\tdisplayName: 'Israel',\n\t\tlocation: 'Tel Aviv',\n\t},\n\t{\n\t\tname: 'me-central-1',\n\t\tdisplayName: 'Middle East',\n\t\tlocation: 'UAE',\n\t},\n\t{\n\t\tname: 'me-south-1',\n\t\tdisplayName: 'Middle East',\n\t\tlocation: 'Bahrain',\n\t},\n\t{\n\t\tname: 'mx-central-1',\n\t\tdisplayName: 'Mexico',\n\t\tlocation: 'Central',\n\t},\n\t{\n\t\tname: 'sa-east-1',\n\t\tdisplayName: 'South America',\n\t\tlocation: 'São Paulo',\n\t},\n\t{\n\t\tname: 'us-east-1',\n\t\tdisplayName: 'US East',\n\t\tlocation: 'N. Virginia',\n\t},\n\t{\n\t\tname: 'us-east-2',\n\t\tdisplayName: 'US East',\n\t\tlocation: 'Ohio',\n\t},\n\t{\n\t\tname: 'us-gov-east-1',\n\t\tdisplayName: 'US East',\n\t\tlocation: 'GovCloud',\n\t},\n\t{\n\t\tname: 'us-west-1',\n\t\tdisplayName: 'US West',\n\t\tlocation: 'N. California',\n\t},\n\t{\n\t\tname: 'us-west-2',\n\t\tdisplayName: 'US West',\n\t\tlocation: 'Oregon',\n\t},\n\t{\n\t\tname: 'us-gov-west-1',\n\t\tdisplayName: 'US West',\n\t\tlocation: 'GovCloud',\n\t},\n] as const;\n\nexport type AWSRegion = (typeof regions)[number]['name'];\nexport type AwsCredentialsType = {\n\tregion: AWSRegion;\n\taccessKeyId: string;\n\tsecretAccessKey: string;\n\ttemporaryCredentials: boolean;\n\tcustomEndpoints: boolean;\n\tsessionToken?: string;\n\trekognitionEndpoint?: string;\n\tlambdaEndpoint?: string;\n\tsnsEndpoint?: string;\n\tsesEndpoint?: string;\n\tsqsEndpoint?: string;\n\ts3Endpoint?: string;\n\tssmEndpoint?: string;\n};\n\n// Some AWS services are global and don't have a region\n// https://docs.aws.amazon.com/general/latest/gr/rande.html#global-endpoints\n// Example: iam.amazonaws.com (global), s3.us-east-1.amazonaws.com (regional)\nfunction parseAwsUrl(url: URL): { region: AWSRegion | null; service: string } {\n\tconst [service, region] = url.hostname.replace('amazonaws.com', '').split('.');\n\treturn { service, region: region as AWSRegion };\n}\n\nexport class Aws implements ICredentialType {\n\tname = 'aws';\n\n\tdisplayName = 'AWS';\n\n\tdocumentationUrl = 'aws';\n\n\ticon = { light: 'file:icons/AWS.svg', dark: 'file:icons/AWS.dark.svg' } as const;\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Region',\n\t\t\tname: 'region',\n\t\t\ttype: 'options',\n\t\t\toptions: regions.map((r) => ({\n\t\t\t\tname: `${r.displayName} (${r.location}) - ${r.name}`,\n\t\t\t\tvalue: r.name,\n\t\t\t})),\n\t\t\tdefault: 'us-east-1',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Access Key ID',\n\t\t\tname: 'accessKeyId',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Secret Access Key',\n\t\t\tname: 'secretAccessKey',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Temporary Security Credentials',\n\t\t\tname: 'temporaryCredentials',\n\t\t\tdescription: 'Support for temporary credentials from AWS STS',\n\t\t\ttype: 'boolean',\n\t\t\tdefault: false,\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Session Token',\n\t\t\tname: 'sessionToken',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\ttemporaryCredentials: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Custom Endpoints',\n\t\t\tname: 'customEndpoints',\n\t\t\ttype: 'boolean',\n\t\t\tdefault: false,\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Rekognition Endpoint',\n\t\t\tname: 'rekognitionEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and Rekognition using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://rekognition.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Lambda Endpoint',\n\t\t\tname: 'lambdaEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and Lambda using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://lambda.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SNS Endpoint',\n\t\t\tname: 'snsEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SNS using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://sns.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SES Endpoint',\n\t\t\tname: 'sesEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SES using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://email.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SQS Endpoint',\n\t\t\tname: 'sqsEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SQS using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://sqs.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'S3 Endpoint',\n\t\t\tname: 's3Endpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and S3 using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://s3.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SSM Endpoint',\n\t\t\tname: 'ssmEndpoint',\n\t\t\tdescription: 'Endpoint for AWS Systems Manager (SSM)',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://ssm.{region}.amazonaws.com',\n\t\t},\n\t];\n\n\tasync authenticate(\n\t\trawCredentials: ICredentialDataDecryptedObject,\n\t\trequestOptions: IHttpRequestOptions,\n\t): Promise<IHttpRequestOptions> {\n\t\tconst credentials = rawCredentials as AwsCredentialsType;\n\t\tlet endpoint: URL;\n\t\tlet service = requestOptions.qs?.service as string;\n\t\tlet path = (requestOptions.qs?.path as string) ?? '';\n\t\tconst method = requestOptions.method;\n\t\tlet body = requestOptions.body;\n\n\t\tlet region = credentials.region;\n\t\tif (requestOptions.qs?._region) {\n\t\t\tregion = requestOptions.qs._region as AWSRegion;\n\t\t\tdelete requestOptions.qs._region;\n\t\t}\n\n\t\tlet query = requestOptions.qs?.query as IDataObject;\n\t\t// ! Workaround as we still use the IRequestOptions interface which uses uri instead of url\n\t\t// ! To change when we replace the interface with IHttpRequestOptions\n\t\tconst requestWithUri = requestOptions as unknown as IRequestOptions;\n\t\tif (requestWithUri.uri) {\n\t\t\trequestOptions.url = requestWithUri.uri;\n\t\t\tendpoint = new URL(requestOptions.url);\n\t\t\tif (service === 'sts') {\n\t\t\t\ttry {\n\t\t\t\t\tif (requestWithUri.qs?.Action !== 'GetCallerIdentity') {\n\t\t\t\t\t\tquery = requestWithUri.qs as IDataObject;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tendpoint.searchParams.set('Action', 'GetCallerIdentity');\n\t\t\t\t\t\tendpoint.searchParams.set('Version', '2011-06-15');\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst parsed = parseAwsUrl(endpoint);\n\t\t\tservice = parsed.service;\n\t\t\tif (parsed.region) {\n\t\t\t\tregion = parsed.region;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!requestOptions.baseURL && !requestOptions.url) {\n\t\t\t\tlet endpointString: string;\n\t\t\t\tif (service === 'lambda' && credentials.lambdaEndpoint) {\n\t\t\t\t\tendpointString = credentials.lambdaEndpoint;\n\t\t\t\t} else if (service === 'sns' && credentials.snsEndpoint) {\n\t\t\t\t\tendpointString = credentials.snsEndpoint;\n\t\t\t\t} else if (service === 'sqs' && credentials.sqsEndpoint) {\n\t\t\t\t\tendpointString = credentials.sqsEndpoint;\n\t\t\t\t} else if (service === 's3' && credentials.s3Endpoint) {\n\t\t\t\t\tendpointString = credentials.s3Endpoint;\n\t\t\t\t} else if (service === 'ses' && credentials.sesEndpoint) {\n\t\t\t\t\tendpointString = credentials.sesEndpoint;\n\t\t\t\t} else if (service === 'rekognition' && credentials.rekognitionEndpoint) {\n\t\t\t\t\tendpointString = credentials.rekognitionEndpoint;\n\t\t\t\t} else if (service === 'sqs' && credentials.sqsEndpoint) {\n\t\t\t\t\tendpointString = credentials.sqsEndpoint;\n\t\t\t\t} else if (service) {\n\t\t\t\t\tendpointString = `https://${service}.${region}.amazonaws.com`;\n\t\t\t\t} else if (service === 'ssm' && credentials.ssmEndpoint) {\n\t\t\t\t\tendpointString = credentials.ssmEndpoint;\n\t\t\t\t}\n\t\t\t\tendpoint = new URL(endpointString!.replace('{region}', region) + path);\n\t\t\t} else {\n\t\t\t\t// If no endpoint is set, we try to decompose the path and use the default endpoint\n\t\t\t\tconst customUrl = new URL(`${requestOptions.baseURL!}${requestOptions.url}${path}`);\n\t\t\t\tconst parsed = parseAwsUrl(customUrl);\n\t\t\t\tservice = parsed.service;\n\t\t\t\tif (parsed.region) {\n\t\t\t\t\tregion = parsed.region;\n\t\t\t\t}\n\t\t\t\tif (service === 'sts') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcustomUrl.searchParams.set('Action', 'GetCallerIdentity');\n\t\t\t\t\t\tcustomUrl.searchParams.set('Version', '2011-06-15');\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tendpoint = customUrl;\n\t\t\t}\n\t\t}\n\n\t\tif (query && Object.keys(query).length !== 0) {\n\t\t\tObject.keys(query).forEach((key) => {\n\t\t\t\tendpoint.searchParams.append(key, query[key] as string);\n\t\t\t});\n\t\t}\n\n\t\tif (body && typeof body === 'object' && isObjectEmpty(body)) {\n\t\t\tbody = '';\n\t\t}\n\n\t\tpath = endpoint.pathname + endpoint.search;\n\n\t\tconst signOpts = {\n\t\t\t...requestOptions,\n\t\t\theaders: requestOptions.headers ?? {},\n\t\t\thost: endpoint.host,\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\tbody: body !== '' ? body : undefined,\n\t\t\tregion,\n\t\t} as Request;\n\n\t\tconst securityHeaders = {\n\t\t\taccessKeyId: `${credentials.accessKeyId}`.trim(),\n\t\t\tsecretAccessKey: `${credentials.secretAccessKey}`.trim(),\n\t\t\tsessionToken: credentials.temporaryCredentials\n\t\t\t\t? `${credentials.sessionToken}`.trim()\n\t\t\t\t: undefined,\n\t\t};\n\t\ttry {\n\t\t\tsign(signOpts, securityHeaders);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t}\n\t\tconst options: IHttpRequestOptions = {\n\t\t\t...requestOptions,\n\t\t\theaders: signOpts.headers,\n\t\t\tmethod,\n\t\t\turl: endpoint.origin + path,\n\t\t\tbody: signOpts.body,\n\t\t\tqs: undefined, // override since it's already in the url\n\t\t};\n\n\t\treturn options;\n\t}\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '=https://sts.{{$credentials.region}}.amazonaws.com',\n\t\t\turl: '?Action=GetCallerIdentity&Version=2011-06-15',\n\t\t\tmethod: 'POST',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAqB;AAUrB,0BAA8B;AAEvB,MAAM,UAAU;AAAA,EACtB;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,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","names":[]}
1
+ {"version":3,"sources":["../../credentials/Aws.credentials.ts"],"sourcesContent":["import type { Request } from 'aws4';\nimport { sign } from 'aws4';\nimport type {\n\tICredentialDataDecryptedObject,\n\tICredentialTestRequest,\n\tICredentialType,\n\tIDataObject,\n\tIHttpRequestOptions,\n\tINodeProperties,\n\tIRequestOptions,\n} from 'n8n-workflow';\nimport { isObjectEmpty } from 'n8n-workflow';\n\nexport const regions = [\n\t{\n\t\tname: 'af-south-1',\n\t\tdisplayName: 'Africa',\n\t\tlocation: 'Cape Town',\n\t},\n\t{\n\t\tname: 'ap-east-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Hong Kong',\n\t},\n\t{\n\t\tname: 'ap-south-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Mumbai',\n\t},\n\t{\n\t\tname: 'ap-south-2',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Hyderabad',\n\t},\n\t{\n\t\tname: 'ap-southeast-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Singapore',\n\t},\n\t{\n\t\tname: 'ap-southeast-2',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Sydney',\n\t},\n\t{\n\t\tname: 'ap-southeast-3',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Jakarta',\n\t},\n\t{\n\t\tname: 'ap-southeast-4',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Melbourne',\n\t},\n\t{\n\t\tname: 'ap-southeast-5',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Malaysia',\n\t},\n\t{\n\t\tname: 'ap-southeast-7',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Thailand',\n\t},\n\t{\n\t\tname: 'ap-northeast-1',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Tokyo',\n\t},\n\t{\n\t\tname: 'ap-northeast-2',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Seoul',\n\t},\n\t{\n\t\tname: 'ap-northeast-3',\n\t\tdisplayName: 'Asia Pacific',\n\t\tlocation: 'Osaka',\n\t},\n\t{\n\t\tname: 'ca-central-1',\n\t\tdisplayName: 'Canada',\n\t\tlocation: 'Central',\n\t},\n\t{\n\t\tname: 'ca-west-1',\n\t\tdisplayName: 'Canada West',\n\t\tlocation: 'Calgary',\n\t},\n\t{\n\t\tname: 'cn-north-1',\n\t\tdisplayName: 'China',\n\t\tlocation: 'Beijing',\n\t},\n\t{\n\t\tname: 'cn-northwest-1',\n\t\tdisplayName: 'China',\n\t\tlocation: 'Ningxia',\n\t},\n\t{\n\t\tname: 'eu-central-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Frankfurt',\n\t},\n\t{\n\t\tname: 'eu-central-2',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Zurich',\n\t},\n\t{\n\t\tname: 'eu-north-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Stockholm',\n\t},\n\t{\n\t\tname: 'eu-south-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Milan',\n\t},\n\t{\n\t\tname: 'eu-south-2',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Spain',\n\t},\n\t{\n\t\tname: 'eu-west-1',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Ireland',\n\t},\n\t{\n\t\tname: 'eu-west-2',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'London',\n\t},\n\t{\n\t\tname: 'eu-west-3',\n\t\tdisplayName: 'Europe',\n\t\tlocation: 'Paris',\n\t},\n\t{\n\t\tname: 'il-central-1',\n\t\tdisplayName: 'Israel',\n\t\tlocation: 'Tel Aviv',\n\t},\n\t{\n\t\tname: 'me-central-1',\n\t\tdisplayName: 'Middle East',\n\t\tlocation: 'UAE',\n\t},\n\t{\n\t\tname: 'me-south-1',\n\t\tdisplayName: 'Middle East',\n\t\tlocation: 'Bahrain',\n\t},\n\t{\n\t\tname: 'mx-central-1',\n\t\tdisplayName: 'Mexico',\n\t\tlocation: 'Central',\n\t},\n\t{\n\t\tname: 'sa-east-1',\n\t\tdisplayName: 'South America',\n\t\tlocation: 'São Paulo',\n\t},\n\t{\n\t\tname: 'us-east-1',\n\t\tdisplayName: 'US East',\n\t\tlocation: 'N. Virginia',\n\t},\n\t{\n\t\tname: 'us-east-2',\n\t\tdisplayName: 'US East',\n\t\tlocation: 'Ohio',\n\t},\n\t{\n\t\tname: 'us-gov-east-1',\n\t\tdisplayName: 'US East',\n\t\tlocation: 'GovCloud',\n\t},\n\t{\n\t\tname: 'us-west-1',\n\t\tdisplayName: 'US West',\n\t\tlocation: 'N. California',\n\t},\n\t{\n\t\tname: 'us-west-2',\n\t\tdisplayName: 'US West',\n\t\tlocation: 'Oregon',\n\t},\n\t{\n\t\tname: 'us-gov-west-1',\n\t\tdisplayName: 'US West',\n\t\tlocation: 'GovCloud',\n\t},\n] as const;\n\nexport type AWSRegion = (typeof regions)[number]['name'];\nexport type AwsCredentialsType = {\n\tregion: AWSRegion;\n\taccessKeyId: string;\n\tsecretAccessKey: string;\n\ttemporaryCredentials: boolean;\n\tcustomEndpoints: boolean;\n\tsessionToken?: string;\n\trekognitionEndpoint?: string;\n\tlambdaEndpoint?: string;\n\tsnsEndpoint?: string;\n\tsesEndpoint?: string;\n\tsqsEndpoint?: string;\n\ts3Endpoint?: string;\n\tssmEndpoint?: string;\n};\n\n// Some AWS services are global and don't have a region\n// https://docs.aws.amazon.com/general/latest/gr/rande.html#global-endpoints\n// Example: iam.amazonaws.com (global), s3.us-east-1.amazonaws.com (regional)\nfunction parseAwsUrl(url: URL): { region: AWSRegion | null; service: string } {\n\tconst [service, region] = url.hostname.replace('amazonaws.com', '').split('.');\n\treturn { service, region: region as AWSRegion };\n}\n\nexport class Aws implements ICredentialType {\n\tname = 'aws';\n\n\tdisplayName = 'AWS';\n\n\tdocumentationUrl = 'aws';\n\n\ticon = { light: 'file:icons/AWS.svg', dark: 'file:icons/AWS.dark.svg' } as const;\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Region',\n\t\t\tname: 'region',\n\t\t\ttype: 'options',\n\t\t\toptions: regions.map((r) => ({\n\t\t\t\tname: `${r.displayName} (${r.location}) - ${r.name}`,\n\t\t\t\tvalue: r.name,\n\t\t\t})),\n\t\t\tdefault: 'us-east-1',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Access Key ID',\n\t\t\tname: 'accessKeyId',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Secret Access Key',\n\t\t\tname: 'secretAccessKey',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Temporary Security Credentials',\n\t\t\tname: 'temporaryCredentials',\n\t\t\tdescription: 'Support for temporary credentials from AWS STS',\n\t\t\ttype: 'boolean',\n\t\t\tdefault: false,\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Session Token',\n\t\t\tname: 'sessionToken',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\ttemporaryCredentials: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Custom Endpoints',\n\t\t\tname: 'customEndpoints',\n\t\t\ttype: 'boolean',\n\t\t\tdefault: false,\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Rekognition Endpoint',\n\t\t\tname: 'rekognitionEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and Rekognition using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://rekognition.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Lambda Endpoint',\n\t\t\tname: 'lambdaEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and Lambda using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://lambda.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SNS Endpoint',\n\t\t\tname: 'snsEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SNS using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://sns.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SES Endpoint',\n\t\t\tname: 'sesEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SES using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://email.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SQS Endpoint',\n\t\t\tname: 'sqsEndpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and SQS using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://sqs.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'S3 Endpoint',\n\t\t\tname: 's3Endpoint',\n\t\t\tdescription:\n\t\t\t\t'If you use Amazon VPC to host n8n, you can establish a connection between your VPC and S3 using a VPC endpoint. Leave blank to use the default endpoint.',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://s3.{region}.amazonaws.com',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'SSM Endpoint',\n\t\t\tname: 'ssmEndpoint',\n\t\t\tdescription: 'Endpoint for AWS Systems Manager (SSM)',\n\t\t\ttype: 'string',\n\t\t\tdisplayOptions: {\n\t\t\t\tshow: {\n\t\t\t\t\tcustomEndpoints: [true],\n\t\t\t\t},\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://ssm.{region}.amazonaws.com',\n\t\t},\n\t];\n\n\tasync authenticate(\n\t\trawCredentials: ICredentialDataDecryptedObject,\n\t\trequestOptions: IHttpRequestOptions,\n\t): Promise<IHttpRequestOptions> {\n\t\tconst credentials = rawCredentials as AwsCredentialsType;\n\t\tlet endpoint: URL;\n\t\tlet service = requestOptions.qs?.service as string;\n\t\tlet path = (requestOptions.qs?.path as string) ?? '';\n\t\tconst method = requestOptions.method;\n\t\tlet body = requestOptions.body;\n\n\t\tlet region = credentials.region;\n\t\tif (requestOptions.qs?._region) {\n\t\t\tregion = requestOptions.qs._region as AWSRegion;\n\t\t\tdelete requestOptions.qs._region;\n\t\t}\n\n\t\tlet query = requestOptions.qs?.query as IDataObject;\n\t\t// ! Workaround as we still use the IRequestOptions interface which uses uri instead of url\n\t\t// ! To change when we replace the interface with IHttpRequestOptions\n\t\tconst requestWithUri = requestOptions as unknown as IRequestOptions;\n\t\tif (requestWithUri.uri) {\n\t\t\trequestOptions.url = requestWithUri.uri;\n\t\t\tendpoint = new URL(requestOptions.url);\n\t\t\tif (service === 'sts') {\n\t\t\t\ttry {\n\t\t\t\t\tif (requestWithUri.qs?.Action !== 'GetCallerIdentity') {\n\t\t\t\t\t\tquery = requestWithUri.qs as IDataObject;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tendpoint.searchParams.set('Action', 'GetCallerIdentity');\n\t\t\t\t\t\tendpoint.searchParams.set('Version', '2011-06-15');\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst parsed = parseAwsUrl(endpoint);\n\t\t\tservice = parsed.service;\n\t\t\tif (parsed.region) {\n\t\t\t\tregion = parsed.region;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!requestOptions.baseURL && !requestOptions.url) {\n\t\t\t\tlet endpointString: string;\n\t\t\t\tif (service === 'lambda' && credentials.lambdaEndpoint) {\n\t\t\t\t\tendpointString = credentials.lambdaEndpoint;\n\t\t\t\t} else if (service === 'sns' && credentials.snsEndpoint) {\n\t\t\t\t\tendpointString = credentials.snsEndpoint;\n\t\t\t\t} else if (service === 'sqs' && credentials.sqsEndpoint) {\n\t\t\t\t\tendpointString = credentials.sqsEndpoint;\n\t\t\t\t} else if (service === 's3' && credentials.s3Endpoint) {\n\t\t\t\t\tendpointString = credentials.s3Endpoint;\n\t\t\t\t} else if (service === 'ses' && credentials.sesEndpoint) {\n\t\t\t\t\tendpointString = credentials.sesEndpoint;\n\t\t\t\t} else if (service === 'rekognition' && credentials.rekognitionEndpoint) {\n\t\t\t\t\tendpointString = credentials.rekognitionEndpoint;\n\t\t\t\t} else if (service === 'sqs' && credentials.sqsEndpoint) {\n\t\t\t\t\tendpointString = credentials.sqsEndpoint;\n\t\t\t\t} else if (service) {\n\t\t\t\t\tendpointString = `https://${service}.${region}.amazonaws.com`;\n\t\t\t\t} else if (service === 'ssm' && credentials.ssmEndpoint) {\n\t\t\t\t\tendpointString = credentials.ssmEndpoint;\n\t\t\t\t}\n\t\t\t\tendpoint = new URL(endpointString!.replace('{region}', region) + path);\n\t\t\t} else {\n\t\t\t\t// If no endpoint is set, we try to decompose the path and use the default endpoint\n\t\t\t\tconst customUrl = new URL(`${requestOptions.baseURL!}${requestOptions.url}${path}`);\n\t\t\t\tconst parsed = parseAwsUrl(customUrl);\n\t\t\t\tservice = parsed.service;\n\t\t\t\tif (parsed.region) {\n\t\t\t\t\tregion = parsed.region;\n\t\t\t\t}\n\t\t\t\tif (service === 'sts') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcustomUrl.searchParams.set('Action', 'GetCallerIdentity');\n\t\t\t\t\t\tcustomUrl.searchParams.set('Version', '2011-06-15');\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tendpoint = customUrl;\n\t\t\t}\n\t\t}\n\n\t\tif (query && Object.keys(query).length !== 0) {\n\t\t\tObject.keys(query).forEach((key) => {\n\t\t\t\tendpoint.searchParams.append(key, query[key] as string);\n\t\t\t});\n\t\t}\n\n\t\tif (body && typeof body === 'object' && isObjectEmpty(body)) {\n\t\t\tbody = '';\n\t\t}\n\n\t\tpath = endpoint.pathname + endpoint.search;\n\n\t\t// ! aws4.sign *must* have the body to sign, but we might have .form instead of .body\n\t\tconst requestWithForm = requestOptions as unknown as { form?: Record<string, string> };\n\t\tlet bodyContent = body !== '' ? body : undefined;\n\t\tlet contentTypeHeader: string | undefined = undefined;\n\t\tif (requestWithForm.form) {\n\t\t\tconst params = new URLSearchParams();\n\t\t\tfor (const key in requestWithForm.form) {\n\t\t\t\tparams.append(key, requestWithForm.form[key]);\n\t\t\t}\n\t\t\tbodyContent = params.toString();\n\t\t\tcontentTypeHeader = 'application/x-www-form-urlencoded';\n\t\t}\n\n\t\tconst signOpts = {\n\t\t\t...requestOptions,\n\t\t\theaders: {\n\t\t\t\t...(requestOptions.headers ?? {}),\n\t\t\t\t...(contentTypeHeader && { 'content-type': contentTypeHeader }),\n\t\t\t},\n\t\t\thost: endpoint.host,\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\tbody: bodyContent,\n\t\t\tregion,\n\t\t} as Request;\n\n\t\tconst securityHeaders = {\n\t\t\taccessKeyId: `${credentials.accessKeyId}`.trim(),\n\t\t\tsecretAccessKey: `${credentials.secretAccessKey}`.trim(),\n\t\t\tsessionToken: credentials.temporaryCredentials\n\t\t\t\t? `${credentials.sessionToken}`.trim()\n\t\t\t\t: undefined,\n\t\t};\n\t\ttry {\n\t\t\tsign(signOpts, securityHeaders);\n\t\t} catch (err) {\n\t\t\tconsole.error(err);\n\t\t}\n\t\tconst options: IHttpRequestOptions = {\n\t\t\t...requestOptions,\n\t\t\theaders: signOpts.headers,\n\t\t\tmethod,\n\t\t\turl: endpoint.origin + path,\n\t\t\tbody: signOpts.body,\n\t\t\tqs: undefined, // override since it's already in the url\n\t\t};\n\n\t\treturn options;\n\t}\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '=https://sts.{{$credentials.region}}.amazonaws.com',\n\t\t\turl: '?Action=GetCallerIdentity&Version=2011-06-15',\n\t\t\tmethod: 'POST',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAqB;AAUrB,0BAA8B;AAEvB,MAAM,UAAU;AAAA,EACtB;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,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","names":[]}
@@ -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,12 +17,23 @@ 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 SalesforceJwtApi_credentials_exports = {};
20
30
  __export(SalesforceJwtApi_credentials_exports, {
21
31
  SalesforceJwtApi: () => SalesforceJwtApi
22
32
  });
23
33
  module.exports = __toCommonJS(SalesforceJwtApi_credentials_exports);
34
+ var import_axios = __toESM(require("axios"));
35
+ var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
36
+ var import_moment_timezone = __toESM(require("moment-timezone"));
24
37
  class SalesforceJwtApi {
25
38
  constructor() {
26
39
  this.name = "salesforceJwtApi";
@@ -70,6 +83,53 @@ class SalesforceJwtApi {
70
83
  description: "Use the multiline editor. Make sure it is in standard PEM key format:<br />-----BEGIN PRIVATE KEY-----<br />KEY DATA GOES HERE<br />-----END PRIVATE KEY-----"
71
84
  }
72
85
  ];
86
+ this.test = {
87
+ request: {
88
+ baseURL: '={{$credentials?.environment === "sandbox" ? "https://test.salesforce.com" : "https://login.salesforce.com"}}',
89
+ url: "/services/oauth2/userinfo",
90
+ method: "GET"
91
+ }
92
+ };
93
+ }
94
+ async authenticate(credentials, requestOptions) {
95
+ const now = (0, import_moment_timezone.default)().unix();
96
+ const authUrl = credentials.environment === "sandbox" ? "https://test.salesforce.com" : "https://login.salesforce.com";
97
+ const signature = import_jsonwebtoken.default.sign(
98
+ {
99
+ iss: credentials.clientId,
100
+ sub: credentials.username,
101
+ aud: authUrl,
102
+ exp: now + 3 * 60
103
+ },
104
+ credentials.privateKey,
105
+ {
106
+ algorithm: "RS256",
107
+ header: {
108
+ alg: "RS256"
109
+ }
110
+ }
111
+ );
112
+ const axiosRequestConfig = {
113
+ headers: {
114
+ "Content-Type": "application/x-www-form-urlencoded"
115
+ },
116
+ method: "POST",
117
+ data: new URLSearchParams({
118
+ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
119
+ assertion: signature
120
+ }).toString(),
121
+ url: `${authUrl}/services/oauth2/token`,
122
+ responseType: "json"
123
+ };
124
+ const result = await (0, import_axios.default)(axiosRequestConfig);
125
+ const { access_token } = result.data;
126
+ return {
127
+ ...requestOptions,
128
+ headers: {
129
+ ...requestOptions.headers,
130
+ Authorization: `Bearer ${access_token}`
131
+ }
132
+ };
73
133
  }
74
134
  }
75
135
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../credentials/SalesforceJwtApi.credentials.ts"],"sourcesContent":["import type { ICredentialType, INodeProperties } from 'n8n-workflow';\n\nexport class SalesforceJwtApi implements ICredentialType {\n\tname = 'salesforceJwtApi';\n\n\tdisplayName = 'Salesforce JWT API';\n\n\tdocumentationUrl = 'salesforce';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Environment Type',\n\t\t\tname: 'environment',\n\t\t\ttype: 'options',\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Production',\n\t\t\t\t\tvalue: 'production',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Sandbox',\n\t\t\t\t\tvalue: 'sandbox',\n\t\t\t\t},\n\t\t\t],\n\t\t\tdefault: 'production',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Client ID',\n\t\t\tname: 'clientId',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\tdescription: 'Consumer Key from Salesforce Connected App',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Username',\n\t\t\tname: 'username',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Private Key',\n\t\t\tname: 'privateKey',\n\t\t\ttype: 'string',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\tdescription:\n\t\t\t\t'Use the multiline editor. Make sure it is in standard PEM key format:<br />-----BEGIN PRIVATE KEY-----<br />KEY DATA GOES HERE<br />-----END PRIVATE KEY-----',\n\t\t},\n\t];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,iBAA4C;AAAA,EAAlD;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,UACR;AAAA,YACC,MAAM;AAAA,YACN,OAAO;AAAA,UACR;AAAA,UACA;AAAA,YACC,MAAM;AAAA,YACN,OAAO;AAAA,UACR;AAAA,QACD;AAAA,QACA,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aAAa;AAAA,MACd;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,MACX;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,UACZ,UAAU;AAAA,QACX;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aACC;AAAA,MACF;AAAA,IACD;AAAA;AACD;","names":[]}
1
+ {"version":3,"sources":["../../credentials/SalesforceJwtApi.credentials.ts"],"sourcesContent":["import type { AxiosRequestConfig } from 'axios';\nimport axios from 'axios';\nimport jwt from 'jsonwebtoken';\nimport moment from 'moment-timezone';\nimport type {\n\tICredentialDataDecryptedObject,\n\tICredentialTestRequest,\n\tICredentialType,\n\tIHttpRequestOptions,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class SalesforceJwtApi implements ICredentialType {\n\tname = 'salesforceJwtApi';\n\n\tdisplayName = 'Salesforce JWT API';\n\n\tdocumentationUrl = 'salesforce';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Environment Type',\n\t\t\tname: 'environment',\n\t\t\ttype: 'options',\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Production',\n\t\t\t\t\tvalue: 'production',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'Sandbox',\n\t\t\t\t\tvalue: 'sandbox',\n\t\t\t\t},\n\t\t\t],\n\t\t\tdefault: 'production',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Client ID',\n\t\t\tname: 'clientId',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\tdescription: 'Consumer Key from Salesforce Connected App',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Username',\n\t\t\tname: 'username',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Private Key',\n\t\t\tname: 'privateKey',\n\t\t\ttype: 'string',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t\tdescription:\n\t\t\t\t'Use the multiline editor. Make sure it is in standard PEM key format:<br />-----BEGIN PRIVATE KEY-----<br />KEY DATA GOES HERE<br />-----END PRIVATE KEY-----',\n\t\t},\n\t];\n\n\tasync authenticate(\n\t\tcredentials: ICredentialDataDecryptedObject,\n\t\trequestOptions: IHttpRequestOptions,\n\t): Promise<IHttpRequestOptions> {\n\t\tconst now = moment().unix();\n\t\tconst authUrl =\n\t\t\tcredentials.environment === 'sandbox'\n\t\t\t\t? 'https://test.salesforce.com'\n\t\t\t\t: 'https://login.salesforce.com';\n\t\tconst signature = jwt.sign(\n\t\t\t{\n\t\t\t\tiss: credentials.clientId as string,\n\t\t\t\tsub: credentials.username as string,\n\t\t\t\taud: authUrl,\n\t\t\t\texp: now + 3 * 60,\n\t\t\t},\n\t\t\tcredentials.privateKey as string,\n\t\t\t{\n\t\t\t\talgorithm: 'RS256',\n\t\t\t\theader: {\n\t\t\t\t\talg: 'RS256',\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tconst axiosRequestConfig: AxiosRequestConfig = {\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tmethod: 'POST',\n\t\t\tdata: new URLSearchParams({\n\t\t\t\tgrant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n\t\t\t\tassertion: signature,\n\t\t\t}).toString(),\n\t\t\turl: `${authUrl}/services/oauth2/token`,\n\t\t\tresponseType: 'json',\n\t\t};\n\t\tconst result = await axios(axiosRequestConfig);\n\t\tconst { access_token } = result.data as { access_token: string };\n\n\t\treturn {\n\t\t\t...requestOptions,\n\t\t\theaders: {\n\t\t\t\t...requestOptions.headers,\n\t\t\t\tAuthorization: `Bearer ${access_token}`,\n\t\t\t},\n\t\t};\n\t}\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL:\n\t\t\t\t'={{$credentials?.environment === \"sandbox\" ? \"https://test.salesforce.com\" : \"https://login.salesforce.com\"}}',\n\t\t\turl: '/services/oauth2/userinfo',\n\t\t\tmethod: 'GET',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAkB;AAClB,0BAAgB;AAChB,6BAAmB;AASZ,MAAM,iBAA4C;AAAA,EAAlD;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,UACR;AAAA,YACC,MAAM;AAAA,YACN,OAAO;AAAA,UACR;AAAA,UACA;AAAA,YACC,MAAM;AAAA,YACN,OAAO;AAAA,UACR;AAAA,QACD;AAAA,QACA,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aAAa;AAAA,MACd;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,MACX;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,UACZ,UAAU;AAAA,QACX;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aACC;AAAA,MACF;AAAA,IACD;AAmDA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SACC;AAAA,QACD,KAAK;AAAA,QACL,QAAQ;AAAA,MACT;AAAA,IACD;AAAA;AAAA,EAxDA,MAAM,aACL,aACA,gBAC+B;AAC/B,UAAM,UAAM,uBAAAA,SAAO,EAAE,KAAK;AAC1B,UAAM,UACL,YAAY,gBAAgB,YACzB,gCACA;AACJ,UAAM,YAAY,oBAAAC,QAAI;AAAA,MACrB;AAAA,QACC,KAAK,YAAY;AAAA,QACjB,KAAK,YAAY;AAAA,QACjB,KAAK;AAAA,QACL,KAAK,MAAM,IAAI;AAAA,MAChB;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,QACC,WAAW;AAAA,QACX,QAAQ;AAAA,UACP,KAAK;AAAA,QACN;AAAA,MACD;AAAA,IACD;AAEA,UAAM,qBAAyC;AAAA,MAC9C,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,IAAI,gBAAgB;AAAA,QACzB,YAAY;AAAA,QACZ,WAAW;AAAA,MACZ,CAAC,EAAE,SAAS;AAAA,MACZ,KAAK,GAAG,OAAO;AAAA,MACf,cAAc;AAAA,IACf;AACA,UAAM,SAAS,UAAM,aAAAC,SAAM,kBAAkB;AAC7C,UAAM,EAAE,aAAa,IAAI,OAAO;AAEhC,WAAO;AAAA,MACN,GAAG;AAAA,MACH,SAAS;AAAA,QACR,GAAG,eAAe;AAAA,QAClB,eAAe,UAAU,YAAY;AAAA,MACtC;AAAA,IACD;AAAA,EACD;AAUD;","names":["moment","jwt","axios"]}
@@ -81,6 +81,7 @@ async function execute(items, base, table) {
81
81
  try {
82
82
  const records = [];
83
83
  const options = this.getNodeParameter("options", i, {});
84
+ const typecast = options.typecast ? true : false;
84
85
  if (dataMode === "autoMapInputData") {
85
86
  if (columnsToMatchOn.includes("id")) {
86
87
  const { id, ...fields } = items[i].json;
@@ -104,11 +105,22 @@ async function execute(items, base, table) {
104
105
  }
105
106
  }
106
107
  if (dataMode === "defineBelow") {
108
+ const getNodeParameterOptions = typecast ? { skipValidation: true } : void 0;
107
109
  if (columnsToMatchOn.includes("id")) {
108
- const { id, ...fields } = this.getNodeParameter("columns.value", i, []);
110
+ const { id, ...fields } = this.getNodeParameter(
111
+ "columns.value",
112
+ i,
113
+ [],
114
+ getNodeParameterOptions
115
+ );
109
116
  records.push({ id, fields });
110
117
  } else {
111
- const fields = this.getNodeParameter("columns.value", i, []);
118
+ const fields = this.getNodeParameter(
119
+ "columns.value",
120
+ i,
121
+ [],
122
+ getNodeParameterOptions
123
+ );
112
124
  const matches = (0, import_utils.findMatches)(
113
125
  tableData,
114
126
  columnsToMatchOn,
@@ -121,7 +133,7 @@ async function execute(items, base, table) {
121
133
  }
122
134
  }
123
135
  }
124
- const body = { typecast: options.typecast ? true : false };
136
+ const body = { typecast };
125
137
  const responseData = await import_transport.batchUpdate.call(this, endpoint, body, records);
126
138
  const executionData = this.helpers.constructExecutionMetaData(
127
139
  (0, import_utilities.wrapData)(responseData.records),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../nodes/Airtable/v2/actions/record/update.operation.ts"],"sourcesContent":["import type {\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeProperties,\n\tNodeApiError,\n\tIExecuteFunctions,\n} from 'n8n-workflow';\n\nimport { updateDisplayOptions, wrapData } from '../../../../../utils/utilities';\nimport type { UpdateRecord } from '../../helpers/interfaces';\nimport { findMatches, processAirtableError, removeIgnored } from '../../helpers/utils';\nimport { apiRequestAllItems, batchUpdate } from '../../transport';\nimport { insertUpdateOptions } from '../common.descriptions';\n\nconst properties: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Columns',\n\t\tname: 'columns',\n\t\ttype: 'resourceMapper',\n\t\tnoDataExpression: true,\n\t\tdefault: {\n\t\t\tmappingMode: 'defineBelow',\n\t\t\tvalue: null,\n\t\t},\n\t\trequired: true,\n\t\ttypeOptions: {\n\t\t\tloadOptionsDependsOn: ['table.value', 'base.value'],\n\t\t\tresourceMapper: {\n\t\t\t\tresourceMapperMethod: 'getColumnsWithRecordId',\n\t\t\t\tmode: 'update',\n\t\t\t\tfieldWords: {\n\t\t\t\t\tsingular: 'column',\n\t\t\t\t\tplural: 'columns',\n\t\t\t\t},\n\t\t\t\taddAllFields: true,\n\t\t\t\tmultiKeyMatch: true,\n\t\t\t},\n\t\t},\n\t},\n\t...insertUpdateOptions,\n];\n\nconst displayOptions = {\n\tshow: {\n\t\tresource: ['record'],\n\t\toperation: ['update'],\n\t},\n};\n\nexport const description = updateDisplayOptions(displayOptions, properties);\n\nexport async function execute(\n\tthis: IExecuteFunctions,\n\titems: INodeExecutionData[],\n\tbase: string,\n\ttable: string,\n): Promise<INodeExecutionData[]> {\n\tconst returnData: INodeExecutionData[] = [];\n\n\tconst endpoint = `${base}/${table}`;\n\n\tconst dataMode = this.getNodeParameter('columns.mappingMode', 0) as string;\n\n\tconst columnsToMatchOn = this.getNodeParameter('columns.matchingColumns', 0) as string[];\n\n\tlet tableData: UpdateRecord[] = [];\n\tif (!columnsToMatchOn.includes('id')) {\n\t\tconst response = await apiRequestAllItems.call(\n\t\t\tthis,\n\t\t\t'GET',\n\t\t\tendpoint,\n\t\t\t{},\n\t\t\t{ fields: columnsToMatchOn },\n\t\t);\n\t\ttableData = response.records as UpdateRecord[];\n\t}\n\n\tfor (let i = 0; i < items.length; i++) {\n\t\tlet recordId = '';\n\t\ttry {\n\t\t\tconst records: UpdateRecord[] = [];\n\t\t\tconst options = this.getNodeParameter('options', i, {});\n\n\t\t\tif (dataMode === 'autoMapInputData') {\n\t\t\t\tif (columnsToMatchOn.includes('id')) {\n\t\t\t\t\tconst { id, ...fields } = items[i].json;\n\t\t\t\t\trecordId = id as string;\n\n\t\t\t\t\trecords.push({\n\t\t\t\t\t\tid: recordId,\n\t\t\t\t\t\tfields: removeIgnored(fields, options.ignoreFields as string),\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst matches = findMatches(\n\t\t\t\t\t\ttableData,\n\t\t\t\t\t\tcolumnsToMatchOn,\n\t\t\t\t\t\titems[i].json,\n\t\t\t\t\t\toptions.updateAllMatches as boolean,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const match of matches) {\n\t\t\t\t\t\tconst id = match.id as string;\n\t\t\t\t\t\tconst fields = items[i].json;\n\t\t\t\t\t\trecords.push({ id, fields: removeIgnored(fields, options.ignoreFields as string) });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (dataMode === 'defineBelow') {\n\t\t\t\tif (columnsToMatchOn.includes('id')) {\n\t\t\t\t\tconst { id, ...fields } = this.getNodeParameter('columns.value', i, []) as IDataObject;\n\t\t\t\t\trecords.push({ id: id as string, fields });\n\t\t\t\t} else {\n\t\t\t\t\tconst fields = this.getNodeParameter('columns.value', i, []) as IDataObject;\n\n\t\t\t\t\tconst matches = findMatches(\n\t\t\t\t\t\ttableData,\n\t\t\t\t\t\tcolumnsToMatchOn,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\toptions.updateAllMatches as boolean,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const match of matches) {\n\t\t\t\t\t\tconst id = match.id as string;\n\t\t\t\t\t\trecords.push({ id, fields: removeIgnored(fields, columnsToMatchOn) });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst body: IDataObject = { typecast: options.typecast ? true : false };\n\n\t\t\tconst responseData = await batchUpdate.call(this, endpoint, body, records);\n\n\t\t\tconst executionData = this.helpers.constructExecutionMetaData(\n\t\t\t\twrapData(responseData.records as IDataObject[]),\n\t\t\t\t{ itemData: { item: i } },\n\t\t\t);\n\n\t\t\treturnData.push(...executionData);\n\t\t} catch (error) {\n\t\t\terror = processAirtableError(error as NodeApiError, recordId, i);\n\t\t\tif (this.continueOnFail()) {\n\t\t\t\treturnData.push({ json: { message: error.message, error } });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\treturn returnData;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../nodes/Airtable/v2/actions/record/update.operation.ts"],"sourcesContent":["import type {\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeProperties,\n\tNodeApiError,\n\tIExecuteFunctions,\n} from 'n8n-workflow';\n\nimport { updateDisplayOptions, wrapData } from '../../../../../utils/utilities';\nimport type { UpdateRecord } from '../../helpers/interfaces';\nimport { findMatches, processAirtableError, removeIgnored } from '../../helpers/utils';\nimport { apiRequestAllItems, batchUpdate } from '../../transport';\nimport { insertUpdateOptions } from '../common.descriptions';\n\nconst properties: INodeProperties[] = [\n\t{\n\t\tdisplayName: 'Columns',\n\t\tname: 'columns',\n\t\ttype: 'resourceMapper',\n\t\tnoDataExpression: true,\n\t\tdefault: {\n\t\t\tmappingMode: 'defineBelow',\n\t\t\tvalue: null,\n\t\t},\n\t\trequired: true,\n\t\ttypeOptions: {\n\t\t\tloadOptionsDependsOn: ['table.value', 'base.value'],\n\t\t\tresourceMapper: {\n\t\t\t\tresourceMapperMethod: 'getColumnsWithRecordId',\n\t\t\t\tmode: 'update',\n\t\t\t\tfieldWords: {\n\t\t\t\t\tsingular: 'column',\n\t\t\t\t\tplural: 'columns',\n\t\t\t\t},\n\t\t\t\taddAllFields: true,\n\t\t\t\tmultiKeyMatch: true,\n\t\t\t},\n\t\t},\n\t},\n\t...insertUpdateOptions,\n];\n\nconst displayOptions = {\n\tshow: {\n\t\tresource: ['record'],\n\t\toperation: ['update'],\n\t},\n};\n\nexport const description = updateDisplayOptions(displayOptions, properties);\n\nexport async function execute(\n\tthis: IExecuteFunctions,\n\titems: INodeExecutionData[],\n\tbase: string,\n\ttable: string,\n): Promise<INodeExecutionData[]> {\n\tconst returnData: INodeExecutionData[] = [];\n\n\tconst endpoint = `${base}/${table}`;\n\n\tconst dataMode = this.getNodeParameter('columns.mappingMode', 0) as string;\n\n\tconst columnsToMatchOn = this.getNodeParameter('columns.matchingColumns', 0) as string[];\n\n\tlet tableData: UpdateRecord[] = [];\n\tif (!columnsToMatchOn.includes('id')) {\n\t\tconst response = await apiRequestAllItems.call(\n\t\t\tthis,\n\t\t\t'GET',\n\t\t\tendpoint,\n\t\t\t{},\n\t\t\t{ fields: columnsToMatchOn },\n\t\t);\n\t\ttableData = response.records as UpdateRecord[];\n\t}\n\n\tfor (let i = 0; i < items.length; i++) {\n\t\tlet recordId = '';\n\t\ttry {\n\t\t\tconst records: UpdateRecord[] = [];\n\t\t\tconst options = this.getNodeParameter('options', i, {});\n\t\t\tconst typecast = options.typecast ? true : false;\n\n\t\t\tif (dataMode === 'autoMapInputData') {\n\t\t\t\tif (columnsToMatchOn.includes('id')) {\n\t\t\t\t\tconst { id, ...fields } = items[i].json;\n\t\t\t\t\trecordId = id as string;\n\n\t\t\t\t\trecords.push({\n\t\t\t\t\t\tid: recordId,\n\t\t\t\t\t\tfields: removeIgnored(fields, options.ignoreFields as string),\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst matches = findMatches(\n\t\t\t\t\t\ttableData,\n\t\t\t\t\t\tcolumnsToMatchOn,\n\t\t\t\t\t\titems[i].json,\n\t\t\t\t\t\toptions.updateAllMatches as boolean,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const match of matches) {\n\t\t\t\t\t\tconst id = match.id as string;\n\t\t\t\t\t\tconst fields = items[i].json;\n\t\t\t\t\t\trecords.push({ id, fields: removeIgnored(fields, options.ignoreFields as string) });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (dataMode === 'defineBelow') {\n\t\t\t\tconst getNodeParameterOptions = typecast ? { skipValidation: true } : undefined;\n\t\t\t\tif (columnsToMatchOn.includes('id')) {\n\t\t\t\t\tconst { id, ...fields } = this.getNodeParameter(\n\t\t\t\t\t\t'columns.value',\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t[],\n\t\t\t\t\t\tgetNodeParameterOptions,\n\t\t\t\t\t) as IDataObject;\n\t\t\t\t\trecords.push({ id: id as string, fields });\n\t\t\t\t} else {\n\t\t\t\t\tconst fields = this.getNodeParameter(\n\t\t\t\t\t\t'columns.value',\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t[],\n\t\t\t\t\t\tgetNodeParameterOptions,\n\t\t\t\t\t) as IDataObject;\n\n\t\t\t\t\tconst matches = findMatches(\n\t\t\t\t\t\ttableData,\n\t\t\t\t\t\tcolumnsToMatchOn,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\toptions.updateAllMatches as boolean,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const match of matches) {\n\t\t\t\t\t\tconst id = match.id as string;\n\t\t\t\t\t\trecords.push({ id, fields: removeIgnored(fields, columnsToMatchOn) });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst body: IDataObject = { typecast };\n\n\t\t\tconst responseData = await batchUpdate.call(this, endpoint, body, records);\n\n\t\t\tconst executionData = this.helpers.constructExecutionMetaData(\n\t\t\t\twrapData(responseData.records as IDataObject[]),\n\t\t\t\t{ itemData: { item: i } },\n\t\t\t);\n\n\t\t\treturnData.push(...executionData);\n\t\t} catch (error) {\n\t\t\terror = processAirtableError(error as NodeApiError, recordId, i);\n\t\t\tif (this.continueOnFail()) {\n\t\t\t\treturnData.push({ json: { message: error.message, error } });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\treturn returnData;\n}\n"],"mappings":"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","names":[]}
@@ -1,14 +1,6 @@
1
1
  {
2
2
  "type": "object",
3
3
  "properties": {
4
- "attributes": {
5
- "type": "object",
6
- "properties": {
7
- "SMS": {
8
- "type": "string"
9
- }
10
- }
11
- },
12
4
  "createdAt": {
13
5
  "type": "string"
14
6
  },
@@ -37,5 +29,5 @@
37
29
  "type": "boolean"
38
30
  }
39
31
  },
40
- "version": 1
32
+ "version": 2
41
33
  }
@@ -1,12 +1,9 @@
1
1
  {
2
2
  "type": "object",
3
3
  "properties": {
4
- "name": {
5
- "type": "string"
6
- },
7
- "rev": {
4
+ "id": {
8
5
  "type": "string"
9
6
  }
10
7
  },
11
- "version": 1
8
+ "version": 2
12
9
  }
@@ -326,9 +326,8 @@ async function prepareFormReturnItem(context, formFields, mode, useWorkflowTimez
326
326
  const timezone = useWorkflowTimezone ? context.getTimezone() : "UTC";
327
327
  returnItem.json.submittedAt = import_luxon.DateTime.now().setZone(timezone).toISO();
328
328
  returnItem.json.formMode = mode;
329
- const workflowStaticData = context.getWorkflowStaticData("node");
330
- if (Object.keys(workflowStaticData || {}).length && context.getNode().type === import_n8n_workflow.FORM_TRIGGER_NODE_TYPE) {
331
- returnItem.json.formQueryParameters = workflowStaticData;
329
+ if (context.getNode().type === import_n8n_workflow.FORM_TRIGGER_NODE_TYPE && Object.keys(context.getRequestObject().query || {}).length) {
330
+ returnItem.json.formQueryParameters = context.getRequestObject().query;
332
331
  }
333
332
  return returnItem;
334
333
  }
@@ -352,10 +351,6 @@ function renderForm({
352
351
  let query = {};
353
352
  if (context.getNode().type === import_n8n_workflow.FORM_TRIGGER_NODE_TYPE) {
354
353
  query = context.getRequestObject().query;
355
- const workflowStaticData = context.getWorkflowStaticData("node");
356
- for (const key of Object.keys(query)) {
357
- workflowStaticData[key] = query[key];
358
- }
359
354
  } else if (context.getNode().type === import_n8n_workflow.FORM_NODE_TYPE) {
360
355
  const parentNodes = context.getParentNodes(context.getNode().name);
361
356
  const trigger = parentNodes.find(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../nodes/Form/utils.ts"],"sourcesContent":["import type { Response } from 'express';\nimport isbot from 'isbot';\nimport { DateTime } from 'luxon';\nimport type {\n\tINodeExecutionData,\n\tMultiPartFormData,\n\tIDataObject,\n\tIWebhookFunctions,\n\tFormFieldsParameter,\n\tNodeTypeAndVersion,\n} from 'n8n-workflow';\nimport {\n\tFORM_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tNodeOperationError,\n\tWAIT_NODE_TYPE,\n\tjsonParse,\n} from 'n8n-workflow';\nimport sanitize from 'sanitize-html';\n\nimport type { FormTriggerData, FormTriggerInput } from './interfaces';\nimport { FORM_TRIGGER_AUTHENTICATION_PROPERTY } from './interfaces';\nimport { getResolvables } from '../../utils/utilities';\nimport { WebhookAuthorizationError } from '../Webhook/error';\nimport { validateWebhookAuthentication } from '../Webhook/utils';\n\nexport function sanitizeHtml(text: string) {\n\treturn sanitize(text, {\n\t\tallowedTags: [\n\t\t\t'b',\n\t\t\t'div',\n\t\t\t'i',\n\t\t\t'iframe',\n\t\t\t'img',\n\t\t\t'video',\n\t\t\t'source',\n\t\t\t'em',\n\t\t\t'strong',\n\t\t\t'a',\n\t\t\t'h1',\n\t\t\t'h2',\n\t\t\t'h3',\n\t\t\t'h4',\n\t\t\t'h5',\n\t\t\t'h6',\n\t\t\t'u',\n\t\t\t'sub',\n\t\t\t'sup',\n\t\t\t'code',\n\t\t\t'pre',\n\t\t\t'span',\n\t\t\t'br',\n\t\t\t'ul',\n\t\t\t'ol',\n\t\t\t'li',\n\t\t\t'p',\n\t\t],\n\t\tallowedAttributes: {\n\t\t\ta: ['href', 'target', 'rel'],\n\t\t\timg: ['src', 'alt', 'width', 'height'],\n\t\t\tvideo: ['*'],\n\t\t\tiframe: ['*'],\n\t\t\tsource: ['*'],\n\t\t},\n\t\ttransformTags: {\n\t\t\tiframe: sanitize.simpleTransform('iframe', {\n\t\t\t\tsandbox: '',\n\t\t\t\treferrerpolicy: 'strict-origin-when-cross-origin',\n\t\t\t\tallow: 'fullscreen; autoplay; encrypted-media',\n\t\t\t}),\n\t\t},\n\t});\n}\n\nexport const prepareFormFields = (context: IWebhookFunctions, fields: FormFieldsParameter) => {\n\treturn fields.map((field) => {\n\t\tif (field.fieldType === 'html') {\n\t\t\tlet { html } = field;\n\n\t\t\tif (!html) return field;\n\n\t\t\tfor (const resolvable of getResolvables(html)) {\n\t\t\t\thtml = html.replace(resolvable, context.evaluateExpression(resolvable) as string);\n\t\t\t}\n\n\t\t\tfield.html = sanitizeHtml(html as string);\n\t\t}\n\n\t\tif (field.fieldType === 'hiddenField') {\n\t\t\tfield.fieldLabel = field.fieldName as string;\n\t\t}\n\n\t\treturn field;\n\t});\n};\n\nexport function sanitizeCustomCss(css: string | undefined): string | undefined {\n\tif (!css) return undefined;\n\n\t// Use sanitize-html with custom settings for CSS\n\treturn sanitize(css, {\n\t\tallowedTags: [], // No HTML tags allowed\n\t\tallowedAttributes: {}, // No attributes allowed\n\t\t// This ensures we're only keeping the text content\n\t\t// which should be the CSS, while removing any HTML/script tags\n\t});\n}\n\nexport function createDescriptionMetadata(description: string) {\n\treturn description === ''\n\t\t? 'n8n form'\n\t\t: description.replace(/^\\s*\\n+|<\\/?[^>]+(>|$)/g, '').slice(0, 150);\n}\n\nexport function prepareFormData({\n\tformTitle,\n\tformDescription,\n\tformSubmittedHeader,\n\tformSubmittedText,\n\tredirectUrl,\n\tformFields,\n\ttestRun,\n\tquery,\n\tinstanceId,\n\tuseResponseData,\n\tappendAttribution = true,\n\tbuttonLabel,\n\tcustomCss,\n}: {\n\tformTitle: string;\n\tformDescription: string;\n\tformSubmittedText: string | undefined;\n\tredirectUrl: string | undefined;\n\tformFields: FormFieldsParameter;\n\ttestRun: boolean;\n\tquery: IDataObject;\n\tinstanceId?: string;\n\tuseResponseData?: boolean;\n\tappendAttribution?: boolean;\n\tbuttonLabel?: string;\n\tformSubmittedHeader?: string;\n\tcustomCss?: string;\n}) {\n\tconst utm_campaign = instanceId ? `&utm_campaign=${instanceId}` : '';\n\tconst n8nWebsiteLink = `https://n8n.io/?utm_source=n8n-internal&utm_medium=form-trigger${utm_campaign}`;\n\n\tif (formSubmittedText === undefined) {\n\t\tformSubmittedText = 'Your response has been recorded';\n\t}\n\n\tconst formData: FormTriggerData = {\n\t\ttestRun,\n\t\tformTitle,\n\t\tformDescription,\n\t\tformDescriptionMetadata: createDescriptionMetadata(formDescription),\n\t\tformSubmittedHeader,\n\t\tformSubmittedText,\n\t\tn8nWebsiteLink,\n\t\tformFields: [],\n\t\tuseResponseData,\n\t\tappendAttribution,\n\t\tbuttonLabel,\n\t\tdangerousCustomCss: sanitizeCustomCss(customCss),\n\t};\n\n\tif (redirectUrl) {\n\t\tif (!redirectUrl.includes('://')) {\n\t\t\tredirectUrl = `http://${redirectUrl}`;\n\t\t}\n\t\tformData.redirectUrl = redirectUrl;\n\t}\n\n\tfor (const [index, field] of formFields.entries()) {\n\t\tconst { fieldType, requiredField, multiselect, placeholder } = field;\n\n\t\tconst input: IDataObject = {\n\t\t\tid: `field-${index}`,\n\t\t\terrorId: `error-field-${index}`,\n\t\t\tlabel: field.fieldLabel,\n\t\t\tinputRequired: requiredField ? 'form-required' : '',\n\t\t\tdefaultValue: query[field.fieldLabel] ?? '',\n\t\t\tplaceholder,\n\t\t};\n\n\t\tif (multiselect) {\n\t\t\tinput.isMultiSelect = true;\n\t\t\tinput.multiSelectOptions =\n\t\t\t\tfield.fieldOptions?.values.map((e, i) => ({\n\t\t\t\t\tid: `option${i}_${input.id}`,\n\t\t\t\t\tlabel: e.option,\n\t\t\t\t})) ?? [];\n\t\t} else if (fieldType === 'file') {\n\t\t\tinput.isFileInput = true;\n\t\t\tinput.acceptFileTypes = field.acceptFileTypes;\n\t\t\tinput.multipleFiles = field.multipleFiles ? 'multiple' : '';\n\t\t} else if (fieldType === 'dropdown') {\n\t\t\tinput.isSelect = true;\n\t\t\tconst fieldOptions = field.fieldOptions?.values ?? [];\n\t\t\tinput.selectOptions = fieldOptions.map((e) => e.option);\n\t\t} else if (fieldType === 'textarea') {\n\t\t\tinput.isTextarea = true;\n\t\t} else if (fieldType === 'html') {\n\t\t\tinput.isHtml = true;\n\t\t\tinput.html = field.html as string;\n\t\t} else if (fieldType === 'hiddenField') {\n\t\t\tinput.isHidden = true;\n\t\t\tinput.hiddenName = field.fieldName as string;\n\t\t\tinput.hiddenValue =\n\t\t\t\tinput.defaultValue === '' ? (field.fieldValue as string) : input.defaultValue;\n\t\t} else {\n\t\t\tinput.isInput = true;\n\t\t\tinput.type = fieldType as 'text' | 'number' | 'date' | 'email';\n\t\t}\n\n\t\tformData.formFields.push(input as FormTriggerInput);\n\t}\n\n\treturn formData;\n}\n\nexport const validateResponseModeConfiguration = (context: IWebhookFunctions) => {\n\tconst responseMode = context.getNodeParameter('responseMode', 'onReceived') as string;\n\tconst connectedNodes = context.getChildNodes(context.getNode().name);\n\tconst nodeVersion = context.getNode().typeVersion;\n\n\tconst isRespondToWebhookConnected = connectedNodes.some(\n\t\t(node) => node.type === 'n8n-nodes-base.respondToWebhook',\n\t);\n\n\tif (!isRespondToWebhookConnected && responseMode === 'responseNode') {\n\t\tthrow new NodeOperationError(\n\t\t\tcontext.getNode(),\n\t\t\tnew Error('No Respond to Webhook node found in the workflow'),\n\t\t\t{\n\t\t\t\tdescription:\n\t\t\t\t\t'Insert a Respond to Webhook node to your workflow to respond to the form submission or choose another option for the “Respond When” parameter',\n\t\t\t},\n\t\t);\n\t}\n\n\tif (isRespondToWebhookConnected && responseMode !== 'responseNode' && nodeVersion <= 2.1) {\n\t\tthrow new NodeOperationError(\n\t\t\tcontext.getNode(),\n\t\t\tnew Error(`${context.getNode().name} node not correctly configured`),\n\t\t\t{\n\t\t\t\tdescription:\n\t\t\t\t\t'Set the “Respond When” parameter to “Using Respond to Webhook Node” or remove the Respond to Webhook node',\n\t\t\t},\n\t\t);\n\t}\n\n\tif (isRespondToWebhookConnected && nodeVersion > 2.1) {\n\t\tthrow new NodeOperationError(\n\t\t\tcontext.getNode(),\n\t\t\tnew Error(\n\t\t\t\t'The \"Respond to Webhook\" node is not supported in workflows initiated by the \"n8n Form Trigger\"',\n\t\t\t),\n\t\t\t{\n\t\t\t\tdescription:\n\t\t\t\t\t'To configure your response, add an \"n8n Form\" node and set the \"Page Type\" to \"Form Ending\"',\n\t\t\t},\n\t\t);\n\t}\n};\n\nexport function addFormResponseDataToReturnItem(\n\treturnItem: INodeExecutionData,\n\tformFields: FormFieldsParameter,\n\tbodyData: IDataObject,\n) {\n\tfor (const [index, field] of formFields.entries()) {\n\t\tconst key = `field-${index}`;\n\t\tconst name = field.fieldLabel ?? field.fieldName;\n\t\tlet value = bodyData[key] ?? null;\n\n\t\tif (value === null) {\n\t\t\treturnItem.json[name] = null;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.fieldType === 'html') {\n\t\t\tif (field.elementName) {\n\t\t\t\treturnItem.json[field.elementName] = value;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.fieldType === 'number') {\n\t\t\tvalue = Number(value);\n\t\t}\n\t\tif (field.fieldType === 'text') {\n\t\t\tvalue = String(value).trim();\n\t\t}\n\t\tif (field.multiselect && typeof value === 'string') {\n\t\t\tvalue = jsonParse(value);\n\t\t}\n\t\tif (field.fieldType === 'date' && value && field.formatDate !== '') {\n\t\t\tvalue = DateTime.fromFormat(String(value), 'yyyy-mm-dd').toFormat(field.formatDate as string);\n\t\t}\n\t\tif (field.fieldType === 'file' && field.multipleFiles && !Array.isArray(value)) {\n\t\t\tvalue = [value];\n\t\t}\n\n\t\treturnItem.json[name] = value;\n\t}\n}\n\nexport async function prepareFormReturnItem(\n\tcontext: IWebhookFunctions,\n\tformFields: FormFieldsParameter,\n\tmode: 'test' | 'production',\n\tuseWorkflowTimezone: boolean = false,\n) {\n\tconst bodyData = (context.getBodyData().data as IDataObject) ?? {};\n\tconst files = (context.getBodyData().files as IDataObject) ?? {};\n\n\tconst returnItem: INodeExecutionData = {\n\t\tjson: {},\n\t};\n\tif (files && Object.keys(files).length) {\n\t\treturnItem.binary = {};\n\t}\n\n\tfor (const key of Object.keys(files)) {\n\t\tconst processFiles: MultiPartFormData.File[] = [];\n\t\tlet multiFile = false;\n\t\tconst filesInput = files[key] as MultiPartFormData.File[] | MultiPartFormData.File;\n\n\t\tif (Array.isArray(filesInput)) {\n\t\t\tbodyData[key] = filesInput.map((file) => ({\n\t\t\t\tfilename: file.originalFilename,\n\t\t\t\tmimetype: file.mimetype,\n\t\t\t\tsize: file.size,\n\t\t\t}));\n\t\t\tprocessFiles.push(...filesInput);\n\t\t\tmultiFile = true;\n\t\t} else {\n\t\t\tbodyData[key] = {\n\t\t\t\tfilename: filesInput.originalFilename,\n\t\t\t\tmimetype: filesInput.mimetype,\n\t\t\t\tsize: filesInput.size,\n\t\t\t};\n\t\t\tprocessFiles.push(filesInput);\n\t\t}\n\n\t\tconst entryIndex = Number(key.replace(/field-/g, ''));\n\t\tconst fieldLabel = isNaN(entryIndex) ? key : formFields[entryIndex].fieldLabel;\n\n\t\tlet fileCount = 0;\n\t\tfor (const file of processFiles) {\n\t\t\tlet binaryPropertyName = fieldLabel.replace(/\\W/g, '_');\n\n\t\t\tif (multiFile) {\n\t\t\t\tbinaryPropertyName += `_${fileCount++}`;\n\t\t\t}\n\n\t\t\treturnItem.binary![binaryPropertyName] = await context.nodeHelpers.copyBinaryFile(\n\t\t\t\tfile.filepath,\n\t\t\t\tfile.originalFilename ?? file.newFilename,\n\t\t\t\tfile.mimetype,\n\t\t\t);\n\t\t}\n\t}\n\n\taddFormResponseDataToReturnItem(returnItem, formFields, bodyData);\n\n\tconst timezone = useWorkflowTimezone ? context.getTimezone() : 'UTC';\n\treturnItem.json.submittedAt = DateTime.now().setZone(timezone).toISO();\n\n\treturnItem.json.formMode = mode;\n\n\tconst workflowStaticData = context.getWorkflowStaticData('node');\n\tif (\n\t\tObject.keys(workflowStaticData || {}).length &&\n\t\tcontext.getNode().type === FORM_TRIGGER_NODE_TYPE\n\t) {\n\t\treturnItem.json.formQueryParameters = workflowStaticData;\n\t}\n\n\treturn returnItem;\n}\n\nexport function renderForm({\n\tcontext,\n\tres,\n\tformTitle,\n\tformDescription,\n\tformFields,\n\tresponseMode,\n\tmode,\n\tformSubmittedText,\n\tredirectUrl,\n\tappendAttribution,\n\tbuttonLabel,\n\tcustomCss,\n}: {\n\tcontext: IWebhookFunctions;\n\tres: Response;\n\tformTitle: string;\n\tformDescription: string;\n\tformFields: FormFieldsParameter;\n\tresponseMode: string;\n\tmode: 'test' | 'production';\n\tformSubmittedText?: string;\n\tredirectUrl?: string;\n\tappendAttribution?: boolean;\n\tbuttonLabel?: string;\n\tcustomCss?: string;\n}) {\n\tformDescription = (formDescription || '').replace(/\\\\n/g, '\\n').replace(/<br>/g, '\\n');\n\tconst instanceId = context.getInstanceId();\n\n\tconst useResponseData = responseMode === 'responseNode';\n\n\tlet query: IDataObject = {};\n\n\tif (context.getNode().type === FORM_TRIGGER_NODE_TYPE) {\n\t\tquery = context.getRequestObject().query as IDataObject;\n\t\tconst workflowStaticData = context.getWorkflowStaticData('node');\n\t\tfor (const key of Object.keys(query)) {\n\t\t\tworkflowStaticData[key] = query[key];\n\t\t}\n\t} else if (context.getNode().type === FORM_NODE_TYPE) {\n\t\tconst parentNodes = context.getParentNodes(context.getNode().name);\n\t\tconst trigger = parentNodes.find(\n\t\t\t(node) => node.type === FORM_TRIGGER_NODE_TYPE,\n\t\t) as NodeTypeAndVersion;\n\t\ttry {\n\t\t\tconst triggerQueryParameters = context.evaluateExpression(\n\t\t\t\t`{{ $('${trigger?.name}').first().json.formQueryParameters }}`,\n\t\t\t) as IDataObject;\n\n\t\t\tif (triggerQueryParameters) {\n\t\t\t\tquery = triggerQueryParameters;\n\t\t\t}\n\t\t} catch (error) {}\n\t}\n\n\tformFields = prepareFormFields(context, formFields);\n\n\tconst data = prepareFormData({\n\t\tformTitle,\n\t\tformDescription,\n\t\tformSubmittedText,\n\t\tredirectUrl,\n\t\tformFields,\n\t\ttestRun: mode === 'test',\n\t\tquery,\n\t\tinstanceId,\n\t\tuseResponseData,\n\t\tappendAttribution,\n\t\tbuttonLabel,\n\t\tcustomCss,\n\t});\n\n\tres.render('form-trigger', data);\n}\n\nexport const isFormConnected = (nodes: NodeTypeAndVersion[]) => {\n\treturn nodes.some(\n\t\t(n) =>\n\t\t\tn.type === FORM_NODE_TYPE || (n.type === WAIT_NODE_TYPE && n.parameters?.resume === 'form'),\n\t);\n};\n\nexport async function formWebhook(\n\tcontext: IWebhookFunctions,\n\tauthProperty = FORM_TRIGGER_AUTHENTICATION_PROPERTY,\n) {\n\tconst node = context.getNode();\n\tconst options = context.getNodeParameter('options', {}) as {\n\t\tignoreBots?: boolean;\n\t\trespondWithOptions?: {\n\t\t\tvalues: {\n\t\t\t\trespondWith: 'text' | 'redirect';\n\t\t\t\tformSubmittedText: string;\n\t\t\t\tredirectUrl: string;\n\t\t\t};\n\t\t};\n\t\tformSubmittedText?: string;\n\t\tuseWorkflowTimezone?: boolean;\n\t\tappendAttribution?: boolean;\n\t\tbuttonLabel?: string;\n\t\tcustomCss?: string;\n\t};\n\tconst res = context.getResponseObject();\n\tconst req = context.getRequestObject();\n\n\ttry {\n\t\tif (options.ignoreBots && isbot(req.headers['user-agent'])) {\n\t\t\tthrow new WebhookAuthorizationError(403);\n\t\t}\n\t\tif (node.typeVersion > 1) {\n\t\t\tawait validateWebhookAuthentication(context, authProperty);\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof WebhookAuthorizationError) {\n\t\t\tres.setHeader('WWW-Authenticate', 'Basic realm=\"Enter credentials\"');\n\t\t\tres.status(401).send();\n\t\t\treturn { noWebhookResponse: true };\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst mode = context.getMode() === 'manual' ? 'test' : 'production';\n\tconst formFields = context.getNodeParameter('formFields.values', []) as FormFieldsParameter;\n\n\tconst method = context.getRequestObject().method;\n\n\tvalidateResponseModeConfiguration(context);\n\n\t//Show the form on GET request\n\tif (method === 'GET') {\n\t\tconst formTitle = context.getNodeParameter('formTitle', '') as string;\n\t\tconst formDescription = sanitizeHtml(context.getNodeParameter('formDescription', '') as string);\n\t\tlet responseMode = context.getNodeParameter('responseMode', '') as string;\n\n\t\tlet formSubmittedText;\n\t\tlet redirectUrl;\n\t\tlet appendAttribution = true;\n\n\t\tif (options.respondWithOptions) {\n\t\t\tconst values = (options.respondWithOptions as IDataObject).values as IDataObject;\n\t\t\tif (values.respondWith === 'text') {\n\t\t\t\tformSubmittedText = values.formSubmittedText as string;\n\t\t\t}\n\t\t\tif (values.respondWith === 'redirect') {\n\t\t\t\tredirectUrl = values.redirectUrl as string;\n\t\t\t}\n\t\t} else {\n\t\t\tformSubmittedText = options.formSubmittedText as string;\n\t\t}\n\n\t\tif (options.appendAttribution === false) {\n\t\t\tappendAttribution = false;\n\t\t}\n\n\t\tlet buttonLabel = 'Submit';\n\n\t\tif (options.buttonLabel) {\n\t\t\tbuttonLabel = options.buttonLabel;\n\t\t}\n\n\t\tconst connectedNodes = context.getChildNodes(context.getNode().name, {\n\t\t\tincludeNodeParameters: true,\n\t\t});\n\t\tconst hasNextPage = isFormConnected(connectedNodes);\n\n\t\tif (hasNextPage) {\n\t\t\tredirectUrl = undefined;\n\t\t\tresponseMode = 'responseNode';\n\t\t}\n\n\t\trenderForm({\n\t\t\tcontext,\n\t\t\tres,\n\t\t\tformTitle,\n\t\t\tformDescription,\n\t\t\tformFields,\n\t\t\tresponseMode,\n\t\t\tmode,\n\t\t\tformSubmittedText,\n\t\t\tredirectUrl,\n\t\t\tappendAttribution,\n\t\t\tbuttonLabel,\n\t\t\tcustomCss: options.customCss,\n\t\t});\n\n\t\treturn {\n\t\t\tnoWebhookResponse: true,\n\t\t};\n\t}\n\n\tlet { useWorkflowTimezone } = options;\n\n\tif (useWorkflowTimezone === undefined && node.typeVersion > 2) {\n\t\tuseWorkflowTimezone = true;\n\t}\n\n\tconst returnItem = await prepareFormReturnItem(context, formFields, mode, useWorkflowTimezone);\n\n\treturn {\n\t\twebhookResponse: { status: 200 },\n\t\tworkflowData: [[returnItem]],\n\t};\n}\n\nexport function resolveRawData(context: IWebhookFunctions, rawData: string) {\n\tconst resolvables = getResolvables(rawData);\n\tlet returnData: string = rawData;\n\n\tif (returnData.startsWith('=')) {\n\t\treturnData = returnData.replace(/^=+/, '');\n\t} else {\n\t\treturn returnData;\n\t}\n\n\tif (resolvables.length) {\n\t\tfor (const resolvable of resolvables) {\n\t\t\tconst resolvedValue = context.evaluateExpression(`${resolvable}`);\n\n\t\t\tif (typeof resolvedValue === 'object' && resolvedValue !== null) {\n\t\t\t\treturnData = returnData.replace(resolvable, JSON.stringify(resolvedValue));\n\t\t\t} else {\n\t\t\t\treturnData = returnData.replace(resolvable, resolvedValue as string);\n\t\t\t}\n\t\t}\n\t}\n\treturn returnData;\n}\n"],"mappings":"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","names":["sanitize","isbot"]}
1
+ {"version":3,"sources":["../../../nodes/Form/utils.ts"],"sourcesContent":["import type { Response } from 'express';\nimport isbot from 'isbot';\nimport { DateTime } from 'luxon';\nimport type {\n\tINodeExecutionData,\n\tMultiPartFormData,\n\tIDataObject,\n\tIWebhookFunctions,\n\tFormFieldsParameter,\n\tNodeTypeAndVersion,\n} from 'n8n-workflow';\nimport {\n\tFORM_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tNodeOperationError,\n\tWAIT_NODE_TYPE,\n\tjsonParse,\n} from 'n8n-workflow';\nimport sanitize from 'sanitize-html';\n\nimport type { FormTriggerData, FormTriggerInput } from './interfaces';\nimport { FORM_TRIGGER_AUTHENTICATION_PROPERTY } from './interfaces';\nimport { getResolvables } from '../../utils/utilities';\nimport { WebhookAuthorizationError } from '../Webhook/error';\nimport { validateWebhookAuthentication } from '../Webhook/utils';\n\nexport function sanitizeHtml(text: string) {\n\treturn sanitize(text, {\n\t\tallowedTags: [\n\t\t\t'b',\n\t\t\t'div',\n\t\t\t'i',\n\t\t\t'iframe',\n\t\t\t'img',\n\t\t\t'video',\n\t\t\t'source',\n\t\t\t'em',\n\t\t\t'strong',\n\t\t\t'a',\n\t\t\t'h1',\n\t\t\t'h2',\n\t\t\t'h3',\n\t\t\t'h4',\n\t\t\t'h5',\n\t\t\t'h6',\n\t\t\t'u',\n\t\t\t'sub',\n\t\t\t'sup',\n\t\t\t'code',\n\t\t\t'pre',\n\t\t\t'span',\n\t\t\t'br',\n\t\t\t'ul',\n\t\t\t'ol',\n\t\t\t'li',\n\t\t\t'p',\n\t\t],\n\t\tallowedAttributes: {\n\t\t\ta: ['href', 'target', 'rel'],\n\t\t\timg: ['src', 'alt', 'width', 'height'],\n\t\t\tvideo: ['*'],\n\t\t\tiframe: ['*'],\n\t\t\tsource: ['*'],\n\t\t},\n\t\ttransformTags: {\n\t\t\tiframe: sanitize.simpleTransform('iframe', {\n\t\t\t\tsandbox: '',\n\t\t\t\treferrerpolicy: 'strict-origin-when-cross-origin',\n\t\t\t\tallow: 'fullscreen; autoplay; encrypted-media',\n\t\t\t}),\n\t\t},\n\t});\n}\n\nexport const prepareFormFields = (context: IWebhookFunctions, fields: FormFieldsParameter) => {\n\treturn fields.map((field) => {\n\t\tif (field.fieldType === 'html') {\n\t\t\tlet { html } = field;\n\n\t\t\tif (!html) return field;\n\n\t\t\tfor (const resolvable of getResolvables(html)) {\n\t\t\t\thtml = html.replace(resolvable, context.evaluateExpression(resolvable) as string);\n\t\t\t}\n\n\t\t\tfield.html = sanitizeHtml(html as string);\n\t\t}\n\n\t\tif (field.fieldType === 'hiddenField') {\n\t\t\tfield.fieldLabel = field.fieldName as string;\n\t\t}\n\n\t\treturn field;\n\t});\n};\n\nexport function sanitizeCustomCss(css: string | undefined): string | undefined {\n\tif (!css) return undefined;\n\n\t// Use sanitize-html with custom settings for CSS\n\treturn sanitize(css, {\n\t\tallowedTags: [], // No HTML tags allowed\n\t\tallowedAttributes: {}, // No attributes allowed\n\t\t// This ensures we're only keeping the text content\n\t\t// which should be the CSS, while removing any HTML/script tags\n\t});\n}\n\nexport function createDescriptionMetadata(description: string) {\n\treturn description === ''\n\t\t? 'n8n form'\n\t\t: description.replace(/^\\s*\\n+|<\\/?[^>]+(>|$)/g, '').slice(0, 150);\n}\n\nexport function prepareFormData({\n\tformTitle,\n\tformDescription,\n\tformSubmittedHeader,\n\tformSubmittedText,\n\tredirectUrl,\n\tformFields,\n\ttestRun,\n\tquery,\n\tinstanceId,\n\tuseResponseData,\n\tappendAttribution = true,\n\tbuttonLabel,\n\tcustomCss,\n}: {\n\tformTitle: string;\n\tformDescription: string;\n\tformSubmittedText: string | undefined;\n\tredirectUrl: string | undefined;\n\tformFields: FormFieldsParameter;\n\ttestRun: boolean;\n\tquery: IDataObject;\n\tinstanceId?: string;\n\tuseResponseData?: boolean;\n\tappendAttribution?: boolean;\n\tbuttonLabel?: string;\n\tformSubmittedHeader?: string;\n\tcustomCss?: string;\n}) {\n\tconst utm_campaign = instanceId ? `&utm_campaign=${instanceId}` : '';\n\tconst n8nWebsiteLink = `https://n8n.io/?utm_source=n8n-internal&utm_medium=form-trigger${utm_campaign}`;\n\n\tif (formSubmittedText === undefined) {\n\t\tformSubmittedText = 'Your response has been recorded';\n\t}\n\n\tconst formData: FormTriggerData = {\n\t\ttestRun,\n\t\tformTitle,\n\t\tformDescription,\n\t\tformDescriptionMetadata: createDescriptionMetadata(formDescription),\n\t\tformSubmittedHeader,\n\t\tformSubmittedText,\n\t\tn8nWebsiteLink,\n\t\tformFields: [],\n\t\tuseResponseData,\n\t\tappendAttribution,\n\t\tbuttonLabel,\n\t\tdangerousCustomCss: sanitizeCustomCss(customCss),\n\t};\n\n\tif (redirectUrl) {\n\t\tif (!redirectUrl.includes('://')) {\n\t\t\tredirectUrl = `http://${redirectUrl}`;\n\t\t}\n\t\tformData.redirectUrl = redirectUrl;\n\t}\n\n\tfor (const [index, field] of formFields.entries()) {\n\t\tconst { fieldType, requiredField, multiselect, placeholder } = field;\n\n\t\tconst input: IDataObject = {\n\t\t\tid: `field-${index}`,\n\t\t\terrorId: `error-field-${index}`,\n\t\t\tlabel: field.fieldLabel,\n\t\t\tinputRequired: requiredField ? 'form-required' : '',\n\t\t\tdefaultValue: query[field.fieldLabel] ?? '',\n\t\t\tplaceholder,\n\t\t};\n\n\t\tif (multiselect) {\n\t\t\tinput.isMultiSelect = true;\n\t\t\tinput.multiSelectOptions =\n\t\t\t\tfield.fieldOptions?.values.map((e, i) => ({\n\t\t\t\t\tid: `option${i}_${input.id}`,\n\t\t\t\t\tlabel: e.option,\n\t\t\t\t})) ?? [];\n\t\t} else if (fieldType === 'file') {\n\t\t\tinput.isFileInput = true;\n\t\t\tinput.acceptFileTypes = field.acceptFileTypes;\n\t\t\tinput.multipleFiles = field.multipleFiles ? 'multiple' : '';\n\t\t} else if (fieldType === 'dropdown') {\n\t\t\tinput.isSelect = true;\n\t\t\tconst fieldOptions = field.fieldOptions?.values ?? [];\n\t\t\tinput.selectOptions = fieldOptions.map((e) => e.option);\n\t\t} else if (fieldType === 'textarea') {\n\t\t\tinput.isTextarea = true;\n\t\t} else if (fieldType === 'html') {\n\t\t\tinput.isHtml = true;\n\t\t\tinput.html = field.html as string;\n\t\t} else if (fieldType === 'hiddenField') {\n\t\t\tinput.isHidden = true;\n\t\t\tinput.hiddenName = field.fieldName as string;\n\t\t\tinput.hiddenValue =\n\t\t\t\tinput.defaultValue === '' ? (field.fieldValue as string) : input.defaultValue;\n\t\t} else {\n\t\t\tinput.isInput = true;\n\t\t\tinput.type = fieldType as 'text' | 'number' | 'date' | 'email';\n\t\t}\n\n\t\tformData.formFields.push(input as FormTriggerInput);\n\t}\n\n\treturn formData;\n}\n\nexport const validateResponseModeConfiguration = (context: IWebhookFunctions) => {\n\tconst responseMode = context.getNodeParameter('responseMode', 'onReceived') as string;\n\tconst connectedNodes = context.getChildNodes(context.getNode().name);\n\tconst nodeVersion = context.getNode().typeVersion;\n\n\tconst isRespondToWebhookConnected = connectedNodes.some(\n\t\t(node) => node.type === 'n8n-nodes-base.respondToWebhook',\n\t);\n\n\tif (!isRespondToWebhookConnected && responseMode === 'responseNode') {\n\t\tthrow new NodeOperationError(\n\t\t\tcontext.getNode(),\n\t\t\tnew Error('No Respond to Webhook node found in the workflow'),\n\t\t\t{\n\t\t\t\tdescription:\n\t\t\t\t\t'Insert a Respond to Webhook node to your workflow to respond to the form submission or choose another option for the “Respond When” parameter',\n\t\t\t},\n\t\t);\n\t}\n\n\tif (isRespondToWebhookConnected && responseMode !== 'responseNode' && nodeVersion <= 2.1) {\n\t\tthrow new NodeOperationError(\n\t\t\tcontext.getNode(),\n\t\t\tnew Error(`${context.getNode().name} node not correctly configured`),\n\t\t\t{\n\t\t\t\tdescription:\n\t\t\t\t\t'Set the “Respond When” parameter to “Using Respond to Webhook Node” or remove the Respond to Webhook node',\n\t\t\t},\n\t\t);\n\t}\n\n\tif (isRespondToWebhookConnected && nodeVersion > 2.1) {\n\t\tthrow new NodeOperationError(\n\t\t\tcontext.getNode(),\n\t\t\tnew Error(\n\t\t\t\t'The \"Respond to Webhook\" node is not supported in workflows initiated by the \"n8n Form Trigger\"',\n\t\t\t),\n\t\t\t{\n\t\t\t\tdescription:\n\t\t\t\t\t'To configure your response, add an \"n8n Form\" node and set the \"Page Type\" to \"Form Ending\"',\n\t\t\t},\n\t\t);\n\t}\n};\n\nexport function addFormResponseDataToReturnItem(\n\treturnItem: INodeExecutionData,\n\tformFields: FormFieldsParameter,\n\tbodyData: IDataObject,\n) {\n\tfor (const [index, field] of formFields.entries()) {\n\t\tconst key = `field-${index}`;\n\t\tconst name = field.fieldLabel ?? field.fieldName;\n\t\tlet value = bodyData[key] ?? null;\n\n\t\tif (value === null) {\n\t\t\treturnItem.json[name] = null;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.fieldType === 'html') {\n\t\t\tif (field.elementName) {\n\t\t\t\treturnItem.json[field.elementName] = value;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.fieldType === 'number') {\n\t\t\tvalue = Number(value);\n\t\t}\n\t\tif (field.fieldType === 'text') {\n\t\t\tvalue = String(value).trim();\n\t\t}\n\t\tif (field.multiselect && typeof value === 'string') {\n\t\t\tvalue = jsonParse(value);\n\t\t}\n\t\tif (field.fieldType === 'date' && value && field.formatDate !== '') {\n\t\t\tvalue = DateTime.fromFormat(String(value), 'yyyy-mm-dd').toFormat(field.formatDate as string);\n\t\t}\n\t\tif (field.fieldType === 'file' && field.multipleFiles && !Array.isArray(value)) {\n\t\t\tvalue = [value];\n\t\t}\n\n\t\treturnItem.json[name] = value;\n\t}\n}\n\nexport async function prepareFormReturnItem(\n\tcontext: IWebhookFunctions,\n\tformFields: FormFieldsParameter,\n\tmode: 'test' | 'production',\n\tuseWorkflowTimezone: boolean = false,\n) {\n\tconst bodyData = (context.getBodyData().data as IDataObject) ?? {};\n\tconst files = (context.getBodyData().files as IDataObject) ?? {};\n\n\tconst returnItem: INodeExecutionData = {\n\t\tjson: {},\n\t};\n\tif (files && Object.keys(files).length) {\n\t\treturnItem.binary = {};\n\t}\n\n\tfor (const key of Object.keys(files)) {\n\t\tconst processFiles: MultiPartFormData.File[] = [];\n\t\tlet multiFile = false;\n\t\tconst filesInput = files[key] as MultiPartFormData.File[] | MultiPartFormData.File;\n\n\t\tif (Array.isArray(filesInput)) {\n\t\t\tbodyData[key] = filesInput.map((file) => ({\n\t\t\t\tfilename: file.originalFilename,\n\t\t\t\tmimetype: file.mimetype,\n\t\t\t\tsize: file.size,\n\t\t\t}));\n\t\t\tprocessFiles.push(...filesInput);\n\t\t\tmultiFile = true;\n\t\t} else {\n\t\t\tbodyData[key] = {\n\t\t\t\tfilename: filesInput.originalFilename,\n\t\t\t\tmimetype: filesInput.mimetype,\n\t\t\t\tsize: filesInput.size,\n\t\t\t};\n\t\t\tprocessFiles.push(filesInput);\n\t\t}\n\n\t\tconst entryIndex = Number(key.replace(/field-/g, ''));\n\t\tconst fieldLabel = isNaN(entryIndex) ? key : formFields[entryIndex].fieldLabel;\n\n\t\tlet fileCount = 0;\n\t\tfor (const file of processFiles) {\n\t\t\tlet binaryPropertyName = fieldLabel.replace(/\\W/g, '_');\n\n\t\t\tif (multiFile) {\n\t\t\t\tbinaryPropertyName += `_${fileCount++}`;\n\t\t\t}\n\n\t\t\treturnItem.binary![binaryPropertyName] = await context.nodeHelpers.copyBinaryFile(\n\t\t\t\tfile.filepath,\n\t\t\t\tfile.originalFilename ?? file.newFilename,\n\t\t\t\tfile.mimetype,\n\t\t\t);\n\t\t}\n\t}\n\n\taddFormResponseDataToReturnItem(returnItem, formFields, bodyData);\n\n\tconst timezone = useWorkflowTimezone ? context.getTimezone() : 'UTC';\n\treturnItem.json.submittedAt = DateTime.now().setZone(timezone).toISO();\n\n\treturnItem.json.formMode = mode;\n\n\tif (\n\t\tcontext.getNode().type === FORM_TRIGGER_NODE_TYPE &&\n\t\tObject.keys(context.getRequestObject().query || {}).length\n\t) {\n\t\treturnItem.json.formQueryParameters = context.getRequestObject().query;\n\t}\n\n\treturn returnItem;\n}\n\nexport function renderForm({\n\tcontext,\n\tres,\n\tformTitle,\n\tformDescription,\n\tformFields,\n\tresponseMode,\n\tmode,\n\tformSubmittedText,\n\tredirectUrl,\n\tappendAttribution,\n\tbuttonLabel,\n\tcustomCss,\n}: {\n\tcontext: IWebhookFunctions;\n\tres: Response;\n\tformTitle: string;\n\tformDescription: string;\n\tformFields: FormFieldsParameter;\n\tresponseMode: string;\n\tmode: 'test' | 'production';\n\tformSubmittedText?: string;\n\tredirectUrl?: string;\n\tappendAttribution?: boolean;\n\tbuttonLabel?: string;\n\tcustomCss?: string;\n}) {\n\tformDescription = (formDescription || '').replace(/\\\\n/g, '\\n').replace(/<br>/g, '\\n');\n\tconst instanceId = context.getInstanceId();\n\n\tconst useResponseData = responseMode === 'responseNode';\n\n\tlet query: IDataObject = {};\n\n\tif (context.getNode().type === FORM_TRIGGER_NODE_TYPE) {\n\t\tquery = context.getRequestObject().query as IDataObject;\n\t} else if (context.getNode().type === FORM_NODE_TYPE) {\n\t\tconst parentNodes = context.getParentNodes(context.getNode().name);\n\t\tconst trigger = parentNodes.find(\n\t\t\t(node) => node.type === FORM_TRIGGER_NODE_TYPE,\n\t\t) as NodeTypeAndVersion;\n\t\ttry {\n\t\t\tconst triggerQueryParameters = context.evaluateExpression(\n\t\t\t\t`{{ $('${trigger?.name}').first().json.formQueryParameters }}`,\n\t\t\t) as IDataObject;\n\n\t\t\tif (triggerQueryParameters) {\n\t\t\t\tquery = triggerQueryParameters;\n\t\t\t}\n\t\t} catch (error) {}\n\t}\n\n\tformFields = prepareFormFields(context, formFields);\n\n\tconst data = prepareFormData({\n\t\tformTitle,\n\t\tformDescription,\n\t\tformSubmittedText,\n\t\tredirectUrl,\n\t\tformFields,\n\t\ttestRun: mode === 'test',\n\t\tquery,\n\t\tinstanceId,\n\t\tuseResponseData,\n\t\tappendAttribution,\n\t\tbuttonLabel,\n\t\tcustomCss,\n\t});\n\n\tres.render('form-trigger', data);\n}\n\nexport const isFormConnected = (nodes: NodeTypeAndVersion[]) => {\n\treturn nodes.some(\n\t\t(n) =>\n\t\t\tn.type === FORM_NODE_TYPE || (n.type === WAIT_NODE_TYPE && n.parameters?.resume === 'form'),\n\t);\n};\n\nexport async function formWebhook(\n\tcontext: IWebhookFunctions,\n\tauthProperty = FORM_TRIGGER_AUTHENTICATION_PROPERTY,\n) {\n\tconst node = context.getNode();\n\tconst options = context.getNodeParameter('options', {}) as {\n\t\tignoreBots?: boolean;\n\t\trespondWithOptions?: {\n\t\t\tvalues: {\n\t\t\t\trespondWith: 'text' | 'redirect';\n\t\t\t\tformSubmittedText: string;\n\t\t\t\tredirectUrl: string;\n\t\t\t};\n\t\t};\n\t\tformSubmittedText?: string;\n\t\tuseWorkflowTimezone?: boolean;\n\t\tappendAttribution?: boolean;\n\t\tbuttonLabel?: string;\n\t\tcustomCss?: string;\n\t};\n\tconst res = context.getResponseObject();\n\tconst req = context.getRequestObject();\n\n\ttry {\n\t\tif (options.ignoreBots && isbot(req.headers['user-agent'])) {\n\t\t\tthrow new WebhookAuthorizationError(403);\n\t\t}\n\t\tif (node.typeVersion > 1) {\n\t\t\tawait validateWebhookAuthentication(context, authProperty);\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof WebhookAuthorizationError) {\n\t\t\tres.setHeader('WWW-Authenticate', 'Basic realm=\"Enter credentials\"');\n\t\t\tres.status(401).send();\n\t\t\treturn { noWebhookResponse: true };\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst mode = context.getMode() === 'manual' ? 'test' : 'production';\n\tconst formFields = context.getNodeParameter('formFields.values', []) as FormFieldsParameter;\n\n\tconst method = context.getRequestObject().method;\n\n\tvalidateResponseModeConfiguration(context);\n\n\t//Show the form on GET request\n\tif (method === 'GET') {\n\t\tconst formTitle = context.getNodeParameter('formTitle', '') as string;\n\t\tconst formDescription = sanitizeHtml(context.getNodeParameter('formDescription', '') as string);\n\t\tlet responseMode = context.getNodeParameter('responseMode', '') as string;\n\n\t\tlet formSubmittedText;\n\t\tlet redirectUrl;\n\t\tlet appendAttribution = true;\n\n\t\tif (options.respondWithOptions) {\n\t\t\tconst values = (options.respondWithOptions as IDataObject).values as IDataObject;\n\t\t\tif (values.respondWith === 'text') {\n\t\t\t\tformSubmittedText = values.formSubmittedText as string;\n\t\t\t}\n\t\t\tif (values.respondWith === 'redirect') {\n\t\t\t\tredirectUrl = values.redirectUrl as string;\n\t\t\t}\n\t\t} else {\n\t\t\tformSubmittedText = options.formSubmittedText as string;\n\t\t}\n\n\t\tif (options.appendAttribution === false) {\n\t\t\tappendAttribution = false;\n\t\t}\n\n\t\tlet buttonLabel = 'Submit';\n\n\t\tif (options.buttonLabel) {\n\t\t\tbuttonLabel = options.buttonLabel;\n\t\t}\n\n\t\tconst connectedNodes = context.getChildNodes(context.getNode().name, {\n\t\t\tincludeNodeParameters: true,\n\t\t});\n\t\tconst hasNextPage = isFormConnected(connectedNodes);\n\n\t\tif (hasNextPage) {\n\t\t\tredirectUrl = undefined;\n\t\t\tresponseMode = 'responseNode';\n\t\t}\n\n\t\trenderForm({\n\t\t\tcontext,\n\t\t\tres,\n\t\t\tformTitle,\n\t\t\tformDescription,\n\t\t\tformFields,\n\t\t\tresponseMode,\n\t\t\tmode,\n\t\t\tformSubmittedText,\n\t\t\tredirectUrl,\n\t\t\tappendAttribution,\n\t\t\tbuttonLabel,\n\t\t\tcustomCss: options.customCss,\n\t\t});\n\n\t\treturn {\n\t\t\tnoWebhookResponse: true,\n\t\t};\n\t}\n\n\tlet { useWorkflowTimezone } = options;\n\n\tif (useWorkflowTimezone === undefined && node.typeVersion > 2) {\n\t\tuseWorkflowTimezone = true;\n\t}\n\n\tconst returnItem = await prepareFormReturnItem(context, formFields, mode, useWorkflowTimezone);\n\n\treturn {\n\t\twebhookResponse: { status: 200 },\n\t\tworkflowData: [[returnItem]],\n\t};\n}\n\nexport function resolveRawData(context: IWebhookFunctions, rawData: string) {\n\tconst resolvables = getResolvables(rawData);\n\tlet returnData: string = rawData;\n\n\tif (returnData.startsWith('=')) {\n\t\treturnData = returnData.replace(/^=+/, '');\n\t} else {\n\t\treturn returnData;\n\t}\n\n\tif (resolvables.length) {\n\t\tfor (const resolvable of resolvables) {\n\t\t\tconst resolvedValue = context.evaluateExpression(`${resolvable}`);\n\n\t\t\tif (typeof resolvedValue === 'object' && resolvedValue !== null) {\n\t\t\t\treturnData = returnData.replace(resolvable, JSON.stringify(resolvedValue));\n\t\t\t} else {\n\t\t\t\treturnData = returnData.replace(resolvable, resolvedValue as string);\n\t\t\t}\n\t\t}\n\t}\n\treturn returnData;\n}\n"],"mappings":"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","names":["sanitize","isbot"]}
@@ -24,19 +24,19 @@ module.exports = __toCommonJS(Freshdesk_node_exports);
24
24
  var import_n8n_workflow = require("n8n-workflow");
25
25
  var import_ContactDescription = require("./ContactDescription");
26
26
  var import_GenericFunctions = require("./GenericFunctions");
27
- const Statuses = {
27
+ const Status = {
28
28
  Open: 2,
29
29
  Pending: 3,
30
30
  Resolved: 4,
31
31
  Closed: 5
32
32
  };
33
- const Priorities = {
33
+ const Priority = {
34
34
  Low: 1,
35
35
  Medium: 2,
36
36
  High: 3,
37
37
  Urgent: 4
38
38
  };
39
- const Sources = {
39
+ const Source = {
40
40
  Email: 1,
41
41
  Portal: 2,
42
42
  Phone: 3,
@@ -1048,11 +1048,8 @@ class Freshdesk {
1048
1048
  const source = this.getNodeParameter("source", i);
1049
1049
  const options = this.getNodeParameter("options", i);
1050
1050
  const body = {
1051
- // @ts-ignore
1052
1051
  status: Status[(0, import_GenericFunctions.capitalize)(status)],
1053
- // @ts-ignore
1054
1052
  priority: Priority[(0, import_GenericFunctions.capitalize)(priority)],
1055
- // @ts-ignore
1056
1053
  source: Source[(0, import_GenericFunctions.capitalize)(source)]
1057
1054
  };
1058
1055
  if (requester === "requesterId") {