From b8771444ad5e7c19c09e180cdd53a4ffd8fa0918 Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Mon, 28 Sep 2026 15:31:42 +1000 Subject: [PATCH] fix(studio): preserve Snowflake submit validation --- .../DestinationForm/index.tsx | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx index 01ca89c6863..f504e11094f 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx @@ -46,7 +46,10 @@ import { PipelineCostDialog } from './PipelineCostDialog' import { PipelineRegionField } from './PipelineRegionField' import { PublicationSelection } from './PublicationSelection' import { SnowflakeFields } from './Snowflake/Fields' -import { getSnowflakeValidationIssues } from './Snowflake/Snowflake.utils' +import { + getSnowflakeValidationIssues, + SNOWFLAKE_PRIVATE_KEY_FORMAT_MESSAGE, +} from './Snowflake/Snowflake.utils' import { TableCopySelection } from './TableCopySelection' import { useDestinationForm } from './useDestinationForm' import { ValidationFailuresSection } from './ValidationFailuresSection' @@ -224,11 +227,12 @@ export const DestinationForm = ({ } ) } else if (selectedType === 'Snowflake') { - getSnowflakeValidationIssues(data, { secretsOptional: editMode }).forEach( - ({ path, message }) => { - addRequiredFieldError(path, message) - } - ) + getSnowflakeValidationIssues(data, { + secretsOptional: editMode, + validatePrivateKeyFormat: false, + }).forEach(({ path, message }) => { + addRequiredFieldError(path, message) + }) } else if (selectedType === 'ClickHouse') { getClickHouseValidationIssues(data).forEach(({ path, message }) => { addRequiredFieldError(path, message) @@ -332,7 +336,7 @@ export const DestinationForm = ({ (data.tableSyncCopyMode === 'include_tables' || data.tableSyncCopyMode === 'skip_tables') && data.tableSyncCopyTableIds.length === 0 ) { - form.setError('tableSyncCopyTableIds', { message: 'Select at least one table' }) + form.setError('tableSyncCopyTableIds', { message: 'Select at least one table.' }) return } @@ -346,6 +350,16 @@ export const DestinationForm = ({ } } + if (selectedType === 'Snowflake') { + const privateKeyIssue = getSnowflakeValidationIssues(data, { + secretsOptional: editMode, + }).find((issue) => issue.message === SNOWFLAKE_PRIVATE_KEY_FORMAT_MESSAGE) + if (privateKeyIssue) { + form.setError(privateKeyIssue.path, { message: privateKeyIssue.message }) + return + } + } + // Pipeline prerequisite validation models a new pipeline and cannot // account for resources already owned by an existing pipeline. Edits keep // the established direct-update flow after pruning stale table ids.