From f9c4d834fcb6eb8b792d4ba8d44634b1be85b8f5 Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 11 Jan 2023 17:21:39 +0100 Subject: [PATCH 01/29] PairedItem for N8n training --- .../N8nTrainingCustomerDatastore.node.ts | 12 ++++++++---- .../N8nTrainingCustomerMessenger.node.ts | 10 +++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts b/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts index 9814952136a16..fe1b0be2b03c8 100644 --- a/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts +++ b/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts @@ -111,7 +111,7 @@ export class N8nTrainingCustomerDatastore implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const operation = this.getNodeParameter('operation', 0); let responseData; @@ -133,11 +133,15 @@ export class N8nTrainingCustomerDatastore implements INodeType { } if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push.apply(returnData, executionData); } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); + returnData.push.apply(responseData); } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } diff --git a/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts b/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts index 338e465b27464..6ffa849ce1a63 100644 --- a/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts +++ b/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts @@ -38,7 +38,7 @@ export class N8nTrainingCustomerMessenger implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; let responseData; @@ -48,9 +48,13 @@ export class N8nTrainingCustomerMessenger implements INodeType { const message = this.getNodeParameter('message', i) as string; responseData = { output: `Sent message to customer ${customerId}: ${message}` }; + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); - returnData.push(responseData); + returnData.push(...executionData); } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From ef2f9f3e9cba5fda149ea14b368f0b81b1537037 Mon Sep 17 00:00:00 2001 From: agobrech Date: Mon, 16 Jan 2023 18:50:08 +0100 Subject: [PATCH 02/29] Add paired item to ftp node --- packages/nodes-base/nodes/Ftp/Ftp.node.ts | 73 ++++++++++++++++------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/packages/nodes-base/nodes/Ftp/Ftp.node.ts b/packages/nodes-base/nodes/Ftp/Ftp.node.ts index 543067afb8959..7aa7810743652 100644 --- a/packages/nodes-base/nodes/Ftp/Ftp.node.ts +++ b/packages/nodes-base/nodes/Ftp/Ftp.node.ts @@ -470,17 +470,19 @@ export class Ftp implements INodeType { if (recursive) { responseData = await callRecursiveList(path, sftp!, normalizeSFtpItem); - returnItems.push.apply( - returnItems, + const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), + { itemData: { item: i } }, ); + returnItems.push.apply(returnItems, executionData); } else { responseData = await sftp!.list(path); responseData.forEach((item) => normalizeSFtpItem(item, path)); - returnItems.push.apply( - returnItems, + const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), + { itemData: { item: i } }, ); + returnItems.push.apply(returnItems, executionData); } } @@ -493,8 +495,11 @@ export class Ftp implements INodeType { } else { responseData = await sftp!.delete(path); } - - returnItems.push({ json: { success: true } }); + const executionData = this.helpers.constructExecutionMetaData( + [{ json: { success: true } }], + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } if (operation === 'rename') { @@ -509,8 +514,11 @@ export class Ftp implements INodeType { } responseData = await sftp!.rename(oldPath, newPath); - - returnItems.push({ json: { success: true } }); + const executionData = this.helpers.constructExecutionMetaData( + [{ json: { success: true } }], + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } if (operation === 'download') { @@ -525,8 +533,11 @@ export class Ftp implements INodeType { responseData as Buffer, filePathDownload, ); - - returnItems.push(items[i]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(items[i]), + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } if (operation === 'upload') { @@ -561,7 +572,11 @@ export class Ftp implements INodeType { await sftp!.put(buffer, remotePath); } - returnItems.push(items[i]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(items[i]), + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } } @@ -573,19 +588,21 @@ export class Ftp implements INodeType { if (recursive) { responseData = await callRecursiveList(path, ftp!, normalizeFtpItem); - returnItems.push.apply( - returnItems, + const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), + { itemData: { item: i } }, ); + returnItems.push.apply(returnItems, executionData); } else { responseData = await ftp!.list(path); responseData.forEach((item) => normalizeFtpItem(item as ftpClient.ListingElement, path), ); - returnItems.push.apply( - returnItems, + const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(responseData as unknown as IDataObject[]), + { itemData: { item: i } }, ); + returnItems.push.apply(returnItems, executionData); } } @@ -598,8 +615,11 @@ export class Ftp implements INodeType { } else { responseData = await ftp!.delete(path); } - - returnItems.push({ json: { success: true } }); + const executionData = this.helpers.constructExecutionMetaData( + [{ json: { success: true } }], + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } if (operation === 'download') { @@ -624,7 +644,11 @@ export class Ftp implements INodeType { filePathDownload, ); - returnItems.push(items[i]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(items[i]), + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } if (operation === 'rename') { @@ -633,8 +657,11 @@ export class Ftp implements INodeType { const newPath = this.getNodeParameter('newPath', i) as string; responseData = await ftp!.rename(oldPath, newPath); - - returnItems.push({ json: { success: true } }); + const executionData = this.helpers.constructExecutionMetaData( + [{ json: { success: true } }], + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } if (operation === 'upload') { @@ -690,7 +717,11 @@ export class Ftp implements INodeType { } } } - returnItems.push(items[i]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(items[i]), + { itemData: { item: i } }, + ); + returnItems.push(...executionData); } } } From aee1279b2f13522744230e8d80ab0d7aa0e2711d Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 19:23:03 +0100 Subject: [PATCH 03/29] Add paired item to rocketChat --- .../nodes/Rocketchat/Rocketchat.node.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/Rocketchat/Rocketchat.node.ts b/packages/nodes-base/nodes/Rocketchat/Rocketchat.node.ts index 0f37d105d284b..affb4af88d217 100644 --- a/packages/nodes-base/nodes/Rocketchat/Rocketchat.node.ts +++ b/packages/nodes-base/nodes/Rocketchat/Rocketchat.node.ts @@ -367,7 +367,7 @@ export class Rocketchat implements INodeType { const items = this.getInputData(); const length = items.length; let responseData; - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); for (let i = 0; i < length; i++) { @@ -473,20 +473,24 @@ export class Rocketchat implements INodeType { ); } } - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From f8bf9438103412820eea38ae88d889594e272afd Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 19:29:07 +0100 Subject: [PATCH 04/29] Add pairedItem to pushOver --- .../nodes/Pushover/Pushover.node.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/Pushover/Pushover.node.ts b/packages/nodes-base/nodes/Pushover/Pushover.node.ts index 5ddfec52b604a..655357c559fcb 100644 --- a/packages/nodes-base/nodes/Pushover/Pushover.node.ts +++ b/packages/nodes-base/nodes/Pushover/Pushover.node.ts @@ -298,7 +298,7 @@ export class Pushover implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; let responseData; const resource = this.getNodeParameter('resource', 0); @@ -372,21 +372,25 @@ export class Pushover implements INodeType { } responseData = await pushoverApiRequest.call(this, 'POST', '/messages.json', body); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From aed31e63f50047f8ead348a188925f1abfce8e17 Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 19:31:22 +0100 Subject: [PATCH 05/29] Add paired item to Matrix --- .../nodes-base/nodes/Matrix/Matrix.node.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/nodes-base/nodes/Matrix/Matrix.node.ts b/packages/nodes-base/nodes/Matrix/Matrix.node.ts index dd14f03a60a9f..27f53df26f23f 100644 --- a/packages/nodes-base/nodes/Matrix/Matrix.node.ts +++ b/packages/nodes-base/nodes/Matrix/Matrix.node.ts @@ -138,27 +138,30 @@ export class Matrix implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData() as IDataObject[]; - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); for (let i = 0; i < items.length; i++) { try { const responseData = await handleMatrixCall.call(this, items[i], i, resource, operation); - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 37381d380f80e695c95aaebb9742c8460089735e Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 19:36:53 +0100 Subject: [PATCH 06/29] Add pairedItem to theHive --- .../nodes-base/nodes/TheHive/TheHive.node.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/TheHive/TheHive.node.ts b/packages/nodes-base/nodes/TheHive/TheHive.node.ts index ae9519bfd40f3..e888c5dc5d698 100644 --- a/packages/nodes-base/nodes/TheHive/TheHive.node.ts +++ b/packages/nodes-base/nodes/TheHive/TheHive.node.ts @@ -312,7 +312,7 @@ export class TheHive implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const qs: IDataObject = {}; let responseData; @@ -1953,19 +1953,23 @@ export class TheHive implements INodeType { } } - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 280fb4a400b4194034ab7052091624dd5b212a9f Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 20:13:00 +0100 Subject: [PATCH 07/29] Add paired item to Snowflake --- .../nodes/Snowflake/Snowflake.node.ts | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts b/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts index b3c8f9b8891b0..01e02e518badf 100644 --- a/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts +++ b/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts @@ -155,7 +155,7 @@ export class Snowflake implements INodeType { const credentials = (await this.getCredentials( 'snowflake', )) as unknown as snowflake.ConnectionOptions; - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; let responseData; const connection = snowflake.createConnection(credentials); @@ -173,7 +173,11 @@ export class Snowflake implements INodeType { for (let i = 0; i < items.length; i++) { const query = this.getNodeParameter('query', i) as string; responseData = await execute(connection, query, []); - returnData.push.apply(returnData, responseData as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData as IDataObject[]), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } @@ -191,7 +195,11 @@ export class Snowflake implements INodeType { const data = copyInputItems(items, columns); const binds = data.map((element) => Object.values(element)); await execute(connection, query, binds as unknown as snowflake.InsertBinds); - returnData.push.apply(returnData, data); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(data), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } if (operation === 'update') { @@ -216,11 +224,14 @@ export class Snowflake implements INodeType { for (let i = 0; i < binds.length; i++) { await execute(connection, query, binds[i] as unknown as snowflake.InsertBinds); } - returnData.push.apply(returnData, data); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(data), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } await destroy(connection); - - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 30b636520afc9e41af41a69734717ea5dca86c5a Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 20:17:07 +0100 Subject: [PATCH 08/29] Add paired item to PhilipsHue --- .../nodes/PhilipsHue/PhilipsHue.node.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/PhilipsHue/PhilipsHue.node.ts b/packages/nodes-base/nodes/PhilipsHue/PhilipsHue.node.ts index db5cf97f56d6e..f7ac714507c15 100644 --- a/packages/nodes-base/nodes/PhilipsHue/PhilipsHue.node.ts +++ b/packages/nodes-base/nodes/PhilipsHue/PhilipsHue.node.ts @@ -1,7 +1,6 @@ import { IExecuteFunctions } from 'n8n-core'; import { - IDataObject, ILoadOptionsFunctions, INodeExecutionData, INodePropertyOptions, @@ -88,7 +87,7 @@ export class PhilipsHue implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; let responseData; const resource = this.getNodeParameter('resource', 0); @@ -176,12 +175,12 @@ export class PhilipsHue implements INodeType { ); } } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 181b58892feafffa1b2456d98871a18bce4ea08c Mon Sep 17 00:00:00 2001 From: agobrech Date: Tue, 17 Jan 2023 20:39:26 +0100 Subject: [PATCH 09/29] Add pairedItem to supabase --- .../nodes/Supabase/Supabase.node.ts | 65 ++++++++++++++++--- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/packages/nodes-base/nodes/Supabase/Supabase.node.ts b/packages/nodes-base/nodes/Supabase/Supabase.node.ts index dfe86b0729807..edb3129f2b4b0 100644 --- a/packages/nodes-base/nodes/Supabase/Supabase.node.ts +++ b/packages/nodes-base/nodes/Supabase/Supabase.node.ts @@ -121,7 +121,7 @@ export class Supabase implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const qs: IDataObject = {}; const resource = this.getNodeParameter('resource', 0); @@ -159,10 +159,18 @@ export class Supabase implements INodeType { try { createdRow = await supabaseApiRequest.call(this, 'POST', endpoint, records); - returnData.push(...createdRow); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(createdRow), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.description }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.description }), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } else { throw error; } @@ -207,11 +215,20 @@ export class Supabase implements INodeType { rows = await supabaseApiRequest.call(this, 'DELETE', endpoint, {}, qs); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.description }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.description }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + continue; } } - returnData.push(...rows); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(rows), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } @@ -237,11 +254,21 @@ export class Supabase implements INodeType { rows = await supabaseApiRequest.call(this, 'GET', endpoint, {}, qs); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.description }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + continue; } } returnData.push(...rows); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(rows), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } @@ -280,13 +307,22 @@ export class Supabase implements INodeType { try { rows = await supabaseApiRequest.call(this, 'GET', endpoint, {}, qs); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(rows), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.description }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.description }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + continue; } } - returnData.push(...rows); } } @@ -347,15 +383,24 @@ export class Supabase implements INodeType { try { updatedRow = await supabaseApiRequest.call(this, 'PATCH', endpoint, record, qs); returnData.push(...updatedRow); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(updatedRow), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.description }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.description }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } } } } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From e3391934fb3f9e8cbd37e2e2ad448bcb09bfa178 Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 16:39:48 +0100 Subject: [PATCH 10/29] Add paired item to Odoo --- packages/nodes-base/nodes/Odoo/Odoo.node.ts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/Odoo/Odoo.node.ts b/packages/nodes-base/nodes/Odoo/Odoo.node.ts index 7cb66a4345de5..c3c1ea03177a3 100644 --- a/packages/nodes-base/nodes/Odoo/Odoo.node.ts +++ b/packages/nodes-base/nodes/Odoo/Odoo.node.ts @@ -12,7 +12,6 @@ import { INodePropertyOptions, INodeType, INodeTypeDescription, - JsonObject, } from 'n8n-workflow'; import { @@ -298,7 +297,7 @@ export class Odoo implements INodeType { async execute(this: IExecuteFunctions): Promise { let items = this.getInputData(); items = deepCopy(items); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; let responseData; const resource = this.getNodeParameter('resource', 0); @@ -745,15 +744,21 @@ export class Odoo implements INodeType { ); } } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData); - } else if (responseData !== undefined) { - returnData.push(responseData); + if (responseData !== undefined) { + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: (error as JsonObject).message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + continue; } throw error; From 70d85f52574907de81503f1a22b5fd42b7b2b01e Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 16:44:58 +0100 Subject: [PATCH 11/29] fix odoo & add paired item to grist --- packages/nodes-base/nodes/Grist/Grist.node.ts | 20 ++++++++++++------- packages/nodes-base/nodes/Odoo/Odoo.node.ts | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/Grist/Grist.node.ts b/packages/nodes-base/nodes/Grist/Grist.node.ts index ee522b012a048..98878d9126334 100644 --- a/packages/nodes-base/nodes/Grist/Grist.node.ts +++ b/packages/nodes-base/nodes/Grist/Grist.node.ts @@ -116,7 +116,7 @@ export class Grist implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); let responseData; - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const operation = this.getNodeParameter('operation', 0); @@ -247,17 +247,23 @@ export class Grist implements INodeType { } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + continue; } throw error; } - - Array.isArray(responseData) - ? returnData.push(...responseData) - : returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } diff --git a/packages/nodes-base/nodes/Odoo/Odoo.node.ts b/packages/nodes-base/nodes/Odoo/Odoo.node.ts index c3c1ea03177a3..b69633e10e005 100644 --- a/packages/nodes-base/nodes/Odoo/Odoo.node.ts +++ b/packages/nodes-base/nodes/Odoo/Odoo.node.ts @@ -765,6 +765,6 @@ export class Odoo implements INodeType { } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 8a98f8743e6e652aea9cc9dc215ba71755617114 Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 16:48:14 +0100 Subject: [PATCH 12/29] add pairedItem to Linkedin --- .../nodes/LinkedIn/LinkedIn.node.ts | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/nodes-base/nodes/LinkedIn/LinkedIn.node.ts b/packages/nodes-base/nodes/LinkedIn/LinkedIn.node.ts index 847658982bfac..aae1542b110f9 100644 --- a/packages/nodes-base/nodes/LinkedIn/LinkedIn.node.ts +++ b/packages/nodes-base/nodes/LinkedIn/LinkedIn.node.ts @@ -1,6 +1,5 @@ import { IExecuteFunctions } from 'n8n-core'; import { - IDataObject, ILoadOptionsFunctions, INodeExecutionData, INodePropertyOptions, @@ -70,7 +69,7 @@ export class LinkedIn implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; let responseData; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); @@ -256,21 +255,24 @@ export class LinkedIn implements INodeType { responseData = await linkedInApiRequest.call(this, 'POST', endpoint, body); } } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 63abc62bc953ba28e7833be7efb872ffea6b493e Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 16:51:02 +0100 Subject: [PATCH 13/29] add pairedItem Zulip --- packages/nodes-base/nodes/Zulip/Zulip.node.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/nodes-base/nodes/Zulip/Zulip.node.ts b/packages/nodes-base/nodes/Zulip/Zulip.node.ts index e1497aa5e5d44..0c734d6b5a1ba 100644 --- a/packages/nodes-base/nodes/Zulip/Zulip.node.ts +++ b/packages/nodes-base/nodes/Zulip/Zulip.node.ts @@ -126,7 +126,7 @@ export class Zulip implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; let responseData; const resource = this.getNodeParameter('resource', 0); @@ -464,20 +464,23 @@ export class Zulip implements INodeType { responseData = await zulipApiRequest.call(this, 'DELETE', `/users/${userId}`, body); } } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From c3ca93ad0526bd5cf8ef18418e44df914eb14616 Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 16:53:26 +0100 Subject: [PATCH 14/29] add pairedItem PhatomBuster --- .../nodes/Phantombuster/Phantombuster.node.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/nodes-base/nodes/Phantombuster/Phantombuster.node.ts b/packages/nodes-base/nodes/Phantombuster/Phantombuster.node.ts index cb0a7cdde1d8e..9d15ccdbaa8ca 100644 --- a/packages/nodes-base/nodes/Phantombuster/Phantombuster.node.ts +++ b/packages/nodes-base/nodes/Phantombuster/Phantombuster.node.ts @@ -102,7 +102,7 @@ export class Phantombuster implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const qs: IDataObject = {}; let responseData; @@ -247,20 +247,23 @@ export class Phantombuster implements INodeType { } } } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 97e1c53196b42f1ef0daeaa665de9a8f84a2a77c Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 17:02:11 +0100 Subject: [PATCH 15/29] add pairedItem to TodoistV2 --- .../nodes/Todoist/v2/TodoistV2.node.ts | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts b/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts index e42b3b5ffb6ce..35023d06436b6 100644 --- a/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts +++ b/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts @@ -697,7 +697,7 @@ export class TodoistV2 implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const service = new TodoistService(); let responseData; @@ -712,23 +712,41 @@ export class TodoistV2 implements INodeType { i, ); } - if (Array.isArray(responseData?.data)) { - returnData.push.apply(returnData, responseData?.data as IDataObject[]); + + if (responseData !== undefined && Array.isArray(responseData?.data)) { + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData as IDataObject[]), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } else { if (responseData?.hasOwnProperty('success')) { - returnData.push({ success: responseData.success }); + returnData.push(); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: responseData.success }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } else { - returnData.push(responseData?.data as IDataObject); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData?.data as IDataObject), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 624c78a6887c1093aceb32634883b34305ee2f9d Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 17:21:28 +0100 Subject: [PATCH 16/29] Add pairedItem HomeAssistant --- .../nodes/HomeAssistant/HomeAssistant.node.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/HomeAssistant/HomeAssistant.node.ts b/packages/nodes-base/nodes/HomeAssistant/HomeAssistant.node.ts index 2ea8321b48630..0a16f6a37465c 100644 --- a/packages/nodes-base/nodes/HomeAssistant/HomeAssistant.node.ts +++ b/packages/nodes-base/nodes/HomeAssistant/HomeAssistant.node.ts @@ -180,7 +180,7 @@ export class HomeAssistant implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); @@ -442,22 +442,27 @@ export class HomeAssistant implements INodeType { if (resource === 'cameraProxy' && operation === 'get') { items[i].json = { error: error.message }; } else { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } continue; } throw error; } - - Array.isArray(responseData) - ? returnData.push(...responseData) - : returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } if (resource === 'cameraProxy' && operation === 'getScreenshot') { return this.prepareOutputData(items); } else { - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } } From 61a1460726b4360ab5a9cbd6555a64f02f6db70b Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 17:34:41 +0100 Subject: [PATCH 17/29] Add pairedItem to DropContact --- .../nodes/Dropcontact/Dropcontact.node.ts | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts b/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts index 2b112ed988c07..a371c96afcce6 100644 --- a/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts +++ b/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts @@ -246,7 +246,7 @@ export class Dropcontact implements INodeType { const operation = this.getNodeParameter('operation', 0); let responseData: any; - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; if (resource === 'contact') { if (operation === 'enrich') { @@ -278,7 +278,12 @@ export class Dropcontact implements INodeType { if (!responseData.success) { if (this.continueOnFail()) { - returnData.push({ error: responseData.reason || 'invalid request' }); + returnData.push(); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: responseData.reason || 'invalid request' }), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } else { throw new NodeApiError(this.getNode(), { error: responseData.reason || 'invalid request', @@ -300,7 +305,11 @@ export class Dropcontact implements INodeType { ); if (!responseData.success) { if (this.continueOnFail()) { - responseData.push({ error: responseData.reason }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: responseData.reason }), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } else { throw new NodeApiError(this.getNode(), { error: responseData.reason, @@ -308,10 +317,18 @@ export class Dropcontact implements INodeType { }); } } else { - returnData.push(...responseData.data); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData.data), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } } else { - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: 0 } }, + ); + returnData.push(...executionData); } } @@ -327,18 +344,26 @@ export class Dropcontact implements INodeType { )) as { request_id: string; error: string; success: boolean }; if (!responseData.success) { if (this.continueOnFail()) { - responseData.push({ error: responseData.reason || 'invalid request' }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: responseData.reason || 'invalid request' }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } else { throw new NodeApiError(this.getNode(), { error: responseData.reason || 'invalid request', }); } } - returnData.push(...responseData.data); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData.data), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From b23856ec9197f2527398580d492c90d7eeeaccfa Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 17:37:48 +0100 Subject: [PATCH 18/29] Add pairedItem to Aws SES --- .../nodes-base/nodes/Aws/SES/AwsSes.node.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts index 7e62dd0f4980e..1e8bbee4b7c46 100644 --- a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts +++ b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts @@ -817,7 +817,7 @@ export class AwsSes implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; let responseData; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); @@ -1281,23 +1281,24 @@ export class AwsSes implements INodeType { responseData = responseData.UpdateTemplateResponse; } } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From c6f49a21f76e11799830cb97879fd02ccd3db319 Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 18:20:02 +0100 Subject: [PATCH 19/29] Add pairedItem to microsoftOutlook --- .../Outlook/MicrosoftOutlook.node.ts | 202 ++++++++++++++---- 1 file changed, 164 insertions(+), 38 deletions(-) diff --git a/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts b/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts index 7c99401574135..5996efb0969a4 100644 --- a/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts +++ b/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts @@ -132,7 +132,7 @@ export class MicrosoftOutlook implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const length = items.length; const qs: IDataObject = {}; let responseData; @@ -146,11 +146,18 @@ export class MicrosoftOutlook implements INodeType { try { const messageId = this.getNodeParameter('messageId', i) as string; responseData = await microsoftApiRequest.call(this, 'DELETE', `/messages/${messageId}`); - - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -183,17 +190,25 @@ export class MicrosoftOutlook implements INodeType { if (additionalFields.dataPropertyAttachmentsPrefixName) { const prefix = additionalFields.dataPropertyAttachmentsPrefixName as string; const data = await downloadAttachments.call(this, responseData, prefix); - returnData.push.apply(returnData, data as unknown as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(data), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } else { returnData.push(responseData); } if (additionalFields.dataPropertyAttachmentsPrefixName) { - return [returnData as INodeExecutionData[]]; + return [returnData]; } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -221,7 +236,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -260,7 +279,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -290,11 +313,18 @@ export class MicrosoftOutlook implements INodeType { 'POST', `/messages/${messageId}/send`, ); - - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -358,7 +388,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -453,13 +487,25 @@ export class MicrosoftOutlook implements INodeType { if (additionalFields.dataPropertyAttachmentsPrefixName) { const prefix = additionalFields.dataPropertyAttachmentsPrefixName as string; const data = await downloadAttachments.call(this, responseData, prefix); - returnData.push.apply(returnData, data as unknown as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(data), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } else { - returnData.push.apply(returnData, responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -467,7 +513,7 @@ export class MicrosoftOutlook implements INodeType { } if (additionalFields.dataPropertyAttachmentsPrefixName) { - return [returnData as INodeExecutionData[]]; + return [returnData]; } } @@ -486,10 +532,18 @@ export class MicrosoftOutlook implements INodeType { `/messages/${messageId}/move`, body, ); - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -537,10 +591,18 @@ export class MicrosoftOutlook implements INodeType { }; responseData = await microsoftApiRequest.call(this, 'POST', '/sendMail', body, {}); - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -648,10 +710,18 @@ export class MicrosoftOutlook implements INodeType { {}, ); } - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -744,7 +814,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -784,10 +858,18 @@ export class MicrosoftOutlook implements INodeType { responseData = await microsoftApiRequest.call(this, 'GET', endpoint, undefined, qs); responseData = responseData.value; } - returnData.push.apply(returnData, responseData as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -825,7 +907,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -842,10 +928,18 @@ export class MicrosoftOutlook implements INodeType { 'DELETE', `/mailFolders/${folderId}`, ); - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -876,7 +970,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -912,10 +1010,18 @@ export class MicrosoftOutlook implements INodeType { responseData = await microsoftApiRequest.call(this, 'GET', '/mailFolders', {}, qs); responseData = responseData.value; } - returnData.push.apply(returnData, responseData as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -957,10 +1063,18 @@ export class MicrosoftOutlook implements INodeType { ); responseData = responseData.value; } - returnData.push.apply(returnData, responseData as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -987,7 +1101,11 @@ export class MicrosoftOutlook implements INodeType { returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -1026,11 +1144,19 @@ export class MicrosoftOutlook implements INodeType { responseData = await microsoftApiRequest.call(this, 'GET', endpoint, undefined, qs); responseData = responseData.value; } - returnData.push.apply(returnData, responseData as IDataObject[]); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -1044,7 +1170,7 @@ export class MicrosoftOutlook implements INodeType { ) { return this.prepareOutputData(items); } else { - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } } From 7f3019b99a429450d58777ec9f9264377b71c028 Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 18:31:02 +0100 Subject: [PATCH 20/29] Add pairedItem to AwsS3 --- .../nodes-base/nodes/Aws/S3/AwsS3.node.ts | 77 ++++++++++++++----- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts b/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts index c480e183872b0..eb514fd481c80 100644 --- a/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts +++ b/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts @@ -12,7 +12,6 @@ import { INodeExecutionData, INodeType, INodeTypeDescription, - JsonObject, NodeOperationError, } from 'n8n-workflow'; @@ -84,7 +83,7 @@ export class AwsS3 implements INodeType { async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; const qs: IDataObject = {}; let responseData; const resource = this.getNodeParameter('resource', 0); @@ -150,8 +149,11 @@ export class AwsS3 implements INodeType { qs, headers, ); - - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } // https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html @@ -167,7 +169,11 @@ export class AwsS3 implements INodeType { {}, headers, ); - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html @@ -194,7 +200,11 @@ export class AwsS3 implements INodeType { ); responseData = responseData.slice(0, qs.limit); } - returnData.push.apply(returnData, responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html @@ -263,11 +273,11 @@ export class AwsS3 implements INodeType { ); responseData = responseData.ListBucketResult.Contents; } - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData); - } else { - returnData.push(responseData); - } + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } if (resource === 'folder') { @@ -306,7 +316,11 @@ export class AwsS3 implements INodeType { {}, region, ); - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html if (operation === 'delete') { @@ -386,7 +400,11 @@ export class AwsS3 implements INodeType { responseData = { deleted: responseData.DeleteResult.Deleted }; } - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html if (operation === 'getAll') { @@ -446,7 +464,11 @@ export class AwsS3 implements INodeType { if (qs.limit) { responseData = responseData.splice(0, qs.limit as number); } - returnData.push.apply(returnData, responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } } @@ -647,8 +669,11 @@ export class AwsS3 implements INodeType { {}, region, ); - - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html if (operation === 'getAll') { @@ -710,7 +735,11 @@ export class AwsS3 implements INodeType { if (qs.limit) { responseData = responseData.splice(0, qs.limit as number); } - returnData.push.apply(returnData, responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html @@ -863,12 +892,20 @@ export class AwsS3 implements INodeType { region, ); } - returnData.push({ success: true }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ success: true }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: (error as JsonObject).message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } throw error; @@ -878,7 +915,7 @@ export class AwsS3 implements INodeType { // For file downloads the files get attached to the existing items return this.prepareOutputData(items); } else { - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } } From 886a0a46a147f816566cf2fc286ab52d08a541ae Mon Sep 17 00:00:00 2001 From: agobrech Date: Wed, 18 Jan 2023 18:34:08 +0100 Subject: [PATCH 21/29] Add pairedItem to Aws DynamoDB --- .../nodes/Aws/DynamoDB/AwsDynamoDB.node.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/Aws/DynamoDB/AwsDynamoDB.node.ts b/packages/nodes-base/nodes/Aws/DynamoDB/AwsDynamoDB.node.ts index b1ae1b4060e43..3700ab2076c2d 100644 --- a/packages/nodes-base/nodes/Aws/DynamoDB/AwsDynamoDB.node.ts +++ b/packages/nodes-base/nodes/Aws/DynamoDB/AwsDynamoDB.node.ts @@ -91,7 +91,7 @@ export class AwsDynamoDB implements INodeType { const operation = this.getNodeParameter('operation', 0); let responseData; - const returnData: IDataObject[] = []; + const returnData: INodeExecutionData[] = []; for (let i = 0; i < items.length; i++) { try { @@ -391,14 +391,19 @@ export class AwsDynamoDB implements INodeType { responseData = responseData.map(simplify); } } - - Array.isArray(responseData) - ? returnData.push(...responseData) - : returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } } catch (error) { if (this.continueOnFail()) { - returnData.push({ error: error.message }); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray({ error: error.message }), + { itemData: { item: i } }, + ); + returnData.push(...executionData); continue; } @@ -406,6 +411,6 @@ export class AwsDynamoDB implements INodeType { } } - return [this.helpers.returnJsonArray(returnData)]; + return this.prepareOutputData(returnData); } } From 25b2e458d44fc72c68e1739cd202fe05f0391867 Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 30 Jan 2023 13:27:53 +0100 Subject: [PATCH 22/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20Dropcontact=20enrich?= =?UTF-8?q?=20operation=20paired=20item=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nodes/Dropcontact/Dropcontact.node.ts | 27 ++++++++++++------- .../nodes/Dropcontact/GenericFunction.ts | 10 ++++++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts b/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts index a371c96afcce6..7c19f85719e49 100644 --- a/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts +++ b/packages/nodes-base/nodes/Dropcontact/Dropcontact.node.ts @@ -8,7 +8,7 @@ import { NodeApiError, } from 'n8n-workflow'; -import { dropcontactApiRequest } from './GenericFunction'; +import { dropcontactApiRequest, mapPairedItemsFrom } from './GenericFunction'; export class Dropcontact implements INodeType { description: INodeTypeDescription = { @@ -278,10 +278,11 @@ export class Dropcontact implements INodeType { if (!responseData.success) { if (this.continueOnFail()) { - returnData.push(); const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray({ error: responseData.reason || 'invalid request' }), - { itemData: { item: 0 } }, + { + itemData: mapPairedItemsFrom(entryData), + }, ); returnData.push(...executionData); } else { @@ -307,7 +308,9 @@ export class Dropcontact implements INodeType { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray({ error: responseData.reason }), - { itemData: { item: 0 } }, + { + itemData: mapPairedItemsFrom(entryData), + }, ); returnData.push(...executionData); } else { @@ -317,16 +320,20 @@ export class Dropcontact implements INodeType { }); } } else { - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(responseData.data), - { itemData: { item: 0 } }, - ); - returnData.push(...executionData); + responseData.data.forEach((d: IDataObject, index: number) => { + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(d), + { itemData: { item: index } }, + ); + returnData.push(...executionData); + }); } } else { const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(responseData), - { itemData: { item: 0 } }, + { + itemData: mapPairedItemsFrom(entryData), + }, ); returnData.push(...executionData); } diff --git a/packages/nodes-base/nodes/Dropcontact/GenericFunction.ts b/packages/nodes-base/nodes/Dropcontact/GenericFunction.ts index 68d0ff544f0a7..542b6bf03b0f5 100644 --- a/packages/nodes-base/nodes/Dropcontact/GenericFunction.ts +++ b/packages/nodes-base/nodes/Dropcontact/GenericFunction.ts @@ -1,6 +1,6 @@ import { IExecuteFunctions, IHookFunctions } from 'n8n-core'; -import { IDataObject, ILoadOptionsFunctions } from 'n8n-workflow'; +import { IDataObject, ILoadOptionsFunctions, IPairedItemData } from 'n8n-workflow'; import { OptionsWithUri } from 'request'; @@ -32,3 +32,11 @@ export async function dropcontactApiRequest( return this.helpers.requestWithAuthentication.call(this, 'dropcontactApi', options); } + +export function mapPairedItemsFrom(iterable: Iterable | ArrayLike): IPairedItemData[] { + return Array.from(iterable, (_, i) => i).map((index) => { + return { + item: index, + }; + }); +} From 3521738fcf7c93c7a7c627d33b12570a430dbab7 Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 30 Jan 2023 17:43:55 +0100 Subject: [PATCH 23/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20Dropcontact=20insert?= =?UTF-8?q?/update=20operation=20paired=20items?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nodes/Snowflake/Snowflake.node.ts | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts b/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts index 01e02e518badf..2a3957b241634 100644 --- a/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts +++ b/packages/nodes-base/nodes/Snowflake/Snowflake.node.ts @@ -195,11 +195,13 @@ export class Snowflake implements INodeType { const data = copyInputItems(items, columns); const binds = data.map((element) => Object.values(element)); await execute(connection, query, binds as unknown as snowflake.InsertBinds); - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(data), - { itemData: { item: 0 } }, - ); - returnData.push(...executionData); + data.forEach((d, i) => { + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(d), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + }); } if (operation === 'update') { @@ -224,11 +226,13 @@ export class Snowflake implements INodeType { for (let i = 0; i < binds.length; i++) { await execute(connection, query, binds[i] as unknown as snowflake.InsertBinds); } - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(data), - { itemData: { item: 0 } }, - ); - returnData.push(...executionData); + data.forEach((d, i) => { + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(d), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + }); } await destroy(connection); From 75b52800c009fed6a12cee7d102c5bc7d73f9ed6 Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 30 Jan 2023 18:36:35 +0100 Subject: [PATCH 24/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20Supabase=20paired=20?= =?UTF-8?q?item=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nodes/Supabase/GenericFunctions.ts | 9 +++++++ .../nodes/Supabase/Supabase.node.ts | 27 ++++++++++++------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/nodes-base/nodes/Supabase/GenericFunctions.ts b/packages/nodes-base/nodes/Supabase/GenericFunctions.ts index c7744d28438c1..ed6d32b805b55 100644 --- a/packages/nodes-base/nodes/Supabase/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Supabase/GenericFunctions.ts @@ -13,6 +13,7 @@ import { ICredentialTestFunctions, IDataObject, INodeProperties, + IPairedItemData, NodeApiError, } from 'n8n-workflow'; @@ -322,3 +323,11 @@ export async function validateCredentials( return this.helpers.request(options); } + +export function mapPairedItemsFrom(iterable: Iterable | ArrayLike): IPairedItemData[] { + return Array.from(iterable, (_, i) => i).map((index) => { + return { + item: index, + }; + }); +} diff --git a/packages/nodes-base/nodes/Supabase/Supabase.node.ts b/packages/nodes-base/nodes/Supabase/Supabase.node.ts index edb3129f2b4b0..7c0f5c049f347 100644 --- a/packages/nodes-base/nodes/Supabase/Supabase.node.ts +++ b/packages/nodes-base/nodes/Supabase/Supabase.node.ts @@ -18,6 +18,7 @@ import { buildGetQuery, buildOrQuery, buildQuery, + mapPairedItemsFrom, supabaseApiRequest, validateCredentials, } from './GenericFunctions'; @@ -155,20 +156,26 @@ export class Supabase implements INodeType { records.push(record); } const endpoint = `/${tableId}`; - let createdRow; try { - createdRow = await supabaseApiRequest.call(this, 'POST', endpoint, records); - const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(createdRow), - { itemData: { item: 0 } }, + const createdRows: IDataObject[] = await supabaseApiRequest.call( + this, + 'POST', + endpoint, + records, ); - returnData.push(...executionData); + createdRows.forEach((row, i) => { + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(row), + { itemData: { item: i } }, + ); + returnData.push(...executionData); + }); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray({ error: error.description }), - { itemData: { item: 0 } }, + { itemData: mapPairedItemsFrom(records) }, ); returnData.push(...executionData); } else { @@ -223,6 +230,7 @@ export class Supabase implements INodeType { continue; } + throw error; } const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(rows), @@ -262,8 +270,8 @@ export class Supabase implements INodeType { continue; } + throw error; } - returnData.push(...rows); const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(rows), { itemData: { item: i } }, @@ -322,6 +330,7 @@ export class Supabase implements INodeType { continue; } + throw error; } } } @@ -382,7 +391,6 @@ export class Supabase implements INodeType { try { updatedRow = await supabaseApiRequest.call(this, 'PATCH', endpoint, record, qs); - returnData.push(...updatedRow); const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray(updatedRow), { itemData: { item: i } }, @@ -397,6 +405,7 @@ export class Supabase implements INodeType { returnData.push(...executionData); continue; } + throw error; } } } From f183a4cd5bf5e5d37ff23d441fdbba0c62623d62 Mon Sep 17 00:00:00 2001 From: Marcus Date: Tue, 31 Jan 2023 11:15:23 +0100 Subject: [PATCH 25/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20Supabase=20paired=20?= =?UTF-8?q?item=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts b/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts index 35023d06436b6..b96670331505d 100644 --- a/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts +++ b/packages/nodes-base/nodes/Todoist/v2/TodoistV2.node.ts @@ -715,13 +715,12 @@ export class TodoistV2 implements INodeType { if (responseData !== undefined && Array.isArray(responseData?.data)) { const executionData = this.helpers.constructExecutionMetaData( - this.helpers.returnJsonArray(responseData as IDataObject[]), + this.helpers.returnJsonArray(responseData.data as IDataObject[]), { itemData: { item: i } }, ); returnData.push(...executionData); } else { if (responseData?.hasOwnProperty('success')) { - returnData.push(); const executionData = this.helpers.constructExecutionMetaData( this.helpers.returnJsonArray({ success: responseData.success }), { itemData: { item: i } }, From fd40ea7fa8da79aba264973bc8461cd08246e388 Mon Sep 17 00:00:00 2001 From: Marcus Date: Tue, 31 Jan 2023 13:30:38 +0100 Subject: [PATCH 26/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20N8nTrainingCustomerD?= =?UTF-8?q?atastore=20paired=20item=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../N8nTrainingCustomerDatastore.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts b/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts index fe1b0be2b03c8..7ea87de17c62d 100644 --- a/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts +++ b/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts @@ -139,7 +139,7 @@ export class N8nTrainingCustomerDatastore implements INodeType { ); returnData.push.apply(returnData, executionData); } else if (responseData !== undefined) { - returnData.push.apply(responseData); + returnData.push({ json: responseData }); } } return this.prepareOutputData(returnData); From 0b62db076b013b2c6dca3c4e7c6dd4d80f9b763f Mon Sep 17 00:00:00 2001 From: Marcus Date: Tue, 31 Jan 2023 13:33:23 +0100 Subject: [PATCH 27/29] =?UTF-8?q?=F0=9F=8E=A8=20remove=20unused=20imports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../N8nTrainingCustomerDatastore.node.ts | 2 +- .../N8nTrainingCustomerMessenger.node.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts b/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts index 7ea87de17c62d..bf706498e25f9 100644 --- a/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts +++ b/packages/nodes-base/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.ts @@ -1,6 +1,6 @@ import { IExecuteFunctions } from 'n8n-core'; -import { IDataObject, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow'; +import { INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow'; const data = [ { diff --git a/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts b/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts index 6ffa849ce1a63..9aba25db9b7c6 100644 --- a/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts +++ b/packages/nodes-base/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.ts @@ -1,6 +1,6 @@ import { IExecuteFunctions } from 'n8n-core'; -import { IDataObject, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow'; +import { INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow'; export class N8nTrainingCustomerMessenger implements INodeType { description: INodeTypeDescription = { From 780588c6760f279b1128975cd264dc01b78f843f Mon Sep 17 00:00:00 2001 From: Marcus Date: Tue, 31 Jan 2023 16:15:28 +0100 Subject: [PATCH 28/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20MicrosoftOutlook=20p?= =?UTF-8?q?aired=20item=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Outlook/MicrosoftOutlook.node.ts | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts b/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts index 5996efb0969a4..9f44b3c48b0f4 100644 --- a/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts +++ b/packages/nodes-base/nodes/Microsoft/Outlook/MicrosoftOutlook.node.ts @@ -196,7 +196,11 @@ export class MicrosoftOutlook implements INodeType { ); returnData.push(...executionData); } else { - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } if (additionalFields.dataPropertyAttachmentsPrefixName) { @@ -233,7 +237,11 @@ export class MicrosoftOutlook implements INodeType { body, {}, ); - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( @@ -276,7 +284,11 @@ export class MicrosoftOutlook implements INodeType { responseData = await microsoftApiRequest.call(this, 'POST', '/messages', body, {}); - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( @@ -385,7 +397,11 @@ export class MicrosoftOutlook implements INodeType { await microsoftApiRequest.call(this, 'POST', `/messages/${responseData.id}/send`); } - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( @@ -811,7 +827,11 @@ export class MicrosoftOutlook implements INodeType { undefined, qs, ); - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( @@ -904,7 +924,11 @@ export class MicrosoftOutlook implements INodeType { } responseData = await microsoftApiRequest.call(this, 'POST', endpoint, body); - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( @@ -967,7 +991,11 @@ export class MicrosoftOutlook implements INodeType { {}, qs, ); - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( @@ -1098,7 +1126,11 @@ export class MicrosoftOutlook implements INodeType { `/mailFolders/${folderId}`, body, ); - returnData.push(responseData); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionData = this.helpers.constructExecutionMetaData( From a323d0b6d82fb42203da2ddf186b8f43fdc7ecaf Mon Sep 17 00:00:00 2001 From: Marcus Date: Tue, 31 Jan 2023 16:50:09 +0100 Subject: [PATCH 29/29] =?UTF-8?q?=F0=9F=90=9B=20fix=20AwsS3=20paired=20ite?= =?UTF-8?q?m=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts b/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts index eb514fd481c80..29874413b571a 100644 --- a/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts +++ b/packages/nodes-base/nodes/Aws/S3/AwsS3.node.ts @@ -576,7 +576,11 @@ export class AwsS3 implements INodeType { {}, region, ); - returnData.push(responseData.CopyObjectResult); + const executionData = this.helpers.constructExecutionMetaData( + this.helpers.returnJsonArray(responseData.CopyObjectResult), + { itemData: { item: i } }, + ); + returnData.push(...executionData); } //https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html if (operation === 'download') {