refactor(Item Lists Node): Delete duplicate code for sorting via code (no-changelog) (#7019)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™ 2023-08-25 15:46:37 +02:00 committed by GitHub
parent d6e1cf232f
commit f02f6b659a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 101 deletions

View file

@ -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') {

View file

@ -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') {

View file

@ -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;
}

View file

@ -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} })`);
}