From 2211ef4af3db37cfbafc1de6844c63665e6296f1 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 13 Oct 2026 14:34:50 -0700 Subject: [PATCH] improvement(fivetran): use shared filterUndefined and readonly constant lists --- apps/sim/blocks/blocks/fivetran.ts | 108 +++++++++--------- .../sim/tools/fivetran/create_connect_card.ts | 5 +- apps/sim/tools/fivetran/create_connection.ts | 4 +- apps/sim/tools/fivetran/create_destination.ts | 4 +- .../fivetran/reload_connection_schema.ts | 4 +- apps/sim/tools/fivetran/resync_connection.ts | 4 +- .../fivetran/run_connection_setup_tests.ts | 4 +- .../fivetran/run_destination_setup_tests.ts | 4 +- apps/sim/tools/fivetran/run_transformation.ts | 4 +- apps/sim/tools/fivetran/sync_connection.ts | 5 +- apps/sim/tools/fivetran/update_connection.ts | 4 +- .../fivetran/update_connection_schema.ts | 4 +- .../tools/fivetran/update_connection_table.ts | 4 +- .../tools/fivetran/update_schema_config.ts | 4 +- apps/sim/tools/fivetran/utils.ts | 9 -- 15 files changed, 83 insertions(+), 88 deletions(-) diff --git a/apps/sim/blocks/blocks/fivetran.ts b/apps/sim/blocks/blocks/fivetran.ts index 2cb084fa706..37b2c31a1e2 100644 --- a/apps/sim/blocks/blocks/fivetran.ts +++ b/apps/sim/blocks/blocks/fivetran.ts @@ -20,7 +20,7 @@ const CONNECTION_ID_OPS = [ 'update_connection_schema', 'update_schema_config', 'create_connect_card', -] +] as const const GROUP_ID_OPS = [ 'list_connections', @@ -28,13 +28,13 @@ const GROUP_ID_OPS = [ 'create_destination', 'get_group', 'list_transformations', -] +] as const -const GROUP_ID_REQUIRED_OPS = ['create_connection', 'create_destination', 'get_group'] +const GROUP_ID_REQUIRED_OPS = ['create_connection', 'create_destination', 'get_group'] as const -const DESTINATION_ID_OPS = ['get_destination', 'run_destination_setup_tests'] +const DESTINATION_ID_OPS = ['get_destination', 'run_destination_setup_tests'] as const -const CONNECTION_SETTINGS_OPS = ['create_connection', 'update_connection'] +const CONNECTION_SETTINGS_OPS = ['create_connection', 'update_connection'] as const const SETUP_TEST_OPS = [ 'create_connection', @@ -42,7 +42,7 @@ const SETUP_TEST_OPS = [ 'create_destination', 'run_connection_setup_tests', 'run_destination_setup_tests', -] +] as const const PAGINATED_OPS = [ 'list_connections', @@ -52,11 +52,15 @@ const PAGINATED_OPS = [ 'list_users', 'list_connector_types', 'get_sync_history', -] +] as const -const TRANSFORMATION_ID_OPS = ['get_transformation', 'run_transformation', 'cancel_transformation'] +const TRANSFORMATION_ID_OPS = [ + 'get_transformation', + 'run_transformation', + 'cancel_transformation', +] as const -const SCHEMA_NAME_OPS = ['update_connection_table', 'update_connection_schema'] +const SCHEMA_NAME_OPS = ['update_connection_table', 'update_connection_schema'] as const /** Fivetran's data processing regions for a new destination. */ const REGION_OPTIONS = [ @@ -104,7 +108,7 @@ const REGION_OPTIONS = [ { label: 'AZURE_WESTUS3', id: 'AZURE_WESTUS3' }, { label: 'AZURE_SWITZERLANDNORTH', id: 'AZURE_SWITZERLANDNORTH' }, { label: 'AZURE_KOREACENTRAL', id: 'AZURE_KOREACENTRAL' }, -] +] as const const TIME_ZONE_OFFSET_OPTIONS = Array.from({ length: 24 }, (_, index) => { const offset = index - 11 @@ -129,13 +133,13 @@ const PAUSE_ONLY_UPDATE = { runSetupTests: undefined, trustCertificates: undefined, trustFingerprints: undefined, -} +} as const const OPTIONAL_BOOLEAN_OPTIONS = [ { label: 'Not set', id: '' }, { label: 'Yes', id: 'true' }, { label: 'No', id: 'false' }, -] +] as const const SYNC_FREQUENCY_OPTIONS = [ { label: 'Not set', id: '' }, @@ -150,7 +154,7 @@ const SYNC_FREQUENCY_OPTIONS = [ { label: 'Every 8 hours', id: '480' }, { label: 'Every 12 hours', id: '720' }, { label: 'Every 24 hours', id: '1440' }, -] +] as const const TIMESTAMP_WAND = { enabled: true, @@ -459,8 +463,8 @@ export const FivetranBlock: BlockConfig = { placeholder: 'Select connection', dependsOn: ['credential'], mode: 'basic', - condition: { field: 'operation', value: CONNECTION_ID_OPS }, - required: { field: 'operation', value: CONNECTION_ID_OPS }, + condition: { field: 'operation', value: [...CONNECTION_ID_OPS] }, + required: { field: 'operation', value: [...CONNECTION_ID_OPS] }, }, { id: 'manualConnectionId', @@ -469,8 +473,8 @@ export const FivetranBlock: BlockConfig = { canonicalParamId: 'connectionId', placeholder: 'Enter the connection ID', mode: 'advanced', - condition: { field: 'operation', value: CONNECTION_ID_OPS }, - required: { field: 'operation', value: CONNECTION_ID_OPS }, + condition: { field: 'operation', value: [...CONNECTION_ID_OPS] }, + required: { field: 'operation', value: [...CONNECTION_ID_OPS] }, }, { id: 'groupSelector', @@ -482,8 +486,8 @@ export const FivetranBlock: BlockConfig = { placeholder: 'Select group', dependsOn: ['credential'], mode: 'basic', - condition: { field: 'operation', value: GROUP_ID_OPS }, - required: { field: 'operation', value: GROUP_ID_REQUIRED_OPS }, + condition: { field: 'operation', value: [...GROUP_ID_OPS] }, + required: { field: 'operation', value: [...GROUP_ID_REQUIRED_OPS] }, }, { id: 'manualGroupId', @@ -492,8 +496,8 @@ export const FivetranBlock: BlockConfig = { canonicalParamId: 'groupId', placeholder: 'Enter the group ID', mode: 'advanced', - condition: { field: 'operation', value: GROUP_ID_OPS }, - required: { field: 'operation', value: GROUP_ID_REQUIRED_OPS }, + condition: { field: 'operation', value: [...GROUP_ID_OPS] }, + required: { field: 'operation', value: [...GROUP_ID_REQUIRED_OPS] }, }, { id: 'destinationSelector', @@ -505,8 +509,8 @@ export const FivetranBlock: BlockConfig = { placeholder: 'Select destination', dependsOn: ['credential'], mode: 'basic', - condition: { field: 'operation', value: DESTINATION_ID_OPS }, - required: { field: 'operation', value: DESTINATION_ID_OPS }, + condition: { field: 'operation', value: [...DESTINATION_ID_OPS] }, + required: { field: 'operation', value: [...DESTINATION_ID_OPS] }, }, { id: 'manualDestinationId', @@ -515,16 +519,16 @@ export const FivetranBlock: BlockConfig = { canonicalParamId: 'destinationId', placeholder: 'Enter the destination ID (same as its group ID)', mode: 'advanced', - condition: { field: 'operation', value: DESTINATION_ID_OPS }, - required: { field: 'operation', value: DESTINATION_ID_OPS }, + condition: { field: 'operation', value: [...DESTINATION_ID_OPS] }, + required: { field: 'operation', value: [...DESTINATION_ID_OPS] }, }, { id: 'transformationId', title: 'Transformation ID', type: 'short-input', placeholder: 'Enter the transformation ID', - condition: { field: 'operation', value: TRANSFORMATION_ID_OPS }, - required: { field: 'operation', value: TRANSFORMATION_ID_OPS }, + condition: { field: 'operation', value: [...TRANSFORMATION_ID_OPS] }, + required: { field: 'operation', value: [...TRANSFORMATION_ID_OPS] }, }, { id: 'schema', @@ -586,7 +590,7 @@ export const FivetranBlock: BlockConfig = { id: 'region', title: 'Processing Region', type: 'dropdown', - options: REGION_OPTIONS, + options: [...REGION_OPTIONS], value: () => '', condition: { field: 'operation', value: 'create_destination' }, mode: 'advanced', @@ -631,7 +635,7 @@ export const FivetranBlock: BlockConfig = { type: 'code', language: 'json', placeholder: '{"schema": "okta", "domain": "acme", "api_token": "..."}', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, required: { field: 'operation', value: 'create_connection' }, wandConfig: { enabled: true, @@ -646,16 +650,16 @@ export const FivetranBlock: BlockConfig = { type: 'code', language: 'json', placeholder: '{"client_access": {"client_id": "...", "client_secret": "..."}}', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { id: 'syncFrequency', title: 'Sync Frequency', type: 'dropdown', - options: SYNC_FREQUENCY_OPTIONS, + options: [...SYNC_FREQUENCY_OPTIONS], value: () => '', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, }, { id: 'scheduleType', @@ -667,7 +671,7 @@ export const FivetranBlock: BlockConfig = { { label: 'Manual', id: 'manual' }, ], value: () => '', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { @@ -675,16 +679,16 @@ export const FivetranBlock: BlockConfig = { title: 'Daily Sync Time', type: 'short-input', placeholder: 'HH:MM, used with a 24-hour frequency', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { id: 'paused', title: 'Paused', type: 'dropdown', - options: OPTIONAL_BOOLEAN_OPTIONS, + options: [...OPTIONAL_BOOLEAN_OPTIONS], value: () => '', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { @@ -713,7 +717,7 @@ export const FivetranBlock: BlockConfig = { { label: 'Sync frequency', id: 'SYNC_FREQUENCY' }, ], value: () => '', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { @@ -721,23 +725,23 @@ export const FivetranBlock: BlockConfig = { title: 'Data Delay Threshold', type: 'short-input', placeholder: 'Minutes, used with Custom sensitivity', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { id: 'pauseAfterTrial', title: 'Pause After Trial', type: 'dropdown', - options: OPTIONAL_BOOLEAN_OPTIONS, + options: [...OPTIONAL_BOOLEAN_OPTIONS], value: () => '', - condition: { field: 'operation', value: CONNECTION_SETTINGS_OPS }, + condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS] }, mode: 'advanced', }, { id: 'isHistoricalSync', title: 'Re-sync Historical Data', type: 'dropdown', - options: OPTIONAL_BOOLEAN_OPTIONS, + options: [...OPTIONAL_BOOLEAN_OPTIONS], value: () => '', condition: { field: 'operation', value: 'update_connection' }, mode: 'advanced', @@ -746,7 +750,7 @@ export const FivetranBlock: BlockConfig = { id: 'runSetupTests', title: 'Run Setup Tests', type: 'dropdown', - options: OPTIONAL_BOOLEAN_OPTIONS, + options: [...OPTIONAL_BOOLEAN_OPTIONS], value: () => '', condition: { field: 'operation', value: [...CONNECTION_SETTINGS_OPS, 'create_destination'] }, mode: 'advanced', @@ -755,14 +759,14 @@ export const FivetranBlock: BlockConfig = { id: 'trustCertificates', title: 'Trust Certificates', type: 'switch', - condition: { field: 'operation', value: SETUP_TEST_OPS }, + condition: { field: 'operation', value: [...SETUP_TEST_OPS] }, mode: 'advanced', }, { id: 'trustFingerprints', title: 'Trust SSH Fingerprints', type: 'switch', - condition: { field: 'operation', value: SETUP_TEST_OPS }, + condition: { field: 'operation', value: [...SETUP_TEST_OPS] }, mode: 'advanced', }, { @@ -808,8 +812,8 @@ export const FivetranBlock: BlockConfig = { title: 'Schema Name', type: 'short-input', placeholder: 'Schema name as stored in the schema config', - condition: { field: 'operation', value: SCHEMA_NAME_OPS }, - required: { field: 'operation', value: SCHEMA_NAME_OPS }, + condition: { field: 'operation', value: [...SCHEMA_NAME_OPS] }, + required: { field: 'operation', value: [...SCHEMA_NAME_OPS] }, }, { id: 'tableName', @@ -983,7 +987,7 @@ export const FivetranBlock: BlockConfig = { title: 'Page Size', type: 'short-input', placeholder: '1 to 1000 (defaults to 100)', - condition: { field: 'operation', value: PAGINATED_OPS }, + condition: { field: 'operation', value: [...PAGINATED_OPS] }, mode: 'advanced', }, { @@ -991,7 +995,7 @@ export const FivetranBlock: BlockConfig = { title: 'Cursor', type: 'short-input', placeholder: 'nextCursor from the previous page', - condition: { field: 'operation', value: PAGINATED_OPS }, + condition: { field: 'operation', value: [...PAGINATED_OPS] }, mode: 'advanced', }, ...getTrigger('fivetran_sync_end').subBlocks, @@ -1056,7 +1060,9 @@ export const FivetranBlock: BlockConfig = { }, params: (params) => { const result: Record = {} - const isConnectionSettings = CONNECTION_SETTINGS_OPS.includes(params.operation) + const isConnectionSettings = (CONNECTION_SETTINGS_OPS as readonly string[]).includes( + params.operation + ) if (params.operation === 'pause_connection' || params.operation === 'resume_connection') { return { @@ -1088,7 +1094,7 @@ export const FivetranBlock: BlockConfig = { if (params.operation === 'update_connection') { result.isHistoricalSync = toOptionalBoolean(params.isHistoricalSync) } - if (SETUP_TEST_OPS.includes(params.operation)) { + if ((SETUP_TEST_OPS as readonly string[]).includes(params.operation)) { result.trustCertificates = toOptionalBoolean(params.trustCertificates) result.trustFingerprints = toOptionalBoolean(params.trustFingerprints) } @@ -1107,7 +1113,7 @@ export const FivetranBlock: BlockConfig = { result.active = toOptionalBoolean(params.active) result.hasApiKey = toOptionalBoolean(params.hasApiKey) } - if (PAGINATED_OPS.includes(params.operation)) { + if ((PAGINATED_OPS as readonly string[]).includes(params.operation)) { result.limit = toOptionalNumber(params.limit) } return result diff --git a/apps/sim/tools/fivetran/create_connect_card.ts b/apps/sim/tools/fivetran/create_connect_card.ts index e17e3d8fcea..e456066d352 100644 --- a/apps/sim/tools/fivetran/create_connect_card.ts +++ b/apps/sim/tools/fivetran/create_connect_card.ts @@ -1,11 +1,10 @@ import { toStringOrNull } from '@sim/utils/coerce' -import { toRecord } from '@sim/utils/object' +import { filterUndefined, toRecord } from '@sim/utils/object' import type { FivetranCreateConnectCardParams, FivetranCreateConnectCardResponse, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -59,7 +58,7 @@ export const fivetranCreateConnectCardTool: ToolConfig< method: 'POST', headers: (params) => fivetranHeaders(params), body: (params) => ({ - connect_card_config: compactBody({ + connect_card_config: filterUndefined({ redirect_uri: params.redirectUri?.trim(), hide_setup_guide: optionalBoolean(params.hideSetupGuide), all_fields: optionalBoolean(params.allFields), diff --git a/apps/sim/tools/fivetran/create_connection.ts b/apps/sim/tools/fivetran/create_connection.ts index 72ac99b5d76..2627ad8c065 100644 --- a/apps/sim/tools/fivetran/create_connection.ts +++ b/apps/sim/tools/fivetran/create_connection.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { CONNECTION_PROPERTIES, type FivetranConnectionResponse, type FivetranCreateConnectionParams, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_ERROR_EXTRACTOR, @@ -125,7 +125,7 @@ export const fivetranCreateConnectionTool: ToolConfig< if (!config) { throw new Error('Provide the connection config, including its destination schema name.') } - return compactBody({ + return filterUndefined({ group_id: params.groupId?.trim(), service: params.service?.trim(), config, diff --git a/apps/sim/tools/fivetran/create_destination.ts b/apps/sim/tools/fivetran/create_destination.ts index d5100bd37aa..873e588e126 100644 --- a/apps/sim/tools/fivetran/create_destination.ts +++ b/apps/sim/tools/fivetran/create_destination.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { DESTINATION_PROPERTIES, type FivetranCreateDestinationParams, type FivetranDestinationResponse, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_ERROR_EXTRACTOR, @@ -84,7 +84,7 @@ export const fivetranCreateDestinationTool: ToolConfig< method: 'POST', headers: (params) => fivetranHeaders(params), body: (params) => - compactBody({ + filterUndefined({ group_id: params.groupId?.trim(), service: params.service?.trim(), time_zone_offset: trimmed(params.timeZoneOffset), diff --git a/apps/sim/tools/fivetran/reload_connection_schema.ts b/apps/sim/tools/fivetran/reload_connection_schema.ts index 0bef2575396..abdb853a3cc 100644 --- a/apps/sim/tools/fivetran/reload_connection_schema.ts +++ b/apps/sim/tools/fivetran/reload_connection_schema.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { type FivetranReloadConnectionSchemaParams, type FivetranSchemaConfigResponse, SCHEMA_CONFIG_OUTPUTS, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -47,7 +47,7 @@ export const fivetranReloadConnectionSchemaTool: ToolConfig< fivetranUrl(`/connections/${fivetranId(params.connectionId, 'connectionId')}/schemas/reload`), method: 'POST', headers: (params) => fivetranHeaders(params), - body: (params) => compactBody({ exclude_mode: trimmed(params.excludeMode) }), + body: (params) => filterUndefined({ exclude_mode: trimmed(params.excludeMode) }), }, transformResponse: async (response: Response) => { diff --git a/apps/sim/tools/fivetran/resync_connection.ts b/apps/sim/tools/fivetran/resync_connection.ts index e6bec883945..28ef0da0c66 100644 --- a/apps/sim/tools/fivetran/resync_connection.ts +++ b/apps/sim/tools/fivetran/resync_connection.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { type FivetranMessageResponse, type FivetranResyncConnectionParams, MESSAGE_OUTPUTS, } from '@/tools/fivetran/types' import { - compactBody, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, FIVETRAN_ERROR_EXTRACTOR, @@ -46,7 +46,7 @@ export const fivetranResyncConnectionTool: ToolConfig< fivetranUrl(`/connections/${fivetranId(params.connectionId, 'connectionId')}/resync`), method: 'POST', headers: (params) => fivetranHeaders(params), - body: (params) => compactBody({ scope: parseSchemaTableMap(params.scope, 'scope') }), + body: (params) => filterUndefined({ scope: parseSchemaTableMap(params.scope, 'scope') }), }, transformResponse: transformMessageResponse, diff --git a/apps/sim/tools/fivetran/run_connection_setup_tests.ts b/apps/sim/tools/fivetran/run_connection_setup_tests.ts index edc54aff313..60afcb7e9ed 100644 --- a/apps/sim/tools/fivetran/run_connection_setup_tests.ts +++ b/apps/sim/tools/fivetran/run_connection_setup_tests.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { CONNECTION_PROPERTIES, type FivetranConnectionResponse, type FivetranRunConnectionSetupTestsParams, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -43,7 +43,7 @@ export const fivetranRunConnectionSetupTestsTool: ToolConfig< method: 'POST', headers: (params) => fivetranHeaders(params), body: (params) => - compactBody({ + filterUndefined({ trust_certificates: optionalBoolean(params.trustCertificates), trust_fingerprints: optionalBoolean(params.trustFingerprints), }), diff --git a/apps/sim/tools/fivetran/run_destination_setup_tests.ts b/apps/sim/tools/fivetran/run_destination_setup_tests.ts index c3e2bf62700..bc4b11bd46e 100644 --- a/apps/sim/tools/fivetran/run_destination_setup_tests.ts +++ b/apps/sim/tools/fivetran/run_destination_setup_tests.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { DESTINATION_PROPERTIES, type FivetranDestinationResponse, type FivetranRunDestinationSetupTestsParams, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_DESTINATION_ID_PARAM, @@ -43,7 +43,7 @@ export const fivetranRunDestinationSetupTestsTool: ToolConfig< method: 'POST', headers: (params) => fivetranHeaders(params), body: (params) => - compactBody({ + filterUndefined({ trust_certificates: optionalBoolean(params.trustCertificates), trust_fingerprints: optionalBoolean(params.trustFingerprints), }), diff --git a/apps/sim/tools/fivetran/run_transformation.ts b/apps/sim/tools/fivetran/run_transformation.ts index 6498deae0c4..b34b135bf41 100644 --- a/apps/sim/tools/fivetran/run_transformation.ts +++ b/apps/sim/tools/fivetran/run_transformation.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { type FivetranMessageResponse, type FivetranRunTransformationParams, MESSAGE_OUTPUTS, } from '@/tools/fivetran/types' import { - compactBody, FIVETRAN_AUTH_PARAMS, FIVETRAN_ERROR_EXTRACTOR, FIVETRAN_OAUTH, @@ -46,7 +46,7 @@ export const fivetranRunTransformationTool: ToolConfig< ), method: 'POST', headers: (params) => fivetranHeaders(params), - body: (params) => compactBody({ full_refresh: optionalBoolean(params.fullRefresh) }), + body: (params) => filterUndefined({ full_refresh: optionalBoolean(params.fullRefresh) }), }, transformResponse: transformMessageResponse, diff --git a/apps/sim/tools/fivetran/sync_connection.ts b/apps/sim/tools/fivetran/sync_connection.ts index a94093a2c46..695ae80d37a 100644 --- a/apps/sim/tools/fivetran/sync_connection.ts +++ b/apps/sim/tools/fivetran/sync_connection.ts @@ -1,11 +1,10 @@ import { toStringOrNull } from '@sim/utils/coerce' -import { toRecord } from '@sim/utils/object' +import { filterUndefined, toRecord } from '@sim/utils/object' import type { FivetranSyncConnectionParams, FivetranSyncConnectionResponse, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -47,7 +46,7 @@ export const fivetranSyncConnectionTool: ToolConfig< fivetranUrl(`/connections/${fivetranId(params.connectionId, 'connectionId')}/sync`), method: 'POST', headers: (params) => fivetranHeaders(params), - body: (params) => compactBody({ force: optionalBoolean(params.force) }), + body: (params) => filterUndefined({ force: optionalBoolean(params.force) }), }, transformResponse: async (response: Response) => { diff --git a/apps/sim/tools/fivetran/update_connection.ts b/apps/sim/tools/fivetran/update_connection.ts index 699fd46cbeb..1f016550a40 100644 --- a/apps/sim/tools/fivetran/update_connection.ts +++ b/apps/sim/tools/fivetran/update_connection.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { CONNECTION_PROPERTIES, type FivetranConnectionResponse, type FivetranUpdateConnectionParams, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -125,7 +125,7 @@ export const fivetranUpdateConnectionTool: ToolConfig< method: 'PATCH', headers: (params) => fivetranHeaders(params), body: (params) => { - const body = compactBody({ + const body = filterUndefined({ config: parseJsonObject(params.config, 'config'), auth: parseJsonObject(params.auth, 'auth'), paused: optionalBoolean(params.paused), diff --git a/apps/sim/tools/fivetran/update_connection_schema.ts b/apps/sim/tools/fivetran/update_connection_schema.ts index a690bb8dc91..a9f52bc8f2a 100644 --- a/apps/sim/tools/fivetran/update_connection_schema.ts +++ b/apps/sim/tools/fivetran/update_connection_schema.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { type FivetranSchemaConfigResponse, type FivetranUpdateConnectionSchemaParams, SCHEMA_CONFIG_OUTPUTS, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -65,7 +65,7 @@ export const fivetranUpdateConnectionSchemaTool: ToolConfig< body: (params) => { const enabled = optionalBoolean(params.enabled) if (enabled === undefined) throw new Error('Specify whether the schema is enabled.') - return compactBody({ enabled, tables: parseJsonObject(params.tables, 'tables') }) + return filterUndefined({ enabled, tables: parseJsonObject(params.tables, 'tables') }) }, }, diff --git a/apps/sim/tools/fivetran/update_connection_table.ts b/apps/sim/tools/fivetran/update_connection_table.ts index 6da825a0566..7e602435d6c 100644 --- a/apps/sim/tools/fivetran/update_connection_table.ts +++ b/apps/sim/tools/fivetran/update_connection_table.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { type FivetranSchemaConfigResponse, type FivetranUpdateConnectionTableParams, SCHEMA_CONFIG_OUTPUTS, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -71,7 +71,7 @@ export const fivetranUpdateConnectionTableTool: ToolConfig< body: (params) => { const enabled = optionalBoolean(params.enabled) if (enabled === undefined) throw new Error('Specify whether the table is enabled.') - return compactBody({ enabled, sync_mode: trimmed(params.syncMode) }) + return filterUndefined({ enabled, sync_mode: trimmed(params.syncMode) }) }, }, diff --git a/apps/sim/tools/fivetran/update_schema_config.ts b/apps/sim/tools/fivetran/update_schema_config.ts index fb50b210a44..edbf1b7d39c 100644 --- a/apps/sim/tools/fivetran/update_schema_config.ts +++ b/apps/sim/tools/fivetran/update_schema_config.ts @@ -1,10 +1,10 @@ +import { filterUndefined } from '@sim/utils/object' import { type FivetranSchemaConfigResponse, type FivetranUpdateSchemaConfigParams, SCHEMA_CONFIG_OUTPUTS, } from '@/tools/fivetran/types' import { - compactBody, envelopeData, FIVETRAN_AUTH_PARAMS, FIVETRAN_CONNECTION_ID_PARAM, @@ -56,7 +56,7 @@ export const fivetranUpdateSchemaConfigTool: ToolConfig< method: 'PATCH', headers: (params) => fivetranHeaders(params), body: (params) => { - const body = compactBody({ + const body = filterUndefined({ schema_change_handling: trimmed(params.schemaChangeHandling), schemas: parseJsonObject(params.schemas, 'schemas'), }) diff --git a/apps/sim/tools/fivetran/utils.ts b/apps/sim/tools/fivetran/utils.ts index 099e956de43..88b38a0a84b 100644 --- a/apps/sim/tools/fivetran/utils.ts +++ b/apps/sim/tools/fivetran/utils.ts @@ -213,15 +213,6 @@ export function parseSchemaTableMap( return result } -/** Adds only the defined entries of `values` to a request body. */ -export function compactBody(values: Record): Record { - const body: Record = {} - for (const [key, value] of Object.entries(values)) { - if (value !== undefined) body[key] = value - } - return body -} - /** Reads `data` from a Fivetran `{ code, message, data }` envelope. */ export function envelopeData(body: unknown): Record { return toRecord(toRecord(body).data)