import { LegacyConfig, ResourcesConfig } from '../singleton/types';
import { AmplifyOutputsUnknown } from '../singleton/AmplifyOutputs/types';
/**
 * Supported category names for `.add()`.
 */
type CategoryName = keyof ResourcesConfig;
/**
 * Maps a category name to its config type.
 */
type CategoryConfig<K extends CategoryName> = NonNullable<ResourcesConfig[K]>;
/**
 * Allowed seed formats for `createConfiguration({ from })`.
 */
type ConfigurationSeed = ResourcesConfig | LegacyConfig | AmplifyOutputsUnknown | ConfigurationBuilder;
/**
 * Recursively makes all properties optional.
 */
type DeepPartial<T> = T extends object ? {
    [K in keyof T]?: DeepPartial<T[K]>;
} : T;
export interface ConfigurationBuilder {
    /**
     * Merge an existing config into this builder. Accepts any format that
     * `Amplify.configure()` accepts, or another `ConfigurationBuilder`.
     *
     * @example
     * ```ts
     * const config = createConfiguration()
     *   .from(amplifyOutputs)
     *   .add('Storage', { S3: { bucket: 'my-bucket', region: 'us-east-1' } })
     *   .build();
     * ```
     */
    from(existing: ConfigurationSeed): ConfigurationBuilder;
    /**
     * Add or replace a category configuration.
     *
     * @example
     * ```ts
     * config.add('Auth', { Cognito: { userPoolId: '...', userPoolClientId: '...' } });
     * config.add('Storage', { S3: { bucket: '...', region: '...' } });
     * ```
     */
    add<K extends CategoryName>(category: K, value: CategoryConfig<K>): ConfigurationBuilder;
    /**
     * Deep-merge a partial config into an existing category. Use this to
     * override specific nested values without replacing the entire category.
     *
     * @example
     * ```ts
     * // Base config from outputs, override just the user pool for dev
     * const dev = createConfiguration({ from: outputs })
     *   .patch('Auth', { Cognito: { userPoolId: 'us-east-1_DEV' } })
     *   .build();
     * ```
     */
    patch<K extends CategoryName>(category: K, value: DeepPartial<CategoryConfig<K>>): ConfigurationBuilder;
    /** Shorthand for `.add('Auth', config)` */
    auth(config: CategoryConfig<'Auth'>): ConfigurationBuilder;
    /** Shorthand for `.add('Storage', config)` */
    storage(config: CategoryConfig<'Storage'>): ConfigurationBuilder;
    /** Shorthand for `.add('API', config)` */
    api(config: CategoryConfig<'API'>): ConfigurationBuilder;
    /** Shorthand for `.add('Analytics', config)` */
    analytics(config: CategoryConfig<'Analytics'>): ConfigurationBuilder;
    /** Shorthand for `.add('Geo', config)` */
    geo(config: CategoryConfig<'Geo'>): ConfigurationBuilder;
    /** Shorthand for `.add('Notifications', config)` */
    notifications(config: CategoryConfig<'Notifications'>): ConfigurationBuilder;
    /** Shorthand for `.add('Interactions', config)` */
    interactions(config: CategoryConfig<'Interactions'>): ConfigurationBuilder;
    /** Shorthand for `.add('Predictions', config)` */
    predictions(config: CategoryConfig<'Predictions'>): ConfigurationBuilder;
    /**
     * Produces a frozen `ResourcesConfig` ready for `Amplify.configure()`.
     */
    build(): ResourcesConfig;
}
export interface CreateConfigurationBuilderOptions {
    from?: ConfigurationSeed;
}
/**
 * Creates a configuration builder for constructing `ResourcesConfig` objects
 * programmatically.
 *
 * @example
 * ```ts
 * import outputs from './amplify_outputs.json';
 *
 * const config = createConfiguration({ from: outputs })
 *   .add('Storage', { S3: { bucket: 'my-bucket', region: 'us-east-1' } })
 *   .build();
 *
 * Amplify.configure(config);
 * ```
 */
export declare function createConfigurationBuilder(options?: CreateConfigurationBuilderOptions): ConfigurationBuilder;
export {};
