From 061297a29d62f3846bd9899dd371bd15fc502314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 11 Dec 2024 17:38:40 +0100 Subject: [PATCH 1/2] fix(core): Ensure runners do not throw on unsupported console methods --- .../__tests__/js-task-runner.test.ts | 30 +++++++++++++++++++ .../src/js-task-runner/js-task-runner.ts | 15 ++++++++++ 2 files changed, 45 insertions(+) diff --git a/packages/@n8n/task-runner/src/js-task-runner/__tests__/js-task-runner.test.ts b/packages/@n8n/task-runner/src/js-task-runner/__tests__/js-task-runner.test.ts index e53d246fcb6ae..ca6efb64728ec 100644 --- a/packages/@n8n/task-runner/src/js-task-runner/__tests__/js-task-runner.test.ts +++ b/packages/@n8n/task-runner/src/js-task-runner/__tests__/js-task-runner.test.ts @@ -136,6 +136,36 @@ describe('JsTaskRunner', () => { ]); }, ); + + it('should not throw when using unsupported console methods', async () => { + const task = newTaskWithSettings({ + code: ` + console.warn('test'); + console.error('test'); + console.info('test'); + console.debug('test'); + console.trace('test'); + console.dir({}); + console.time('test'); + console.timeEnd('test'); + console.timeLog('test'); + console.assert(true); + console.clear(); + console.group('test'); + console.groupEnd(); + console.table([]); + return {json: {}} + `, + nodeMode: 'runOnceForAllItems', + }); + + await expect( + execTaskWithParams({ + task, + taskData: newDataRequestResponse([wrapIntoJson({})]), + }), + ).resolves.toBeDefined(); + }); }); describe('built-in methods and variables available in the context', () => { diff --git a/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts b/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts index cbc1b4d832a5a..5125d93b8db4a 100644 --- a/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts +++ b/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts @@ -130,6 +130,21 @@ export class JsTaskRunner extends TaskRunner { .join(' '); void this.makeRpcCall(task.taskId, 'logNodeOutput', [logOutput]); }, + // dummy methods to disregard without throwing, following existing Code node behavior + warn: () => {}, + error: () => {}, + info: () => {}, + debug: () => {}, + trace: () => {}, + dir: () => {}, + time: () => {}, + timeEnd: () => {}, + timeLog: () => {}, + assert: () => {}, + clear: () => {}, + group: () => {}, + groupEnd: () => {}, + table: () => {}, }; const result = From 74f3cb6357ea612b8fffff99a166437e5b919b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Wed, 11 Dec 2024 18:04:46 +0100 Subject: [PATCH 2/2] Apply nice suggestion --- .../src/js-task-runner/js-task-runner.ts | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts b/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts index 5125d93b8db4a..6f2d8b1f6974f 100644 --- a/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts +++ b/packages/@n8n/task-runner/src/js-task-runner/js-task-runner.ts @@ -121,7 +121,13 @@ export class JsTaskRunner extends TaskRunner { nodeTypes: this.nodeTypes, }); + const noOp = () => {}; const customConsole = { + // all except `log` are dummy methods that disregard without throwing, following existing Code node behavior + ...Object.keys(console).reduce void>>((acc, name) => { + acc[name] = noOp; + return acc; + }, {}), // Send log output back to the main process. It will take care of forwarding // it to the UI or printing to console. log: (...args: unknown[]) => { @@ -130,21 +136,6 @@ export class JsTaskRunner extends TaskRunner { .join(' '); void this.makeRpcCall(task.taskId, 'logNodeOutput', [logOutput]); }, - // dummy methods to disregard without throwing, following existing Code node behavior - warn: () => {}, - error: () => {}, - info: () => {}, - debug: () => {}, - trace: () => {}, - dir: () => {}, - time: () => {}, - timeEnd: () => {}, - timeLog: () => {}, - assert: () => {}, - clear: () => {}, - group: () => {}, - groupEnd: () => {}, - table: () => {}, }; const result =