diff --git a/packages/cli/BREAKING-CHANGES.md b/packages/cli/BREAKING-CHANGES.md index f7e5e7a76..cd7f42d25 100644 --- a/packages/cli/BREAKING-CHANGES.md +++ b/packages/cli/BREAKING-CHANGES.md @@ -2,6 +2,21 @@ This list shows all the versions which include breaking changes and how to upgrade. +## 0.x.x + +### What changed? + +The link.fish node got removed because the service is shutting down. + +### When is action necessary? + +If you are are activly using the link.fish node. + +### How to upgrade: + +Sadly not possible. Look for an alternative service. + + ## 0.83.0 ### What changed? diff --git a/packages/nodes-base/credentials/LinkFishApi.credentials.ts b/packages/nodes-base/credentials/LinkFishApi.credentials.ts deleted file mode 100644 index c809fc3a0..000000000 --- a/packages/nodes-base/credentials/LinkFishApi.credentials.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - ICredentialType, - NodePropertyTypes, -} from 'n8n-workflow'; - - -export class LinkFishApi implements ICredentialType { - name = 'linkFishApi'; - displayName = 'link.fish API'; - documentationUrl = 'linkFish'; - properties = [ - { - displayName: 'Email', - name: 'email', - type: 'string' as NodePropertyTypes, - default: '', - - }, - { - displayName: 'Api Key', - name: 'apiKey', - type: 'string' as NodePropertyTypes, - default: '', - }, - ]; -} diff --git a/packages/nodes-base/nodes/LinkFish/LinkFish.node.ts b/packages/nodes-base/nodes/LinkFish/LinkFish.node.ts deleted file mode 100644 index 5d97ce834..000000000 --- a/packages/nodes-base/nodes/LinkFish/LinkFish.node.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { IExecuteSingleFunctions } from 'n8n-core'; -import { - IDataObject, - INodeExecutionData, - INodeType, - INodeTypeDescription, -} from 'n8n-workflow'; - -export class LinkFish implements INodeType { - description: INodeTypeDescription = { - displayName: 'link.fish Scrape', - name: 'linkFish', - icon: 'file:linkfish.png', - group: ['input'], - version: 1, - description: 'Scrape data from an URL', - defaults: { - name: 'link.fish Scrape', - color: '#33AA22', - }, - inputs: ['main'], - outputs: ['main'], - credentials: [ - { - name: 'linkFishApi', - required: true, - } - ], - properties: [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - options: [ - { - name: 'All Data', - value: 'data', - description: 'Get all found data', - }, - { - name: 'Apps', - value: 'apps', - description: 'Get mobile app information', - }, - { - name: 'Social Media', - value: 'socialMedia', - description: 'Get social-media profiles', - }, - { - name: 'Screenshot', - value: 'screenshot', - description: 'Get screenshot', - }, - ], - default: 'data', - description: 'The operation to perform.', - }, - - // ---------------------------------- - // All - // ---------------------------------- - { - displayName: 'URL', - name: 'url', - type: 'string', - default: '', - required: true, - description: 'URL of which the data should be extracted.', - - }, - - // ---------------------------------- - // data - // ---------------------------------- - { - displayName: 'Item Format', - name: 'itemFormat', - type: 'options', - options: [ - { - name: 'Normal', - value: 'normal' - }, - { - name: 'Flat', - value: 'flat' - }, - ], - default: 'flat', - displayOptions: { - show: { - operation: [ - 'data' - ], - }, - }, - description: 'If data should be returned in the "normal"
format or in the "flat" one which has all
items on one level.', - }, - { - displayName: 'Simplify Types', - name: 'simplifySpecialTypes', - type: 'boolean', - default: true, - displayOptions: { - show: { - operation: [ - 'data' - ], - }, - }, - description: 'If special types like "ParameterValue"
should be simplified to a key -> value pair.', - }, - - // ---------------------------------- - // screenshot - // ---------------------------------- - { - displayName: 'Type', - name: 'type', - type: 'options', - options: [ - { - name: 'Normal', - value: 'normal', - description: 'Creates a screenshot in 16:9 format.', - }, - { - name: 'Full', - value: 'full', - description: 'Creates a full page screenshot.', - }, - ], - default: 'normal', - displayOptions: { - show: { - operation: [ - 'screenshot' - ], - }, - }, - description: 'The file format the screenshot should be returned as.', - }, - { - displayName: 'File Format', - name: 'fileFormat', - type: 'options', - options: [ - { - name: 'JPG', - value: 'jpg', - }, - { - name: 'PNG', - value: 'png', - }, - ], - default: 'jpg', - displayOptions: { - show: { - operation: [ - 'screenshot' - ], - }, - }, - description: 'The file format the screenshot should be returned as.', - }, - { - displayName: 'Width', - name: 'width', - type: 'number', - typeOptions: { - minValue: 50, - maxValue: 1280, - }, - default: 640, - displayOptions: { - show: { - operation: [ - 'screenshot' - ], - }, - }, - description: 'The width of the screenshot in pixel.', - }, - { - displayName: 'Binary Property', - name: 'binaryPropertyName', - type: 'string', - default: 'data', - required: true, - displayOptions: { - show: { - operation: [ - 'screenshot', - ], - }, - - }, - placeholder: '', - description: 'Name of the binary property in which to save
the binary data of the screenshot.', - }, - - // ---------------------------------- - // Multiple ones - // ---------------------------------- - { - displayName: 'Browser Render', - name: 'browserRender', - type: 'boolean', - default: false, - displayOptions: { - hide: { - operation: [ - 'screenshot' - ], - }, - }, - description: 'Renders the website in a browser
(charges 5 instead of 1 credit!)', - }, - { - displayName: 'Return URLs', - name: 'returnUrls', - type: 'boolean', - default: false, - displayOptions: { - hide: { - operation: [ - 'data', - 'screenshot', - ], - }, - }, - description: 'Returns app URLs instead of the identifiers.', - }, - ], - }; - - - async executeSingle(this: IExecuteSingleFunctions): Promise { - const url = this.getNodeParameter('url') as string; - - const credentials = this.getCredentials('linkFishApi'); - - if (credentials === undefined) { - throw new Error('No credentials got returned!'); - } - - let requestMethod = 'GET'; - - // For Post - const body: IDataObject = { - url, - }; - // For Query string - const qs: IDataObject = {}; - - let endpoint: string; - let encoding: string | null = 'utf8'; - - const operation = this.getNodeParameter('operation') as string; - - if (operation === 'data') { - requestMethod = 'POST'; - - body.browser_render = this.getNodeParameter('browserRender') as boolean; - body.item_format = this.getNodeParameter('itemFormat') as string; - body.simplify_special_types = this.getNodeParameter('simplifySpecialTypes') as boolean; - - endpoint = 'data'; - } else if (operation === 'apps') { - requestMethod = 'GET'; - - qs.browser_render = this.getNodeParameter('browserRender') as boolean; - qs.return_urls = this.getNodeParameter('returnUrls') as boolean; - - endpoint = 'apps'; - } else if (operation === 'socialMedia') { - requestMethod = 'GET'; - - qs.browser_render = this.getNodeParameter('browserRender') as boolean; - qs.return_urls = this.getNodeParameter('returnUrls') as boolean; - - endpoint = 'social-media'; - } else if (operation === 'screenshot') { - requestMethod = 'GET'; - encoding = null; - - qs.file_format = this.getNodeParameter('fileFormat') as string; - qs.type = this.getNodeParameter('type') as string; - qs.width = this.getNodeParameter('width') as number; - - endpoint = 'browser-screenshot'; - } else { - throw new Error(`The operation "${operation}" is not supported!`); - } - - const options = { - method: requestMethod, - body, - headers: { - 'x-lf-source': 'n8n', - }, - qs, - uri: `https://api.link.fish/Urls/${endpoint}`, - auth: { - user: credentials.email as string, - pass: credentials.apiKey as string, - }, - encoding, - json: true - }; - - const responseData = await this.helpers.request(options); - - if (operation === 'screenshot') { - const item = this.getInputData(); - - const newItem: INodeExecutionData = { - json: item.json, - binary: {}, - }; - - if (item.binary !== undefined) { - // Create a shallow copy of the binary data so that the old - // data references which do not get changed still stay behind - // but the incoming data does not get changed. - Object.assign(newItem.binary, item.binary); - } - - // Add the returned data to the item as binary property - const binaryPropertyName = this.getNodeParameter('binaryPropertyName') as string; - - let fileExtension = 'png'; - let mimeType = 'image/png'; - if (qs.file_format === 'jpg') { - fileExtension = 'jpg'; - mimeType = 'image/jpeg'; - } - - newItem.binary![binaryPropertyName] = await this.helpers.prepareBinaryData(responseData, `screenshot.${fileExtension}`, mimeType); - - return newItem; - } - - return { - json: responseData, - }; - } -} diff --git a/packages/nodes-base/nodes/LinkFish/linkfish.png b/packages/nodes-base/nodes/LinkFish/linkfish.png deleted file mode 100644 index 4825f7d8e..000000000 Binary files a/packages/nodes-base/nodes/LinkFish/linkfish.png and /dev/null differ diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 5d23adac5..beddd2e23 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -100,7 +100,6 @@ "dist/credentials/JotFormApi.credentials.js", "dist/credentials/KeapOAuth2Api.credentials.js", "dist/credentials/LinkedInOAuth2Api.credentials.js", - "dist/credentials/LinkFishApi.credentials.js", "dist/credentials/MailchimpApi.credentials.js", "dist/credentials/MailchimpOAuth2Api.credentials.js", "dist/credentials/MailgunApi.credentials.js", @@ -289,7 +288,6 @@ "dist/nodes/Keap/Keap.node.js", "dist/nodes/Keap/KeapTrigger.node.js", "dist/nodes/LinkedIn/LinkedIn.node.js", - "dist/nodes/LinkFish/LinkFish.node.js", "dist/nodes/Mailchimp/Mailchimp.node.js", "dist/nodes/Mailchimp/MailchimpTrigger.node.js", "dist/nodes/Mailgun/Mailgun.node.js",