Missing null check on action.settings.outputSchema crashes HTTP Request workflow editor

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.
This commit is contained in:
Sonarly Claude Code
2026-03-12 08:44:36 +00:00
parent 2eac82c207
commit 6460e344a2
@@ -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<string | null>(
Object.keys(action.settings.outputSchema).length
isDefined(action.settings.outputSchema) &&
Object.keys(action.settings.outputSchema).length
? JSON.stringify(
convertOutputSchemaToJson(
action.settings.outputSchema as BaseOutputSchemaV2,