Skip to content

Commit

Permalink
refactor(Item Lists Node): Delete duplicate code for sorting via code…
Browse files Browse the repository at this point in the history
… (no-changelog) (#7019)
  • Loading branch information
netroy authored Aug 25, 2023
1 parent d6e1cf2 commit f02f6b6
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 101 deletions.
35 changes: 2 additions & 33 deletions packages/nodes-base/nodes/ItemLists/V1/ItemListsV1.node.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import type { NodeVMOptions } from 'vm2';
import { NodeVM } from 'vm2';

import type {
IDataObject,
IExecuteFunctions,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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') {
Expand Down
35 changes: 2 additions & 33 deletions packages/nodes-base/nodes/ItemLists/V2/ItemListsV2.node.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import type { NodeVMOptions } from 'vm2';
import { NodeVM } from 'vm2';

import type {
IDataObject,
IExecuteFunctions,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = [
Expand Down Expand Up @@ -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;
}
32 changes: 31 additions & 1 deletion packages/nodes-base/nodes/ItemLists/V3/helpers/utils.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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} })`);
}

0 comments on commit f02f6b6

Please sign in to comment.