n8n-nodes-base 1.88.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.
- package/dist/credentials/Aws.credentials.js +16 -2
- package/dist/credentials/Aws.credentials.js.map +1 -1
- package/dist/nodes/Airtable/v2/actions/record/update.operation.js +15 -3
- package/dist/nodes/Airtable/v2/actions/record/update.operation.js.map +1 -1
- package/dist/nodes/Form/utils.js +2 -7
- package/dist/nodes/Form/utils.js.map +1 -1
- package/dist/nodes/Freshdesk/Freshdesk.node.js +3 -6
- package/dist/nodes/Freshdesk/Freshdesk.node.js.map +1 -1
- package/dist/nodes/HttpRequest/V3/Description.js +8 -0
- package/dist/nodes/HttpRequest/V3/Description.js.map +1 -1
- package/dist/nodes/HttpRequest/V3/HttpRequestV3.node.js +23 -5
- package/dist/nodes/HttpRequest/V3/HttpRequestV3.node.js.map +1 -1
- package/dist/nodes/HttpRequest/shared/optimizeResponse.js +387 -0
- package/dist/nodes/HttpRequest/shared/optimizeResponse.js.map +1 -0
- package/dist/nodes/Hubspot/V2/HubspotV2.node.js +10 -2
- package/dist/nodes/Hubspot/V2/HubspotV2.node.js.map +1 -1
- package/dist/nodes/LinkedIn/GenericFunctions.js +1 -1
- package/dist/nodes/LinkedIn/GenericFunctions.js.map +1 -1
- package/dist/nodes/Postgres/v2/helpers/utils.js +3 -1
- package/dist/nodes/Postgres/v2/helpers/utils.js.map +1 -1
- package/dist/nodes/RespondToWebhook/RespondToWebhook.node.js +57 -48
- package/dist/nodes/RespondToWebhook/RespondToWebhook.node.js.map +1 -1
- package/dist/nodes/Supabase/GenericFunctions.js +13 -4
- package/dist/nodes/Supabase/GenericFunctions.js.map +1 -1
- package/dist/nodes/Supabase/RowDescription.js +1 -0
- package/dist/nodes/Supabase/RowDescription.js.map +1 -1
- package/dist/nodes/Supabase/Supabase.node.js +17 -0
- package/dist/nodes/Supabase/Supabase.node.js.map +1 -1
- package/dist/nodes/Telegram/TelegramTrigger.node.js +4 -60
- package/dist/nodes/Telegram/TelegramTrigger.node.js.map +1 -1
- package/dist/nodes/Telegram/util/triggerUtils.js +88 -0
- package/dist/nodes/Telegram/util/triggerUtils.js.map +1 -0
- package/dist/nodes/Wait/Wait.node.js +5 -6
- package/dist/nodes/Wait/Wait.node.js.map +1 -1
- package/dist/test/nodes/Helpers.js +4 -2
- package/dist/test/nodes/Helpers.js.map +1 -1
- package/dist/test/nodes/TriggerHelpers.js +5 -2
- package/dist/test/nodes/TriggerHelpers.js.map +1 -1
- package/dist/types/nodes.json +5 -5
- package/package.json +8 -6
|
@@ -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:
|
|
469
|
+
headers: {
|
|
470
|
+
...requestOptions.headers ?? {},
|
|
471
|
+
...contentTypeHeader && { "content-type": contentTypeHeader }
|
|
472
|
+
},
|
|
459
473
|
host: endpoint.host,
|
|
460
474
|
method,
|
|
461
475
|
path,
|
|
462
|
-
body:
|
|
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":[]}
|
|
@@ -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(
|
|
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(
|
|
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
|
|
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'
|
|
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":[]}
|
package/dist/nodes/Form/utils.js
CHANGED
|
@@ -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
|
-
|
|
330
|
-
|
|
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
|
|
27
|
+
const Status = {
|
|
28
28
|
Open: 2,
|
|
29
29
|
Pending: 3,
|
|
30
30
|
Resolved: 4,
|
|
31
31
|
Closed: 5
|
|
32
32
|
};
|
|
33
|
-
const
|
|
33
|
+
const Priority = {
|
|
34
34
|
Low: 1,
|
|
35
35
|
Medium: 2,
|
|
36
36
|
High: 3,
|
|
37
37
|
Urgent: 4
|
|
38
38
|
};
|
|
39
|
-
const
|
|
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") {
|