first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,131 @@
import type { INodeProperties } from 'n8n-workflow';
export const contactListOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['contactList'],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add contact to a list',
action: 'Add a contact to a list',
},
{
name: 'Remove',
value: 'remove',
description: 'Remove a contact from a list',
action: 'Remove a contact from a list',
},
],
default: 'add',
},
];
export const contactListFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* contactList:add */
/* -------------------------------------------------------------------------- */
{
displayName: 'By',
name: 'by',
type: 'options',
options: [
{
name: 'Contact ID',
value: 'id',
},
{
name: 'Email',
value: 'email',
},
],
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
},
},
default: 'email',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
placeholder: 'name@email.com',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
by: ['email'],
},
},
default: '',
},
{
displayName: 'Contact to Add',
name: 'id',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
by: ['id'],
},
},
default: '',
},
{
displayName: 'List to Add To',
name: 'listId',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
},
},
default: '',
},
/* -------------------------------------------------------------------------- */
/* contactList:remove */
/* -------------------------------------------------------------------------- */
{
displayName: 'Contact to Remove',
name: 'id',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['remove'],
},
},
default: '',
},
{
displayName: 'List to Remove From',
name: 'listId',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['remove'],
},
},
default: '',
},
];
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,11 @@
import type { IDataObject } from 'n8n-workflow';
export interface IAssociation {
associatedCompanyIds?: number[];
associatedVids?: number[];
}
export interface IDeal {
associations?: IAssociation;
properties?: IDataObject[];
}
@@ -0,0 +1,575 @@
import type { INodeProperties } from 'n8n-workflow';
export const engagementOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['engagement'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create an engagement',
action: 'Create an engagement',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete an engagement',
action: 'Delete an engagement',
},
{
name: 'Get',
value: 'get',
description: 'Get an engagement',
action: 'Get an engagement',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many engagements',
action: 'Get many engagements',
},
],
default: 'create',
},
];
export const engagementFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* engagement:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Type',
name: 'type',
type: 'options',
required: true,
options: [
{
name: 'Call',
value: 'call',
},
{
name: 'Email',
value: 'email',
},
{
name: 'Meeting',
value: 'meeting',
},
{
name: 'Task',
value: 'task',
},
],
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
},
},
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
required: true,
description: 'The due date for the task',
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['task'],
'@version': [{ _cnd: { gte: 2.2 } }],
},
},
default: '',
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['task'],
},
},
options: [
{
displayName: 'Body',
name: 'body',
type: 'string',
default: '',
},
{
displayName: 'For Object Type',
name: 'forObjectType',
type: 'options',
options: [
{
name: 'Company',
value: 'COMPANY',
},
{
name: 'Contact',
value: 'CONTACT',
},
],
default: '',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{
name: 'Completed',
value: 'COMPLETED',
},
{
name: 'Deferred',
value: 'DEFERRED',
},
{
name: 'In Progress',
value: 'IN_PROGRESS',
},
{
name: 'Not Started',
value: 'NOT_STARTED',
},
{
name: 'Waiting',
value: 'WAITING',
},
],
default: '',
},
{
displayName: 'Subject',
name: 'subject',
type: 'string',
default: '',
},
],
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['email'],
},
},
options: [
{
displayName: 'BCC',
name: 'bcc',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add BCC',
},
default: '',
},
{
displayName: 'CC',
name: 'cc',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add CC',
},
default: '',
},
{
displayName: 'From Email',
name: 'fromEmail',
type: 'string',
default: '',
},
{
displayName: 'From First Name',
name: 'firstName',
type: 'string',
default: '',
},
{
displayName: 'From Last Name',
name: 'lastName',
type: 'string',
default: '',
},
{
displayName: 'HTML',
name: 'html',
type: 'string',
default: '',
},
{
displayName: 'Subject',
name: 'subject',
type: 'string',
default: '',
},
{
displayName: 'To Emails',
name: 'toEmail',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add Email',
},
default: '',
},
],
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['meeting'],
},
},
options: [
{
displayName: 'Body',
name: 'body',
type: 'string',
default: '',
},
{
displayName: 'End Time',
name: 'endTime',
type: 'dateTime',
default: '',
description:
'When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format',
},
{
displayName: 'Internal Meeting Notes',
name: 'internalMeetingNotes',
type: 'string',
default: '',
},
{
displayName: 'Start Time',
name: 'startTime',
type: 'dateTime',
default: '',
description:
'When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
},
],
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['call'],
},
},
options: [
{
displayName: 'Body',
name: 'body',
type: 'string',
default: '',
},
{
displayName: 'Duration Milliseconds',
name: 'durationMilliseconds',
type: 'number',
default: 0,
},
{
displayName: 'From Number',
name: 'fromNumber',
type: 'string',
default: '',
},
{
displayName: 'Recording URL',
name: 'recordingUrl',
type: 'string',
default: '',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{
name: 'Busy',
value: 'BUSY',
},
{
name: 'Calling CRM User',
value: 'CALLING_CRM_USER',
},
{
name: 'Canceled',
value: 'CANCELED',
},
{
name: 'Completed',
value: 'COMPLETED',
},
{
name: 'Connecting',
value: 'CONNECTING',
},
{
name: 'Failed',
value: 'FAILED',
},
{
name: 'In Progress',
value: 'IN_PROGRESS',
},
{
name: 'No Answer',
value: 'NO_ANSWER',
},
{
name: 'Queued',
value: 'QUEUED',
},
{
name: 'Ringing',
value: 'RINGING',
},
],
default: 'QUEUED',
},
{
displayName: 'To Number',
name: 'toNumber',
type: 'string',
default: '',
},
],
},
{
displayName: 'Engagement Properties',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Property',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
},
},
options: [
{
displayName: 'Associations',
name: 'associations',
type: 'collection',
placeholder: 'Add Field',
default: {},
options: [
{
displayName: 'Company IDs',
name: 'companyIds',
type: 'string',
default: '',
},
{
displayName: 'Contact IDs',
name: 'contactIds',
type: 'string',
default: '',
},
{
displayName: 'Deals IDs',
name: 'dealIds',
type: 'string',
default: '',
},
{
displayName: 'Owner IDs',
name: 'ownerIds',
type: 'string',
default: '',
displayOptions: {
show: {
'@version': [{ _cnd: { lt: 2.2 } }],
},
},
},
{
displayName: 'Owner ID',
name: 'ownerId',
type: 'number',
default: 0,
displayOptions: {
show: {
'@version': [{ _cnd: { gte: 2.2 } }],
},
},
},
{
displayName: 'Ticket IDs',
name: 'ticketIds',
type: 'string',
default: '',
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* engagement:get/delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Engagement to Get',
name: 'engagementId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['engagement'],
operation: ['get'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchEngagements',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Engagement ID',
},
},
],
},
],
},
{
displayName: 'Engagement to Delete',
name: 'engagementId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['engagement'],
operation: ['delete'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchEngagements',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Engagement ID',
},
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* engagement:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['engagement'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['engagement'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 250,
},
default: 100,
description: 'Max number of results to return',
},
];
@@ -0,0 +1,315 @@
import type { INodeProperties } from 'n8n-workflow';
export const formOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['form'],
},
},
options: [
{
name: 'Get Fields',
value: 'getFields',
description: 'Get all fields from a form',
action: 'Get all fields from a form',
},
{
name: 'Submit',
value: 'submit',
description: 'Submit data to a form',
action: 'Submit a form',
},
],
default: 'getFields',
},
];
export const formFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* form:submit */
/* -------------------------------------------------------------------------- */
{
displayName: 'Form Name or ID',
name: 'formId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getForms',
},
required: true,
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
default: '',
description:
'The ID of the form you\'re sending data to. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Options',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add option',
default: {},
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
options: [
{
displayName: 'Skip Validation',
name: 'skipValidation',
type: 'boolean',
default: false,
description: 'Whether or not to skip validation based on the form settings',
},
{
displayName: 'Submitted At',
name: 'submittedAt',
type: 'dateTime',
default: '',
description:
'Time of the form submission. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
],
},
{
displayName: 'Context',
name: 'contextUi',
placeholder: 'Add Context',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
default: {},
options: [
{
displayName: 'Context',
name: 'contextValue',
values: [
{
displayName: 'HubSpot Usertoken',
name: 'hutk',
type: 'string',
default: '',
description:
'Include this parameter and set it to the hubspotutk cookie value to enable cookie tracking on your submission',
},
{
displayName: 'IP Address',
name: 'ipAddress',
type: 'string',
default: '',
description: 'The IP address of the visitor filling out the form',
},
{
displayName: 'Page URI',
name: 'pageUri',
type: 'string',
default: '',
description: 'The URI of the page the submission happened on',
},
{
displayName: 'Page Name',
name: 'pageName',
type: 'string',
default: '',
description: 'The name or title of the page the submission happened on',
},
{
displayName: 'Page ID',
name: 'pageId',
type: 'number',
default: '',
description: 'The ID of a page created on the HubSpot CMS',
},
{
displayName: 'SFDC Campaign ID',
name: 'sfdcCampaignId',
type: 'number',
default: '',
description:
'If the form is for an account using the HubSpot Salesforce Integration, you can include the ID of a Salesforce campaign to add the contact to the specified campaign',
},
{
displayName: 'Go to Webinar Webinar ID',
name: 'goToWebinarWebinarKey',
type: 'number',
default: '',
description:
'If the form is for an account using the HubSpot GoToWebinar Integration, you can include the ID of a webinar to enroll the contact in that webinar when they submit the form',
},
],
},
],
},
{
displayName: 'Legal Consent',
name: 'lengalConsentUi',
placeholder: 'Add Legal Consent',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
default: {},
options: [
{
displayName: 'Consent',
name: 'lengalConsentValues',
values: [
{
displayName: 'Consent To Process',
name: 'consentToProcess',
type: 'boolean',
default: false,
description: 'Whether or not the visitor checked the Consent to process checkbox',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description: 'The text displayed to the visitor for the Consent to process checkbox',
},
{
displayName: 'Communications',
name: 'communicationsUi',
placeholder: 'Add Communication',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
displayName: 'Communication',
name: 'communicationValues',
values: [
{
displayName: 'Subcription Type Name or ID',
name: 'subscriptionTypeId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getSubscriptionTypes',
},
default: '',
description:
'The ID of the specific subscription type. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Value',
name: 'value',
type: 'boolean',
default: false,
description:
'Whether or not the visitor checked the checkbox for this subscription type',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description:
'The text displayed to the visitor for this specific subscription checkbox',
},
],
},
],
},
],
},
{
displayName: 'Legitimate Interest',
name: 'legitimateInterestValues',
values: [
{
displayName: 'Subcription Type Name or ID',
name: 'subscriptionTypeId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getSubscriptionTypes',
},
default: '',
description:
'The ID of the specific subscription type that this forms indicates interest to. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Value',
name: 'value',
type: 'boolean',
default: false,
// eslint-disable-next-line n8n-nodes-base/node-param-description-boolean-without-whether
description:
"This must be true when using the 'legitimateInterest' option, as it reflects the consent indicated by the visitor when submitting the form",
},
{
displayName: 'Legal Basis',
name: 'legalBasis',
type: 'options',
options: [
{
name: 'Customer',
value: 'CUSTOMER',
},
{
name: 'Lead',
value: 'LEAD',
},
],
default: '',
description: 'The privacy text displayed to the visitor',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description: 'The privacy text displayed to the visitor',
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* form:getFields */
/* -------------------------------------------------------------------------- */
{
displayName: 'Form Name or ID',
name: 'formId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getForms',
},
required: true,
displayOptions: {
show: {
resource: ['form'],
operation: ['getFields'],
},
},
default: '',
description:
'The ID of the form. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
];
@@ -0,0 +1,21 @@
import type { IDataObject } from 'n8n-workflow';
export interface IContext {
goToWebinarWebinarKey?: string;
hutk?: string;
ipAddress?: string;
pageId?: string;
pageName?: string;
pageUri?: string;
sfdcCampaignId?: string;
}
export interface IForm {
portalId?: number;
formId?: string;
fields?: IDataObject[];
legalConsentOptions?: IDataObject;
context?: IContext[];
submittedAt?: number;
skipValidation?: boolean;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,606 @@
import type { INodeProperties } from 'n8n-workflow';
export const ticketOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['ticket'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a ticket',
action: 'Create a ticket',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a ticket',
action: 'Delete a ticket',
},
{
name: 'Get',
value: 'get',
description: 'Get a ticket',
action: 'Get a ticket',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many tickets',
action: 'Get many tickets',
},
{
name: 'Update',
value: 'update',
description: 'Update a ticket',
action: 'Update a ticket',
},
],
default: 'create',
},
];
export const ticketFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* ticket:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Pipeline Name or ID',
name: 'pipelineId',
type: 'options',
required: true,
typeOptions: {
loadOptionsMethod: 'getTicketPipelines',
},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
default: '',
description:
'The ID of the pipeline the ticket is in. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Stage Name or ID',
name: 'stageId',
type: 'options',
required: true,
typeOptions: {
loadOptionsMethod: 'getTicketStages',
loadOptionsDependsOn: ['pipelineId'],
},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
default: '',
description:
'The stage ID of the pipeline the ticket is in; depends on Pipeline ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Ticket Name',
name: 'ticketName',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
default: '',
},
{
displayName: 'Ticket Properties',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Property',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
options: [
{
displayName: 'Company Names or IDs',
name: 'associatedCompanyIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getCompanies',
},
default: [],
description:
'Whether to include specific Company properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Contact Names or IDs',
name: 'associatedContactIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getContacts',
},
default: [],
description:
'Whether to include specific Contact properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Category Name or ID',
name: 'category',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketCategories',
},
default: '',
description:
'Main reason customer reached out for help. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Close Date',
name: 'closeDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was closed. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Create Date',
name: 'createDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was created. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
alwaysOpenEditWindow: true,
},
default: '',
description: 'Description of the ticket',
},
{
displayName: 'Priority Name or ID',
name: 'priority',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketPriorities',
},
default: '',
description:
'The level of attention needed on the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Resolution Name or ID',
name: 'resolution',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketResolutions',
},
default: '',
description:
'The action taken to resolve the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Source Name or ID',
name: 'source',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketSources',
},
default: '',
description:
'Channel where ticket was originally submitted. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Ticket Owner Name or ID',
name: 'ticketOwnerId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getOwners',
},
default: '',
description:
'The user from your team that the ticket is assigned to. You can assign additional users to a ticket record by creating a custom HubSpot user property. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Ticket to Update',
name: 'ticketId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['update'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchTickets',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Ticket ID',
},
},
],
},
],
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['update'],
},
},
options: [
{
displayName: 'Company Names or IDs',
name: 'associatedCompanyIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getCompanies',
},
default: [],
description:
'Whether to include specific Company properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Contact Names or IDs',
name: 'associatedContactIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getContacts',
},
default: [],
description:
'Whether to include specific Contact properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Category Name or ID',
name: 'category',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketCategories',
},
default: '',
description:
'Main reason customer reached out for help. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Close Date',
name: 'closeDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was closed. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Create Date',
name: 'createDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was created. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
alwaysOpenEditWindow: true,
},
default: '',
description: 'Description of the ticket',
},
{
displayName: 'Pipeline Name or ID',
name: 'pipelineId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketPipelines',
},
default: '',
description:
'The ID of the pipeline the ticket is in. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Priority Name or ID',
name: 'priority',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketPriorities',
},
default: '',
description:
'The level of attention needed on the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Resolution Name or ID',
name: 'resolution',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketResolutions',
},
default: '',
description:
'The action taken to resolve the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Source Name or ID',
name: 'source',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketSources',
},
default: '',
description:
'Channel where ticket was originally submitted. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Stage Name or ID',
name: 'stageId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketStages',
loadOptionsDependsOn: ['updateFields.pipelineId'],
},
default: '',
description:
'The stage ID of the pipeline the ticket is in; depends on Pipeline ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Ticket Name',
name: 'ticketName',
type: 'string',
default: '',
},
{
displayName: 'Ticket Owner Name or ID',
name: 'ticketOwnerId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getOwners',
},
default: '',
description:
'The user from your team that the ticket is assigned to. You can assign additional users to a ticket record by creating a custom HubSpot user property. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Ticket to Get',
name: 'ticketId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['get'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchTickets',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Ticket ID',
},
},
],
},
],
},
{
displayName: 'Options',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add option',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['get'],
},
},
options: [
{
displayName: 'Include Deleted',
name: 'includeDeleted',
type: 'boolean',
default: false,
},
{
displayName: 'Ticket Properties to Include',
name: 'properties',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getTicketProperties',
},
default: [],
description:
'Whether to include specific Ticket properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Properties With History',
name: 'propertiesWithHistory',
type: 'string',
default: '',
description:
"Works similarly to properties=, but this parameter will include the history for the specified property, instead of just including the current value. Use this parameter when you need the full history of changes to a property's value.",
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['ticket'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['ticket'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 250,
},
default: 100,
description: 'Max number of results to return',
},
{
displayName: 'Options',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add option',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Ticket Properties to Include',
name: 'properties',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getTicketProperties',
},
default: [],
description:
'Whether to include specific Ticket properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Properties With History',
name: 'propertiesWithHistory',
type: 'string',
default: '',
description:
"Works similarly to properties=, but this parameter will include the history for the specified property, instead of just including the current value. Use this parameter when you need the full history of changes to a property's value.",
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Ticket to Delete',
name: 'ticketId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['delete'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchTickets',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Ticket ID',
},
},
],
},
],
},
];
@@ -0,0 +1,12 @@
import moment from 'moment-timezone';
export function parseToTimestamp(dateString: unknown): number {
if (typeof dateString !== 'string') {
throw new Error('Invalid date string');
}
const timestamp = moment(dateString).valueOf();
if (isNaN(timestamp)) {
throw new Error('Invalid date string');
}
return timestamp;
}