diff --git a/packages/nodes-base/nodes/ItemLists/V1/ItemListsV1.node.ts b/packages/nodes-base/nodes/ItemLists/V1/ItemListsV1.node.ts index 1684b71642..1630756e2b 100644 --- a/packages/nodes-base/nodes/ItemLists/V1/ItemListsV1.node.ts +++ b/packages/nodes-base/nodes/ItemLists/V1/ItemListsV1.node.ts @@ -1,6 +1,3 @@ -import type { NodeVMOptions } from 'vm2'; -import { NodeVM } from 'vm2'; - import type { IDataObject, IExecuteFunctions, @@ -61,6 +58,7 @@ const shuffleArray = (array: any[]) => { }; import * as summarize from './summarize.operation'; +import { sortByCode } from '../V3/helpers/utils'; export class ItemListsV1 implements INodeType { description: INodeTypeDescription; @@ -1369,36 +1367,7 @@ return 0;`, return result; }); } else { - const code = this.getNodeParameter('code', 0) as string; - const regexCheck = /\breturn\b/g.exec(code); - - if (regexCheck?.length) { - const sandbox = { - newItems, - }; - const mode = this.getMode(); - const options = { - console: mode === 'manual' ? 'redirect' : 'inherit', - sandbox, - }; - const vm = new NodeVM(options as unknown as NodeVMOptions); - - newItems = await vm.run( - ` - module.exports = async function() { - newItems.sort( (a,b) => { - ${code} - }) - return newItems; - }()`, - __dirname, - ); - } else { - throw new NodeOperationError( - this.getNode(), - "Sort code doesn't return. Please add a 'return' statement to your code", - ); - } + newItems = sortByCode.call(this, newItems); } return this.prepareOutputData(newItems); } else if (operation === 'limit') { diff --git a/packages/nodes-base/nodes/ItemLists/V2/ItemListsV2.node.ts b/packages/nodes-base/nodes/ItemLists/V2/ItemListsV2.node.ts index d2d952218f..23c14a156f 100644 --- a/packages/nodes-base/nodes/ItemLists/V2/ItemListsV2.node.ts +++ b/packages/nodes-base/nodes/ItemLists/V2/ItemListsV2.node.ts @@ -1,6 +1,3 @@ -import type { NodeVMOptions } from 'vm2'; -import { NodeVM } from 'vm2'; - import type { IDataObject, IExecuteFunctions, @@ -61,6 +58,7 @@ const shuffleArray = (array: any[]) => { }; import * as summarize from './summarize.operation'; +import { sortByCode } from '../V3/helpers/utils'; export class ItemListsV2 implements INodeType { description: INodeTypeDescription; @@ -1409,36 +1407,7 @@ return 0;`, return result; }); } else { - const code = this.getNodeParameter('code', 0) as string; - const regexCheck = /\breturn\b/g.exec(code); - - if (regexCheck?.length) { - const sandbox = { - newItems, - }; - const mode = this.getMode(); - const options = { - console: mode === 'manual' ? 'redirect' : 'inherit', - sandbox, - }; - const vm = new NodeVM(options as unknown as NodeVMOptions); - - newItems = await vm.run( - ` - module.exports = async function() { - newItems.sort( (a,b) => { - ${code} - }) - return newItems; - }()`, - __dirname, - ); - } else { - throw new NodeOperationError( - this.getNode(), - "Sort code doesn't return. Please add a 'return' statement to your code", - ); - } + newItems = sortByCode.call(this, newItems); } return this.prepareOutputData(newItems); } else if (operation === 'limit') { diff --git a/packages/nodes-base/nodes/ItemLists/V3/actions/itemList/sort.operation.ts b/packages/nodes-base/nodes/ItemLists/V3/actions/itemList/sort.operation.ts index 6d497253d8..fc67372aa3 100644 --- a/packages/nodes-base/nodes/ItemLists/V3/actions/itemList/sort.operation.ts +++ b/packages/nodes-base/nodes/ItemLists/V3/actions/itemList/sort.operation.ts @@ -7,15 +7,12 @@ import type { import { NodeOperationError } from 'n8n-workflow'; import { updateDisplayOptions } from '@utils/utilities'; -import type { NodeVMOptions } from 'vm2'; -import { NodeVM } from 'vm2'; - import get from 'lodash/get'; import isEqual from 'lodash/isEqual'; import lt from 'lodash/lt'; -import { shuffleArray } from '../../helpers/utils'; +import { shuffleArray, sortByCode } from '../../helpers/utils'; import { disableDotNotationBoolean } from '../common.descriptions'; const properties: INodeProperties[] = [ @@ -272,36 +269,7 @@ export async function execute( return result; }); } else { - const code = this.getNodeParameter('code', 0) as string; - const regexCheck = /\breturn\b/g.exec(code); - - if (regexCheck?.length) { - const sandbox = { - newItems: returnData, - }; - const mode = this.getMode(); - const options = { - console: mode === 'manual' ? 'redirect' : 'inherit', - sandbox, - }; - const vm = new NodeVM(options as unknown as NodeVMOptions); - - returnData = await vm.run( - ` - module.exports = async function() { - newItems.sort( (a,b) => { - ${code} - }) - return newItems; - }()`, - __dirname, - ); - } else { - throw new NodeOperationError( - this.getNode(), - "Sort code doesn't return. Please add a 'return' statement to your code", - ); - } + returnData = sortByCode.call(this, returnData); } return returnData; } diff --git a/packages/nodes-base/nodes/ItemLists/V3/helpers/utils.ts b/packages/nodes-base/nodes/ItemLists/V3/helpers/utils.ts index 60600eb8d6..500cbc3840 100644 --- a/packages/nodes-base/nodes/ItemLists/V3/helpers/utils.ts +++ b/packages/nodes-base/nodes/ItemLists/V3/helpers/utils.ts @@ -1,4 +1,11 @@ -import type { IDataObject, INode, INodeExecutionData } from 'n8n-workflow'; +import { NodeVM } from 'vm2'; +import { + NodeOperationError, + type IDataObject, + type IExecuteFunctions, + type INode, + type INodeExecutionData, +} from 'n8n-workflow'; import get from 'lodash/get'; import isEqual from 'lodash/isEqual'; @@ -57,3 +64,26 @@ export const prepareFieldsArray = (fields: string | string[], fieldName = 'Field `The \'${fieldName}\' parameter must be a string of fields separated by commas or an array of strings.`, ); }; + +const returnRegExp = /\breturn\b/g; + +export function sortByCode( + this: IExecuteFunctions, + items: INodeExecutionData[], +): INodeExecutionData[] { + const code = this.getNodeParameter('code', 0) as string; + if (!returnRegExp.test(code)) { + throw new NodeOperationError( + this.getNode(), + "Sort code doesn't return. Please add a 'return' statement to your code", + ); + } + + const mode = this.getMode(); + const vm = new NodeVM({ + console: mode === 'manual' ? 'redirect' : 'inherit', + sandbox: { items }, + }); + + return vm.run(`module.exports = items.sort((a, b) => { ${code} })`); +}