first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
@@ -0,0 +1,5 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.9531 13.1978C29.5276 13.1978 30.5729 16.3264 30.5729 18.9009V26.7394C30.5729 32.5499 25.8626 37.2603 20.052 37.2603C14.2416 37.2603 9.53125 32.5499 9.53125 26.7394V18.9009C9.53125 16.3264 10.5766 13.1978 13.151 13.1978H26.9531Z" fill="#F4A026"/>
<path d="M24.1406 15.802H15.9635C14.4822 15.802 13.2812 14.6011 13.2812 13.1198C13.2812 9.99883 15.8113 7.46875 18.9323 7.46875H21.1719C24.2928 7.46875 26.8229 9.99883 26.8229 13.1198C26.8229 14.6011 25.622 15.802 24.1406 15.802Z" fill="#CA463D"/>
<path d="M38.9584 22.8594H31.5625V18.901C31.5625 18.8216 31.587 18.742 31.5852 18.6623C35.3437 18.2703 37.5 15.7973 37.5 11.7395V10.802C37.5 10.2267 37.0335 9.76039 36.4584 9.76039C35.8832 9.76039 35.4167 10.2267 35.4167 10.802V11.7395C35.4167 14.7395 34.0882 16.3349 31.3632 16.5963C30.8891 14.485 29.7323 12.6603 27.8056 12.2448C27.513 10.0151 26.1327 8.12844 24.2029 7.14891C25.0092 6.32852 25.5209 5.20461 25.5209 3.96609V3.04164C25.5209 2.46633 25.0545 2 24.4793 2C23.9041 2 23.4375 2.46633 23.4375 3.04164V3.96609C23.4375 5.32313 22.3075 6.40102 20.9505 6.40102H19.1537C17.7967 6.40102 16.6667 5.32313 16.6667 3.96609V3.04164C16.6667 2.46633 16.2002 2 15.6251 2C15.0499 2 14.5834 2.46633 14.5834 3.04164V3.96609C14.5834 5.20461 15.095 6.32852 15.9014 7.14898C13.9716 8.12844 12.5848 10.0152 12.2921 12.2448C10.3628 12.6608 9.20891 14.4898 8.73594 16.6048C5.94227 16.3736 4.58336 14.7765 4.58336 11.7395V10.802C4.58336 10.2267 4.11687 9.76039 3.54172 9.76039C2.96656 9.76039 2.5 10.2267 2.5 10.802V11.7395C2.5 15.8345 4.64367 18.3152 8.4668 18.6723C8.46508 18.7485 8.4375 18.8248 8.4375 18.901V22.8594H1.04164C0.466484 22.8594 0 23.3257 0 23.901C0 24.4763 0.466484 24.9427 1.04164 24.9427H8.4375V26.7395C8.4375 27.5698 8.55227 28.3796 8.71937 29.1608C4.73898 29.4305 2.5 31.9302 2.5 36.1145V37.052C2.5 37.6273 2.96648 38.0937 3.54164 38.0937C4.1168 38.0937 4.58328 37.6273 4.58328 37.052V36.1145C4.58328 32.8493 6.15758 31.248 9.39305 31.2201C11.147 35.377 15.2642 38.302 20.052 38.302C24.8392 38.302 28.956 35.3777 30.7102 31.2216C33.8758 31.2829 35.4166 32.8844 35.4166 36.1145V37.052C35.4166 37.6273 35.883 38.0937 36.4582 38.0937C37.0334 38.0937 37.5 37.6273 37.5 37.052V36.1145C37.5 31.9661 35.2482 29.4729 31.3313 29.1676C31.4993 28.3844 31.5625 27.5722 31.5625 26.7395V24.9427H38.9584C39.5336 24.9427 40 24.4763 40 23.901C40 23.3257 39.5335 22.8594 38.9584 22.8594ZM18.9323 8.48438H21.1719C23.7134 8.48438 25.7813 10.5522 25.7813 13.0938C25.7813 13.9984 25.0453 14.7344 24.1406 14.7344H15.9635C15.0588 14.7344 14.3229 13.9984 14.3229 13.0938C14.3229 10.5522 16.3907 8.48438 18.9323 8.48438ZM10.5209 26.7395V18.901C10.5209 17.2766 11.0637 14.9533 12.4336 14.367C12.9513 15.802 14.3523 16.8177 15.9636 16.8177H18.9584V36.1552C14.2448 35.6113 10.5209 31.5964 10.5209 26.7395ZM21.0416 36.1672V16.8177H24.1406C25.7519 16.8177 27.1009 15.802 27.6185 14.367C28.9884 14.9533 29.4791 17.2765 29.4791 18.901V26.7395C29.4791 31.6323 25.8052 35.6708 21.0416 36.1672Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -0,0 +1,14 @@
{
"node": "n8n-nodes-base.debughelper",
"nodeVersion": "1.0",
"codexVersion": "1.0",
"categories": ["Development"],
"resources": {
"primaryDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.debughelper/"
}
]
},
"alias": ["Mock", "Sample", "Demo", "Test", "Throw error", "OOM", "Out of Memory", "placeholder"]
}
@@ -0,0 +1,379 @@
import { setSeed, array as mfArray } from 'minifaker';
import type {
IExecuteFunctions,
INodeExecutionData,
INodeType,
INodeTypeDescription,
} from 'n8n-workflow';
import {
ApplicationError,
NodeApiError,
NodeConnectionTypes,
NodeOperationError,
} from 'n8n-workflow';
import { generateGarbageMemory, runGarbageCollector } from './functions';
import {
generateCreditCard,
generateIPv4,
generateIPv6,
generateLocation,
generateMAC,
generateNanoid,
generateRandomAddress,
generateRandomEmail,
generateRandomUser,
generateURL,
generateUUID,
generateVersion,
} from './randomData';
export class DebugHelper implements INodeType {
description: INodeTypeDescription = {
displayName: 'DebugHelper',
name: 'debugHelper',
icon: { light: 'file:DebugHelper.svg', dark: 'file:DebugHelper.dark.svg' },
group: ['output'],
subtitle: '={{$parameter["category"]}}',
description: 'Causes problems intentionally and generates useful data for debugging',
version: 1,
defaults: {
name: 'DebugHelper',
},
inputs: [NodeConnectionTypes.Main],
outputs: [NodeConnectionTypes.Main],
credentials: [],
properties: [
{
displayName: 'Category',
name: 'category',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Do Nothing',
value: 'doNothing',
description: 'Does nothing',
},
{
name: 'Throw Error',
value: 'throwError',
description: 'Throws an error with the specified type and message',
},
{
name: 'Out Of Memory',
value: 'oom',
description: 'Generates a large amount of memory to cause an out of memory error',
},
{
name: 'Generate Random Data',
value: 'randomData',
description: 'Generates random data sets',
},
],
default: 'throwError',
},
{
displayName: 'Error Type',
name: 'throwErrorType',
type: 'options',
noDataExpression: true,
options: [
{
name: 'NodeApiError',
value: 'NodeApiError',
},
{
name: 'NodeOperationError',
value: 'NodeOperationError',
},
{
name: 'Error',
value: 'Error',
},
],
default: 'NodeApiError',
displayOptions: {
show: {
category: ['throwError'],
},
},
},
{
displayName: 'Error Message',
name: 'throwErrorMessage',
type: 'string',
default: 'Node has thrown an error',
description: 'The message to send as part of the error',
displayOptions: {
show: {
category: ['throwError'],
},
},
},
{
displayName: 'Memory Size to Generate',
name: 'memorySizeValue',
type: 'number',
default: 10,
description: 'The approximate amount of memory to generate. Be generous...',
displayOptions: {
show: {
category: ['oom'],
},
},
},
{
displayName: 'Data Type',
name: 'randomDataType',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Address',
value: 'address',
},
{
name: 'Coordinates',
value: 'latLong',
},
{
name: 'Credit Card',
value: 'creditCard',
},
{
name: 'Email',
value: 'email',
},
{
name: 'IPv4',
value: 'ipv4',
},
{
name: 'IPv6',
value: 'ipv6',
},
{
name: 'MAC',
value: 'macAddress',
},
{
name: 'NanoIds',
value: 'nanoid',
},
{
name: 'URL',
value: 'url',
},
{
name: 'User Data',
value: 'user',
},
{
name: 'UUID',
value: 'uuid',
},
{
name: 'Version',
value: 'semver',
},
],
default: 'user',
displayOptions: {
show: {
category: ['randomData'],
},
},
},
{
displayName: 'NanoId Alphabet',
name: 'nanoidAlphabet',
type: 'string',
default: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
description: 'The alphabet to use for generating the nanoIds',
displayOptions: {
show: {
category: ['randomData'],
randomDataType: ['nanoid'],
},
},
},
{
displayName: 'NanoId Length',
name: 'nanoidLength',
type: 'string',
default: '16',
description: 'The length of each nanoIds',
displayOptions: {
show: {
category: ['randomData'],
randomDataType: ['nanoid'],
},
},
},
{
displayName: 'Seed',
name: 'randomDataSeed',
type: 'string',
default: '',
placeholder: 'Leave empty for random seed',
description:
'If set, seed to use for generating the data (same seed will generate the same data)',
displayOptions: {
show: {
category: ['randomData'],
},
},
},
{
displayName: 'Number of Items to Generate',
name: 'randomDataCount',
type: 'number',
default: 10,
description: 'The number of random data items to generate into an array',
displayOptions: {
show: {
category: ['randomData'],
},
},
},
{
displayName: 'Output as Single Array',
name: 'randomDataSingleArray',
type: 'boolean',
default: false,
description: 'Whether to output a single array instead of multiple items',
displayOptions: {
show: {
category: ['randomData'],
},
},
},
],
};
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
const items = this.getInputData();
const returnData: INodeExecutionData[] = [];
const category = this.getNodeParameter('category', 0) as string;
for (let i = 0; i < items.length; i++) {
try {
switch (category) {
case 'doNothing':
// as it says on the tin...
break;
case 'throwError':
const throwErrorType = this.getNodeParameter('throwErrorType', 0) as string;
const throwErrorMessage = this.getNodeParameter('throwErrorMessage', 0) as string;
switch (throwErrorType) {
case 'NodeApiError':
throw new NodeApiError(
this.getNode(),
{ message: throwErrorMessage },
{ message: throwErrorMessage },
);
case 'NodeOperationError':
throw new NodeOperationError(this.getNode(), throwErrorMessage, {
message: throwErrorMessage,
});
case 'Error':
throw new ApplicationError(throwErrorMessage);
default:
break;
}
case 'oom':
const memorySizeValue = this.getNodeParameter('memorySizeValue', 0) as number;
runGarbageCollector();
const memUsed = generateGarbageMemory(memorySizeValue);
items[i].json = memUsed;
returnData.push(items[i]);
break;
case 'randomData':
const randomDataType = this.getNodeParameter('randomDataType', 0) as string;
const randomDataCount = this.getNodeParameter('randomDataCount', 0) as number;
const randomDataSeed = this.getNodeParameter('randomDataSeed', 0) as string;
const randomDataSingleArray = this.getNodeParameter(
'randomDataSingleArray',
0,
) as boolean;
const newItem: INodeExecutionData = {
json: {},
pairedItem: { item: i },
};
if (randomDataSeed !== '') {
setSeed(randomDataSeed);
}
let randomFn: () => any = generateRandomUser;
switch (randomDataType) {
case 'user':
randomFn = generateRandomUser;
break;
case 'email':
randomFn = generateRandomEmail;
break;
case 'address':
randomFn = generateRandomAddress;
break;
case 'creditCard':
randomFn = generateCreditCard;
break;
case 'uuid':
randomFn = generateUUID;
break;
case 'macAddress':
randomFn = generateMAC;
break;
case 'ipv4':
randomFn = generateIPv4;
break;
case 'ipv6':
randomFn = generateIPv6;
break;
case 'latLong':
randomFn = generateLocation;
break;
case 'semver':
randomFn = generateVersion;
break;
case 'url':
randomFn = generateURL;
break;
case 'nanoid':
const nanoidAlphabet = this.getNodeParameter('nanoidAlphabet', 0) as string;
const nanoidLength = this.getNodeParameter('nanoidLength', 0) as string;
randomFn = () => generateNanoid(nanoidAlphabet, nanoidLength);
break;
}
const generatedItems = mfArray(randomDataCount, randomFn);
if (randomDataSingleArray) {
newItem.json = { generatedItems };
returnData.push(newItem);
} else {
for (const generatedItem of generatedItems) {
returnData.push({
json: generatedItem,
pairedItem: { item: i },
});
}
}
break;
default:
break;
}
} catch (error) {
if (this.continueOnFail()) {
const executionErrorData = this.helpers.constructExecutionMetaData(
this.helpers.returnJsonArray({ error: error.message }),
{ itemData: { item: i } },
);
returnData.push(...executionErrorData);
continue;
}
throw error;
}
}
return [returnData];
}
}
@@ -0,0 +1,5 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.9531 13.1978C29.5276 13.1978 30.5729 16.3264 30.5729 18.9009V26.7394C30.5729 32.5499 25.8626 37.2603 20.052 37.2603C14.2416 37.2603 9.53125 32.5499 9.53125 26.7394V18.9009C9.53125 16.3264 10.5766 13.1978 13.151 13.1978H26.9531Z" fill="#F4A026"/>
<path d="M24.1406 15.802H15.9635C14.4822 15.802 13.2812 14.6011 13.2812 13.1198C13.2812 9.99883 15.8113 7.46875 18.9323 7.46875H21.1719C24.2928 7.46875 26.8229 9.99883 26.8229 13.1198C26.8229 14.6011 25.622 15.802 24.1406 15.802Z" fill="#CA463D"/>
<path d="M38.9584 22.8594H31.5625V18.901C31.5625 18.8216 31.587 18.742 31.5852 18.6623C35.3437 18.2703 37.5 15.7973 37.5 11.7395V10.802C37.5 10.2267 37.0335 9.76039 36.4584 9.76039C35.8832 9.76039 35.4167 10.2267 35.4167 10.802V11.7395C35.4167 14.7395 34.0882 16.3349 31.3632 16.5963C30.8891 14.485 29.7323 12.6603 27.8056 12.2448C27.513 10.0151 26.1327 8.12844 24.2029 7.14891C25.0092 6.32852 25.5209 5.20461 25.5209 3.96609V3.04164C25.5209 2.46633 25.0545 2 24.4793 2C23.9041 2 23.4375 2.46633 23.4375 3.04164V3.96609C23.4375 5.32313 22.3075 6.40102 20.9505 6.40102H19.1537C17.7967 6.40102 16.6667 5.32313 16.6667 3.96609V3.04164C16.6667 2.46633 16.2002 2 15.6251 2C15.0499 2 14.5834 2.46633 14.5834 3.04164V3.96609C14.5834 5.20461 15.095 6.32852 15.9014 7.14898C13.9716 8.12844 12.5848 10.0152 12.2921 12.2448C10.3628 12.6608 9.20891 14.4898 8.73594 16.6048C5.94227 16.3736 4.58336 14.7765 4.58336 11.7395V10.802C4.58336 10.2267 4.11687 9.76039 3.54172 9.76039C2.96656 9.76039 2.5 10.2267 2.5 10.802V11.7395C2.5 15.8345 4.64367 18.3152 8.4668 18.6723C8.46508 18.7485 8.4375 18.8248 8.4375 18.901V22.8594H1.04164C0.466484 22.8594 0 23.3257 0 23.901C0 24.4763 0.466484 24.9427 1.04164 24.9427H8.4375V26.7395C8.4375 27.5698 8.55227 28.3796 8.71937 29.1608C4.73898 29.4305 2.5 31.9302 2.5 36.1145V37.052C2.5 37.6273 2.96648 38.0937 3.54164 38.0937C4.1168 38.0937 4.58328 37.6273 4.58328 37.052V36.1145C4.58328 32.8493 6.15758 31.248 9.39305 31.2201C11.147 35.377 15.2642 38.302 20.052 38.302C24.8392 38.302 28.956 35.3777 30.7102 31.2216C33.8758 31.2829 35.4166 32.8844 35.4166 36.1145V37.052C35.4166 37.6273 35.883 38.0937 36.4582 38.0937C37.0334 38.0937 37.5 37.6273 37.5 37.052V36.1145C37.5 31.9661 35.2482 29.4729 31.3313 29.1676C31.4993 28.3844 31.5625 27.5722 31.5625 26.7395V24.9427H38.9584C39.5336 24.9427 40 24.4763 40 23.901C40 23.3257 39.5335 22.8594 38.9584 22.8594ZM18.9323 8.48438H21.1719C23.7134 8.48438 25.7813 10.5522 25.7813 13.0938C25.7813 13.9984 25.0453 14.7344 24.1406 14.7344H15.9635C15.0588 14.7344 14.3229 13.9984 14.3229 13.0938C14.3229 10.5522 16.3907 8.48438 18.9323 8.48438ZM10.5209 26.7395V18.901C10.5209 17.2766 11.0637 14.9533 12.4336 14.367C12.9513 15.802 14.3523 16.8177 15.9636 16.8177H18.9584V36.1552C14.2448 35.6113 10.5209 31.5964 10.5209 26.7395ZM21.0416 36.1672V16.8177H24.1406C25.7519 16.8177 27.1009 15.802 27.6185 14.367C28.9884 14.9533 29.4791 17.2765 29.4791 18.901V26.7395C29.4791 31.6323 25.8052 35.6708 21.0416 36.1672Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -0,0 +1,27 @@
import { setFlagsFromString } from 'v8';
import { runInNewContext } from 'vm';
export const runGarbageCollector = () => {
try {
setFlagsFromString('--expose_gc');
const gc = runInNewContext('gc'); // nocommit
gc();
} catch (error) {
console.error(error);
}
};
export const generateGarbageMemory = (sizeInMB: number, onHeap = true) => {
const divider = onHeap ? 8 : 1;
const size = Math.max(1, Math.floor((sizeInMB * 1024 * 1024) / divider));
if (onHeap) {
// arrays are allocated on the heap
// size in this case is only an approximation...
const array = Array(size);
array.fill(0);
} else {
const array = new Uint8Array(size);
array.fill(0);
}
return { ...process.memoryUsage() };
};
@@ -0,0 +1,101 @@
import {
firstName,
lastName,
streetAddress,
cityName,
zipCode,
state,
country,
password,
creditCardNumber,
creditCardCVV,
email,
boolean,
uuid,
nanoId,
domainUrl,
semver,
latLong,
macAddress,
ip,
ipv6,
number,
} from 'minifaker';
import 'minifaker/locales/en';
export function generateRandomUser() {
return {
uid: uuid.v4(),
email: email(),
firstname: firstName(),
lastname: lastName(),
password: password(),
};
}
export function generateRandomAddress() {
return {
firstname: firstName(),
lastname: lastName(),
street: streetAddress(),
city: cityName(),
zip: zipCode({ format: '#####' }),
state: state(),
country: country(),
};
}
export function generateRandomEmail() {
return {
email: email(),
confirmed: boolean(),
};
}
export function generateUUID() {
return { uuid: uuid.v4() };
}
export function generateNanoid(customAlphabet: string, length: string) {
return { nanoId: nanoId.customAlphabet(customAlphabet, parseInt(length, 10))().toString() };
}
export function generateCreditCard() {
return {
type: boolean() ? 'MasterCard' : 'Visa',
number: creditCardNumber(),
ccv: creditCardCVV(),
exp: `${number({ min: 1, max: 12, float: false }).toString().padStart(2, '0')}/${number({
min: 1,
max: 40,
float: false,
})
.toString()
.padStart(2, '0')}`,
holder_name: `${firstName()} ${lastName()}`,
};
}
export function generateURL() {
return { url: domainUrl() };
}
export function generateIPv4() {
return { ip: ip() };
}
export function generateIPv6() {
return { ipv6: ipv6() };
}
export function generateMAC() {
return { mac: macAddress() };
}
export function generateLocation() {
return { location: latLong() };
}
export function generateVersion() {
return { version: semver() };
}
@@ -0,0 +1,5 @@
import { NodeTestHarness } from '@nodes-testing/node-test-harness';
describe('Test DebugHelper Node', () => {
new NodeTestHarness().setupTests();
});
@@ -0,0 +1,64 @@
{
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [-448, 192],
"id": "9f62b838-ecbe-4012-8026-9e3d48669c49",
"name": "When clicking Execute workflow"
},
{
"parameters": {},
"type": "n8n-nodes-base.debugHelper",
"typeVersion": 1,
"position": [-224, 192],
"id": "7d381110-e62e-4911-8527-e6265fe4be11",
"name": "DebugHelper",
"onError": "continueErrorOutput"
},
{
"parameters": {},
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [0, 192],
"id": "0a6ef4ec-3876-4d99-998e-9ba26ca474b5",
"name": "No Operation, do nothing"
}
],
"connections": {
"When clicking Execute workflow": {
"main": [
[
{
"node": "DebugHelper",
"type": "main",
"index": 0
}
]
]
},
"DebugHelper": {
"main": [
[],
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {
"No Operation, do nothing": [
{
"error": "Node has thrown an error"
}
]
},
"meta": {
"instanceId": "27cc9b56542ad45b38725555722c50a1c3fee1670bbb67980558314ee08517c4"
}
}