import { ReactNode } from "react"; import { Controller, useFormContext } from "react-hook-form"; import { faQuestionCircle, faTriangleExclamation } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FormControl, Select, SelectItem, Switch, Tooltip } from "@app/components/v2"; import { SECRET_SYNC_INITIAL_SYNC_BEHAVIOR_MAP, SECRET_SYNC_MAP } from "@app/helpers/secretSyncs"; import { SecretSync, useSecretSyncOption } from "@app/hooks/api/secretSyncs"; import { TSecretSyncForm } from "../schemas"; import { AwsParameterStoreSyncOptionsFields } from "./AwsParameterStoreSyncOptionsFields"; import { AwsSecretsManagerSyncOptionsFields } from "./AwsSecretsManagerSyncOptionsFields"; type Props = { hideInitialSync?: boolean; }; export const SecretSyncOptionsFields = ({ hideInitialSync }: Props) => { const { control, watch } = useFormContext(); const destination = watch("destination"); const destinationName = SECRET_SYNC_MAP[destination].name; const { syncOption } = useSecretSyncOption(destination); let AdditionalSyncOptionsFieldsComponent: ReactNode; switch (destination) { case SecretSync.AWSParameterStore: AdditionalSyncOptionsFieldsComponent = ; break; case SecretSync.AWSSecretsManager: AdditionalSyncOptionsFieldsComponent = ; break; case SecretSync.GitHub: case SecretSync.GCPSecretManager: case SecretSync.AzureKeyVault: case SecretSync.AzureAppConfiguration: case SecretSync.Databricks: case SecretSync.Humanitec: case SecretSync.TerraformCloud: case SecretSync.Camunda: case SecretSync.Vercel: case SecretSync.Windmill: case SecretSync.HCVault: case SecretSync.TeamCity: AdditionalSyncOptionsFieldsComponent = null; break; default: throw new Error(`Unhandled Additional Sync Options Fields: ${destination}`); } return ( <>

Configure how secrets should be synced.

{!hideInitialSync && ( <> (

Specify how Infisical should resolve the initial sync to {destinationName}. The following options are available:

    {Object.values(SECRET_SYNC_INITIAL_SYNC_BEHAVIOR_MAP).map((details) => { const { name, description } = details(destinationName); return (
  • {name}:{" "} {description}

  • ); })}
) : undefined } errorText={error?.message} isError={Boolean(error?.message)} label="Initial Sync Behavior" >
)} /> {!syncOption?.canImportSecrets && (

{destinationName} only supports overwriting destination secrets. Secrets not present in Infisical will be removed from the destination.

)} )} {AdditionalSyncOptionsFieldsComponent} { return (

Disable Secret Deletion{" "}

When enabled, Infisical will not{" "} remove secrets from the destination during a sync.

Enable this option if you intend to manage some secrets manually outside of Infisical.

} >

); }} /> {/* ( )} control={control} name="syncOptions.prependPrefix" /> ( )} control={control} name="syncOptions.appendSuffix" /> */} ); };