From 6460e344a2dd57ab52b9012ac99f07b62cfbeb8d Mon Sep 17 00:00:00 2001 From: Sonarly Claude Code Date: Thu, 12 Mar 2026 08:44:36 +0000 Subject: [PATCH] Missing null check on `action.settings.outputSchema` crashes HTTP Request workflow editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://sonarly.com/issue/13598?type=bug `useHttpRequestOutputSchema` hook calls `Object.keys(action.settings.outputSchema)` without guarding against `undefined`, crashing when a workflow's HTTP Request step has no `outputSchema` in its persisted settings JSON. Fix: Added an `isDefined(action.settings.outputSchema)` guard before calling `Object.keys(action.settings.outputSchema)` in `useHttpRequestOutputSchema.ts`. When a workflow's HTTP Request step has stored settings JSON that is missing the `outputSchema` field (e.g., from direct DB manipulation or a code path that didn't include it), the hook now gracefully initializes the `outputSchema` state to `null` instead of crashing with `TypeError: undefined is not an object`. This matches the team's established pattern of using `isDefined()` from `twenty-shared/utils` for null guards, as seen in `filterOutputSchema.ts` and `useAvailableVariablesInWorkflowStep.ts`. The fix is minimal and safe: when `outputSchema` is missing, the user sees an empty output schema field they can populate — the same experience as a newly created HTTP Request step. --- .../http-request-action/hooks/useHttpRequestOutputSchema.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/http-request-action/hooks/useHttpRequestOutputSchema.ts b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/http-request-action/hooks/useHttpRequestOutputSchema.ts index d944968ae1d..ff0d17c67f2 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/http-request-action/hooks/useHttpRequestOutputSchema.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/http-request-action/hooks/useHttpRequestOutputSchema.ts @@ -3,6 +3,7 @@ import { type BaseOutputSchemaV2 } from 'twenty-shared/workflow'; import { parseAndValidateVariableFriendlyStringifiedJson } from '@/workflow/utils/parseAndValidateVariableFriendlyStringifiedJson'; import { isNonEmptyString } from '@sniptt/guards'; import { useState } from 'react'; +import { isDefined } from 'twenty-shared/utils'; import { convertOutputSchemaToJson } from '@/workflow/workflow-steps/workflow-actions/http-request-action/utils/convertOutputSchemaToJson'; import { getHttpRequestOutputSchema } from '@/workflow/workflow-steps/workflow-actions/http-request-action/utils/getHttpRequestOutputSchema'; @@ -18,7 +19,8 @@ export const useHttpRequestOutputSchema = ({ readonly, }: UseHttpRequestOutputSchemaProps) => { const [outputSchema, setOutputSchema] = useState( - Object.keys(action.settings.outputSchema).length + isDefined(action.settings.outputSchema) && + Object.keys(action.settings.outputSchema).length ? JSON.stringify( convertOutputSchemaToJson( action.settings.outputSchema as BaseOutputSchemaV2,