import type { IDataObject } from 'n8n-workflow'; export function isObject(maybe: unknown): maybe is { [key: string]: unknown } { return typeof maybe === 'object' && maybe !== null && !Array.isArray(maybe); } function isTraversable(maybe: unknown): maybe is IDataObject { return isObject(maybe) && typeof maybe.toJSON !== 'function' && Object.keys(maybe).length > 0; } /** * Stringify any non-standard JS objects (e.g. `Date`, `RegExp`) inside output items at any depth. */ export function standardizeOutput(output: IDataObject) { for (const [key, value] of Object.entries(output)) { if (!isTraversable(value)) continue; output[key] = value.constructor.name !== 'Object' ? JSON.stringify(value) // Date, RegExp, etc. : standardizeOutput(value); } return output; } export type CodeNodeMode = 'runOnceForAllItems' | 'runOnceForEachItem'; export const REQUIRED_N8N_ITEM_KEYS = new Set(['json', 'binary', 'pairedItem']);