UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

1,325 lines 116 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Github = void 0; const change_case_1 = require("change-case"); const n8n_workflow_1 = require("n8n-workflow"); const GenericFunctions_1 = require("./GenericFunctions"); const SearchFunctions_1 = require("./SearchFunctions"); const utilities_1 = require("../../utils/utilities"); const description_1 = require("../Webhook/description"); const waitingTooltip = (parameters, resumeUrl) => { if (parameters?.operation === 'dispatchAndWait') { const message = 'Execution will continue when the following webhook URL is called: '; return `${message}<a href="${resumeUrl}" target="_blank">${resumeUrl}</a>`; } return ''; }; class Github { description = { displayName: 'GitHub', name: 'github', icon: { light: 'file:github.svg', dark: 'file:github.dark.svg', }, group: ['input'], version: [1, 1.1], subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Consume GitHub API', defaults: { name: 'GitHub', }, usableAsTool: true, inputs: [n8n_workflow_1.NodeConnectionTypes.Main], outputs: [n8n_workflow_1.NodeConnectionTypes.Main], waitingNodeTooltip: `={{ (${waitingTooltip})($parameter, $execution.resumeUrl) }}`, webhooks: [ { ...description_1.defaultWebhookDescription, path: '', restartWebhook: true, httpMethod: 'POST', responseMode: 'onReceived', }, ], credentials: [ { name: 'githubApi', required: true, displayOptions: { show: { authentication: ['accessToken'], }, }, }, { name: 'githubOAuth2Api', required: true, displayOptions: { show: { authentication: ['oAuth2'], }, }, }, ], properties: [ { displayName: 'Authentication', name: 'authentication', type: 'options', options: [ { name: 'Access Token', value: 'accessToken', }, { name: 'OAuth2', value: 'oAuth2', }, ], default: 'accessToken', }, { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'File', value: 'file', }, { name: 'Issue', value: 'issue', }, { name: 'Organization', value: 'organization', }, { name: 'Release', value: 'release', }, { name: 'Repository', value: 'repository', }, { name: 'Review', value: 'review', }, { name: 'User', value: 'user', }, { name: 'Workflow', value: 'workflow', }, ], default: 'issue', }, // ---------------------------------- // operations // ---------------------------------- { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['organization'], }, }, options: [ { name: 'Get Repositories', value: 'getRepositories', description: 'Returns all repositories of an organization', action: 'Get repositories for an organization', }, ], default: 'getRepositories', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['issue'], }, }, options: [ { name: 'Create', value: 'create', description: 'Create a new issue', action: 'Create an issue', }, { name: 'Create Comment', value: 'createComment', description: 'Create a new comment on an issue', action: 'Create a comment on an issue', }, { name: 'Edit', value: 'edit', description: 'Edit an issue', action: 'Edit an issue', }, { name: 'Get', value: 'get', description: 'Get the data of a single issue', action: 'Get an issue', }, { name: 'Lock', value: 'lock', description: 'Lock an issue', action: 'Lock an issue', }, ], default: 'create', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['file'], }, }, options: [ { name: 'Create', value: 'create', description: 'Create a new file in repository', action: 'Create a file', }, { name: 'Delete', value: 'delete', description: 'Delete a file in repository', action: 'Delete a file', }, { name: 'Edit', value: 'edit', description: 'Edit a file in repository', action: 'Edit a file', }, { name: 'Get', value: 'get', description: 'Get the data of a single file', action: 'Get a file', }, { name: 'List', value: 'list', description: 'List contents of a folder', action: 'List files', }, ], default: 'create', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['repository'], }, }, options: [ { name: 'Get', value: 'get', description: 'Get the data of a single repository', action: 'Get a repository', }, { name: 'Get Issues', value: 'getIssues', description: 'Returns issues of a repository', action: 'Get issues of a repository', }, { name: 'Get License', value: 'getLicense', description: "Returns the contents of the repository's license file, if one is detected", action: 'Get the license of a repository', }, { name: 'Get Profile', value: 'getProfile', description: 'Get the community profile of a repository with metrics, health score, description, license, etc', action: 'Get the profile of a repository', }, { name: 'Get Pull Requests', value: 'getPullRequests', description: 'Returns pull requests of a repository', action: 'Get pull requests of a repository', }, { name: 'List Popular Paths', value: 'listPopularPaths', description: 'Get the top 10 popular content paths over the last 14 days', action: 'List popular paths in a repository', }, { name: 'List Referrers', value: 'listReferrers', description: 'Get the top 10 referrering domains over the last 14 days', action: 'List the top referrers of a repository', }, ], default: 'getIssues', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['user'], }, }, options: [ { name: 'Get Repositories', value: 'getRepositories', description: 'Returns the repositories of a user', action: "Get a user's repositories", }, { name: 'Get Issues', value: 'getUserIssues', description: 'Returns the issues assigned to the user', action: "Get a user's issues", }, { name: 'Invite', value: 'invite', description: 'Invites a user to an organization', action: 'Invite a user', }, ], default: 'getRepositories', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['release'], }, }, options: [ { name: 'Create', value: 'create', description: 'Creates a new release', action: 'Create a release', }, { name: 'Delete', value: 'delete', description: 'Delete a release', action: 'Delete a release', }, { name: 'Get', value: 'get', description: 'Get a release', action: 'Get a release', }, { name: 'Get Many', value: 'getAll', description: 'Get many repository releases', action: 'Get many releases', }, { name: 'Update', value: 'update', description: 'Update a release', action: 'Update a release', }, ], default: 'create', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['review'], }, }, options: [ { name: 'Create', value: 'create', description: 'Creates a new review', action: 'Create a review', }, { name: 'Get', value: 'get', description: 'Get a review for a pull request', action: 'Get a review', }, { name: 'Get Many', value: 'getAll', description: 'Get many reviews for a pull request', action: 'Get many reviews', }, { name: 'Update', value: 'update', description: 'Update a review', action: 'Update a review', }, ], default: 'create', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: ['workflow'], }, }, options: [ { name: 'Disable', value: 'disable', description: 'Disable a workflow', action: 'Disable a workflow', }, { name: 'Dispatch', value: 'dispatch', description: 'Dispatch a workflow event', action: 'Dispatch a workflow event', }, { name: 'Dispatch and Wait for Completion', value: 'dispatchAndWait', description: 'Dispatch a workflow event and wait for a webhook to be called before proceeding', action: 'Dispatch a workflow event and wait for completion', }, { name: 'Enable', value: 'enable', description: 'Enable a workflow', action: 'Enable a workflow', }, { name: 'Get', value: 'get', description: 'Get a workflow', action: 'Get a workflow', }, { name: 'Get Usage', value: 'getUsage', description: 'Get the usage of a workflow', action: 'Get the usage of a workflow', }, { name: 'List', value: 'list', description: 'List workflows', action: 'List workflows', }, ], default: 'dispatch', }, { displayName: 'Your execution will pause until a webhook is called. This URL will be generated at runtime and passed to your Github workflow as a resumeUrl input.', name: 'webhookNotice', type: 'notice', displayOptions: { show: { resource: ['workflow'], operation: ['dispatchAndWait'], }, }, default: '', }, // ---------------------------------- // shared // ---------------------------------- { displayName: 'Repository Owner', name: 'owner', type: 'resourceLocator', default: { mode: 'list', value: '' }, required: true, modes: [ { displayName: 'Repository Owner', name: 'list', type: 'list', placeholder: 'Select an owner...', typeOptions: { searchListMethod: 'getUsers', searchable: true, searchFilterRequired: false, }, }, { displayName: 'Link', name: 'url', type: 'string', placeholder: 'e.g. https://github.com/n8n-io', extractValue: { type: 'regex', regex: 'https:\\/\\/(?:[^/]+)\\/([-_0-9a-zA-Z]+)', }, validation: [ { type: 'regex', properties: { regex: 'https:\\/\\/([^/]+)\\/([-_0-9a-zA-Z]+)(?:.*)', errorMessage: 'Not a valid Github URL', }, }, ], }, { displayName: 'By Name', name: 'name', type: 'string', placeholder: 'e.g. n8n-io', validation: [ { type: 'regex', properties: { regex: '[-_a-zA-Z0-9]+', errorMessage: 'Not a valid Github Owner Name', }, }, ], url: '=https://github.com/{{$value}}', }, ], displayOptions: { hide: { operation: ['invite', 'getUserIssues'], }, }, }, { displayName: 'Repository Name', name: 'repository', type: 'resourceLocator', default: { mode: 'list', value: '', }, required: true, modes: [ { displayName: 'Repository Name', name: 'list', type: 'list', placeholder: 'Select an Repository...', typeOptions: { searchListMethod: 'getRepositories', searchable: true, }, }, { displayName: 'Link', name: 'url', type: 'string', placeholder: 'e.g. https://github.com/n8n-io/n8n', extractValue: { type: 'regex', regex: 'https:\\/\\/(?:[^/]+)\\/(?:[-_0-9a-zA-Z]+)\\/([-_.0-9a-zA-Z]+)', }, validation: [ { type: 'regex', properties: { regex: 'https:\\/\\/([^/]+)\\/(?:[-_0-9a-zA-Z]+)\\/([-_.0-9a-zA-Z]+)(?:.*)', errorMessage: 'Not a valid Github Repository URL', }, }, ], }, { displayName: 'By Name', name: 'name', type: 'string', placeholder: 'e.g. n8n', validation: [ { type: 'regex', properties: { regex: '[-_.0-9a-zA-Z]+', errorMessage: 'Not a valid Github Repository Name', }, }, ], url: '=https://github.com/{{$parameter["owner"]}}/{{$value}}', }, ], displayOptions: { hide: { resource: ['user', 'organization'], operation: ['getRepositories'], }, }, }, // ---------------------------------- // workflow // ---------------------------------- { displayName: 'Workflow', name: 'workflowId', type: 'resourceLocator', default: { mode: 'list', value: '', }, required: true, modes: [ { displayName: 'Workflow', name: 'list', type: 'list', placeholder: 'Select a workflow...', typeOptions: { searchListMethod: 'getWorkflows', searchable: true, }, }, { displayName: 'By File Name', name: 'filename', type: 'string', placeholder: 'e.g. main.yaml or main.yml', validation: [ { type: 'regex', properties: { regex: '[a-zA-Z0-9_-]+.(yaml|yml)', errorMessage: 'Not a valid Github Workflow File Name', }, }, ], }, { displayName: 'By ID', name: 'name', type: 'string', placeholder: 'e.g. 12345678', validation: [ { type: 'regex', properties: { regex: '\\d+', errorMessage: 'Not a valid Github Workflow ID', }, }, ], }, ], displayOptions: { show: { resource: ['workflow'], operation: ['disable', 'dispatch', 'dispatchAndWait', 'get', 'getUsage', 'enable'], }, }, description: 'The workflow to dispatch', }, { displayName: 'Ref', name: 'ref', type: 'string', default: 'main', required: true, displayOptions: { show: { resource: ['workflow'], operation: ['dispatch', 'dispatchAndWait'], '@version': [{ _cnd: { lte: 1 } }], }, }, description: 'The git reference for the workflow dispatch (branch or tag name)', }, { displayName: 'Ref', name: 'ref', type: 'resourceLocator', default: { mode: 'list', value: '', }, required: true, modes: [ { displayName: 'From List', name: 'list', type: 'list', placeholder: 'Select a branch, tag, or commit...', typeOptions: { searchListMethod: 'getRefs', searchable: true, }, }, { displayName: 'By Name', name: 'name', type: 'string', placeholder: 'e.g. main', validation: [ { type: 'regex', properties: { regex: '^[a-zA-Z0-9/._-]+$', errorMessage: 'Not a valid branch, tag', }, }, ], }, ], displayOptions: { show: { resource: ['workflow'], operation: ['dispatch', 'dispatchAndWait'], '@version': [{ _cnd: { gte: 1.1 } }], }, }, description: 'The git reference for the workflow dispatch (branch, tag, or commit SHA)', }, { displayName: 'Inputs', name: 'inputs', type: 'json', default: '{}', displayOptions: { show: { resource: ['workflow'], operation: ['dispatch', 'dispatchAndWait'], }, }, description: 'JSON object with input parameters for the workflow', }, // ---------------------------------- // file // ---------------------------------- // ---------------------------------- // file:create/delete/edit/get // ---------------------------------- { displayName: 'File Path', name: 'filePath', type: 'string', default: '', required: true, displayOptions: { show: { resource: ['file'], }, hide: { operation: ['list'], }, }, placeholder: 'docs/README.md', description: 'The file path of the file. Has to contain the full path.', }, // ---------------------------------- // file:list // ---------------------------------- { displayName: 'Path', name: 'filePath', type: 'string', default: '', displayOptions: { show: { resource: ['file'], operation: ['list'], }, }, placeholder: 'docs/', description: 'The path of the folder to list', }, // ---------------------------------- // file:create/edit // ---------------------------------- { displayName: 'Binary File', name: 'binaryData', type: 'boolean', default: false, required: true, displayOptions: { show: { operation: ['create', 'edit'], resource: ['file'], }, }, description: 'Whether the data to upload should be taken from binary field', }, { displayName: 'File Content', name: 'fileContent', type: 'string', default: '', required: true, displayOptions: { show: { binaryData: [false], operation: ['create', 'edit'], resource: ['file'], }, }, placeholder: '', description: 'The text content of the file', }, { displayName: 'Input Binary Field', name: 'binaryPropertyName', type: 'string', default: 'data', required: true, displayOptions: { show: { binaryData: [true], operation: ['create', 'edit'], resource: ['file'], }, }, placeholder: '', hint: 'The name of the input binary field containing the file to be written', }, { displayName: 'Commit Message', name: 'commitMessage', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['create', 'delete', 'edit'], resource: ['file'], }, }, }, { displayName: 'Additional Parameters', name: 'additionalParameters', placeholder: 'Add Parameter', description: 'Additional fields to add', type: 'fixedCollection', default: {}, displayOptions: { show: { operation: ['create', 'delete', 'edit'], resource: ['file'], }, }, options: [ { name: 'author', displayName: 'Author', values: [ { displayName: 'Name', name: 'name', type: 'string', default: '', description: 'The name of the author of the commit', }, { displayName: 'Email', name: 'email', type: 'string', placeholder: 'name@email.com', default: '', description: 'The email of the author of the commit', }, ], }, { name: 'branch', displayName: 'Branch', values: [ { displayName: 'Branch', name: 'branch', type: 'string', default: '', description: 'The branch to commit to. If not set the repository’s default branch (usually master) is used.', }, ], }, { name: 'committer', displayName: 'Committer', values: [ { displayName: 'Name', name: 'name', type: 'string', default: '', description: 'The name of the committer of the commit', }, { displayName: 'Email', name: 'email', type: 'string', placeholder: 'name@email.com', default: '', description: 'The email of the committer of the commit', }, ], }, ], }, // ---------------------------------- // file:get // ---------------------------------- { displayName: 'As Binary Property', name: 'asBinaryProperty', type: 'boolean', default: true, displayOptions: { show: { operation: ['get'], resource: ['file'], }, }, description: 'Whether to set the data of the file as binary property instead of returning the raw API response', }, { displayName: 'Put Output File in Field', name: 'binaryPropertyName', type: 'string', default: 'data', required: true, displayOptions: { show: { asBinaryProperty: [true], operation: ['get'], resource: ['file'], }, }, placeholder: '', hint: 'The name of the output binary field to put the file in', }, { displayName: 'Additional Parameters', name: 'additionalParameters', placeholder: 'Add Parameter', description: 'Additional fields to add', type: 'collection', default: {}, displayOptions: { show: { operation: ['get'], resource: ['file'], }, }, options: [ { displayName: 'Reference', name: 'reference', type: 'string', default: '', placeholder: 'master', description: 'The name of the commit/branch/tag. Default: the repository’s default branch (usually master).', }, ], }, // ---------------------------------- // issue // ---------------------------------- // ---------------------------------- // issue:create // ---------------------------------- { displayName: 'Title', name: 'title', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['create'], resource: ['issue'], }, }, description: 'The title of the issue', }, { displayName: 'Body', name: 'body', type: 'string', typeOptions: { rows: 5, }, default: '', displayOptions: { show: { operation: ['create'], resource: ['issue'], }, }, description: 'The body of the issue', }, { displayName: 'Labels', name: 'labels', type: 'collection', typeOptions: { multipleValues: true, multipleValueButtonText: 'Add Label', }, displayOptions: { show: { operation: ['create'], resource: ['issue'], }, }, default: { label: '' }, options: [ { displayName: 'Label', name: 'label', type: 'string', default: '', description: 'Label to add to issue', }, ], }, { displayName: 'Assignees', name: 'assignees', type: 'collection', typeOptions: { multipleValues: true, multipleValueButtonText: 'Add Assignee', }, displayOptions: { show: { operation: ['create'], resource: ['issue'], }, }, default: { assignee: '' }, options: [ { displayName: 'Assignee', name: 'assignee', type: 'string', default: '', description: 'User to assign issue too', }, ], }, // ---------------------------------- // issue:createComment // ---------------------------------- { displayName: 'Issue Number', name: 'issueNumber', type: 'number', default: 0, required: true, displayOptions: { show: { operation: ['createComment'], resource: ['issue'], }, }, description: 'The number of the issue on which to create the comment on', }, { displayName: 'Body', name: 'body', type: 'string', typeOptions: { rows: 5, }, displayOptions: { show: { operation: ['createComment'], resource: ['issue'], }, }, default: '', description: 'The body of the comment', }, // ---------------------------------- // issue:edit // ---------------------------------- { displayName: 'Issue Number', name: 'issueNumber', type: 'number', default: 0, required: true, displayOptions: { show: { operation: ['edit'], resource: ['issue'], }, }, description: 'The number of the issue edit', }, { displayName: 'Edit Fields', name: 'editFields', type: 'collection', typeOptions: { multipleValueButtonText: 'Add Field', }, displayOptions: { show: { operation: ['edit'], resource: ['issue'], }, }, default: {}, options: [ { displayName: 'Assignees', name: 'assignees', type: 'collection', typeOptions: { multipleValues: true, multipleValueButtonText: 'Add Assignee', }, default: { assignee: '' }, options: [ { displayName: 'Assignees', name: 'assignee', type: 'string', default: '', description: 'User to assign issue to', }, ], }, { displayName: 'Body', name: 'body', type: 'string', typeOptions: { rows: 5, }, default: '', description: 'The body of the issue', }, { displayName: 'Labels', name: 'labels', type: 'collection', typeOptions: { multipleValues: true, multipleValueButtonText: 'Add Label', }, default: { label: '' }, options: [ { displayName: 'Label', name: 'label', type: 'string', default: '', description: 'Label to add to issue', }, ], }, { displayName: 'State', name: 'state', type: 'options', options: [ { name: 'Closed', value: 'closed', description: 'Set the state to "closed"', }, { name: 'Open', value: 'open', description: 'Set the state to "open"', }, ], default: 'open', description: 'The state to set', }, { displayName: 'State Reason', name: 'state_reason', type: 'options', options: [ { name: 'Completed', value: 'completed', description: 'Issue is completed', }, { name: 'Not Planned', value: 'not_planned', description: 'Issue is not planned', }, { name: 'Reopened', value: 'reopened', description: 'Issue is reopened', }, ], default: 'completed', description: 'The reason for the state change', }, { displayName: 'Title', name: 'title', type: 'string', default: '', description: 'The title of the issue', }, ], }, // ---------------------------------- // issue:get // ---------------------------------- { displayName: 'Issue Number', name: 'issueNumber', type: 'number', default: 0, required: true, displayOptions: { show: { operation: ['get'], resource: ['issue'], }, }, description: 'The issue number to get data for', }, // ---------------------------------- // issue:lock // ---------------------------------- { displayName: 'Issue Number', name: 'issueNumber', type: 'number', default: 0, required: true, displayOptions: { show: { operation: ['lock'], resource: ['issue'], }, }, description: 'The issue number to lock', }, { displayName: 'Lock Reason', name: 'lockReason', type: 'options', displayOptions: { show: { operation: ['lock'], resource: ['issue'], }, }, options: [ { name: 'Off-Topic', value: 'off-topic', description: 'The issue is Off-Topic', }, { name: 'Too Heated', value: 'too heated', description: 'The discussion is too heated', }, { name: 'Resolved', value: 'resolved', description: 'The issue got resolved', }, { name: 'Spam', value: 'spam', description: 'The issue is spam', }, ], default: 'resolved', description: 'The reason for locking the issue', }, // ---------------------------------- // release // ---------------------------------- // ---------------------------------- // release:create // ---------------------------------- { displayName: 'Tag', name: 'releaseTag', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['create'], resource: ['release'], }, }, description: 'The tag of the release', }, { displayName: 'Additional Fields', name: 'additionalFields', type: 'collection', typeOptions: { multipleValueButtonText: 'Add Field', }, displayOptions: { show: { operation: ['create'], resource: ['release'], }, }, default: {}, options: [ { displayName: 'Name', name: 'name', type: 'string', default: '', description: 'The name of the issue', }, { displayName: 'Body