diff --git a/packages/cli/src/databases/entities/WorkflowEntity.ts b/packages/cli/src/databases/entities/WorkflowEntity.ts index ffbe194fb72e9..484c334f2b451 100644 --- a/packages/cli/src/databases/entities/WorkflowEntity.ts +++ b/packages/cli/src/databases/entities/WorkflowEntity.ts @@ -29,6 +29,7 @@ import { SharedWorkflow } from './SharedWorkflow'; import { objectRetriever, sqlite } from '../utils/transformers'; import { AbstractEntity, jsonColumnType } from './AbstractEntity'; import type { IWorkflowDb } from '../../Interfaces'; +import { alphabetizeKeys } from '../../utils'; @Entity() export class WorkflowEntity extends AbstractEntity implements IWorkflowDb { @@ -103,7 +104,7 @@ export class WorkflowEntity extends AbstractEntity implements IWorkflowDb { const state = JSON.stringify({ name, active, - nodes, + nodes: nodes ? nodes.map(alphabetizeKeys) : [], connections, settings, staticData, diff --git a/packages/cli/src/utils.ts b/packages/cli/src/utils.ts index d026bd3190019..487442dae286e 100644 --- a/packages/cli/src/utils.ts +++ b/packages/cli/src/utils.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { CliWorkflowOperationError, SubworkflowOperationError } from 'n8n-workflow'; import type { INode } from 'n8n-workflow'; @@ -28,3 +29,15 @@ function findWorkflowStart(executionMode: 'integrated' | 'cli') { export const findSubworkflowStart = findWorkflowStart('integrated'); export const findCliWorkflowStart = findWorkflowStart('cli'); + +export const alphabetizeKeys = (obj: INode) => + Object.keys(obj) + .sort() + .reduce>( + (acc, key) => ({ + ...acc, + // @ts-expect-error @TECH_DEBT Adding index signature to INode causes type issues downstream + [key]: obj[key], + }), + {}, + );