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 ad49533847..f654216b5a 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 @@ -1,4 +1,4 @@ -import type { CodeExecutionMode, IDataObject, WorkflowExecuteMode } from 'n8n-workflow'; +import type { CodeExecutionMode, IDataObject } from 'n8n-workflow'; import { ValidationError } from '@/js-task-runner/errors/validation-error'; import { @@ -31,30 +31,13 @@ describe('JsTaskRunner', () => { }); describe('console', () => { - test.each<[CodeExecutionMode, WorkflowExecuteMode]>([ - ['runOnceForAllItems', 'cli'], - ['runOnceForAllItems', 'error'], - ['runOnceForAllItems', 'integrated'], - ['runOnceForAllItems', 'internal'], - ['runOnceForAllItems', 'retry'], - ['runOnceForAllItems', 'trigger'], - ['runOnceForAllItems', 'webhook'], - ['runOnceForEachItem', 'cli'], - ['runOnceForEachItem', 'error'], - ['runOnceForEachItem', 'integrated'], - ['runOnceForEachItem', 'internal'], - ['runOnceForEachItem', 'retry'], - ['runOnceForEachItem', 'trigger'], - ['runOnceForEachItem', 'webhook'], - ])( - 'should make an rpc call for console log in %s mode when workflow mode is %s', - async (nodeMode, workflowMode) => { - jest.spyOn(console, 'log').mockImplementation(() => {}); + test.each<[CodeExecutionMode]>([['runOnceForAllItems'], ['runOnceForEachItem']])( + 'should make an rpc call for console log in %s mode', + async (nodeMode) => { jest.spyOn(jsTaskRunner, 'makeRpcCall').mockResolvedValue(undefined); const task = newTaskWithSettings({ code: "console.log('Hello', 'world!'); return {}", nodeMode, - workflowMode, }); await execTaskWithParams({ @@ -62,34 +45,11 @@ describe('JsTaskRunner', () => { taskData: newAllCodeTaskData([wrapIntoJson({})]), }); - expect(console.log).toHaveBeenCalledWith('[JS Code]', 'Hello world!'); expect(jsTaskRunner.makeRpcCall).toHaveBeenCalledWith(task.taskId, 'logNodeOutput', [ 'Hello world!', ]); }, ); - - test.each<[CodeExecutionMode, WorkflowExecuteMode]>([ - ['runOnceForAllItems', 'manual'], - ['runOnceForEachItem', 'manual'], - ])( - "shouldn't make an rpc call for console log in %s mode when workflow mode is %s", - async (nodeMode, workflowMode) => { - jest.spyOn(jsTaskRunner, 'makeRpcCall').mockResolvedValue(undefined); - const task = newTaskWithSettings({ - code: "console.log('Hello', 'world!'); return {}", - nodeMode, - workflowMode, - }); - - await execTaskWithParams({ - task, - taskData: newAllCodeTaskData([wrapIntoJson({})]), - }); - - expect(jsTaskRunner.makeRpcCall).not.toHaveBeenCalled(); - }, - ); }); describe('runOnceForAllItems', () => { 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 1aee9dbb78..907569eb6e 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 @@ -74,8 +74,6 @@ type CustomConsole = { log: (...args: unknown[]) => void; }; -const noop = () => {}; - export class JsTaskRunner extends TaskRunner { constructor( taskType: string, @@ -110,16 +108,14 @@ export class JsTaskRunner extends TaskRunner { }); const customConsole = { - log: - settings.workflowMode === 'manual' - ? noop - : (...args: unknown[]) => { - const logOutput = args - .map((arg) => (typeof arg === 'object' && arg !== null ? JSON.stringify(arg) : arg)) - .join(' '); - console.log('[JS Code]', logOutput); - void this.makeRpcCall(task.taskId, 'logNodeOutput', [logOutput]); - }, + // 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[]) => { + const logOutput = args + .map((arg) => (typeof arg === 'object' && arg !== null ? JSON.stringify(arg) : arg)) + .join(' '); + void this.makeRpcCall(task.taskId, 'logNodeOutput', [logOutput]); + }, }; const result =