#!/usr/bin/env node const path = require('path'); // Make sure that it also find the config folder when it // did get started from another folder that the root one. process.env.NODE_CONFIG_DIR = process.env.NODE_CONFIG_DIR || path.join(__dirname, 'config'); // Check if version should be displayed const versionFlags = ['-v', '-V', '--version']; if (versionFlags.includes(process.argv.slice(-1)[0])) { console.log(require('../package').version); process.exit(0); } if (process.argv.length === 2) { // When no command is given choose by default start process.argv.push('start'); } const nodeVersion = process.versions.node; const { major, gte } = require('semver'); const MINIMUM_SUPPORTED_NODE_VERSION = '18.17.0'; const ENFORCE_MIN_NODE_VERSION = process.env.E2E_TESTS !== 'true'; if ( (ENFORCE_MIN_NODE_VERSION && !gte(nodeVersion, MINIMUM_SUPPORTED_NODE_VERSION)) || ![18, 20, 22].includes(major(nodeVersion)) ) { console.log(` Your Node.js version ${nodeVersion} is currently not supported by n8n. Please use Node.js v${MINIMUM_SUPPORTED_NODE_VERSION} (recommended), v20, or v22 instead! `); process.exit(1); } // Disable nodejs custom inspection across the app const { inspect } = require('util'); inspect.defaultOptions.customInspect = false; require('express-async-errors'); require('source-map-support').install(); require('reflect-metadata'); if (process.env.NODEJS_PREFER_IPV4 === 'true') { require('dns').setDefaultResultOrder('ipv4first'); } // Node.js 20 enabled a Happy Eyeballs algorithm which enables support // for both IPv6 and IPv4 at the same time, favoring IPv6 when possible. // However there are some issues in the algorithm implementation that is causing // issues to our users with services like Telegram or Airtable. This restores the // behavior to pre v20 // More details: https://github.com/nodejs/node/issues/48145 require('net').setDefaultAutoSelectFamily?.(false); // WebCrypto Polyfill for older versions of Node.js 18 if (!globalThis.crypto?.getRandomValues) { globalThis.crypto = require('node:crypto').webcrypto; } (async () => { const oclif = await import('@oclif/core'); await oclif.execute({ dir: __dirname }); })();