declare type ValueType = string | boolean | number | bigint;
declare type GetVariablesHelper<
	Text extends string,
	Prefix extends string,
	Suffix extends string,
	Accumulator,
> = string extends Text
	? string
	: Prefix extends ""
	? Suffix extends ""
		? Text extends `${infer Letter}${infer Rest}`
			? GetVariablesHelper<Rest, Prefix, Suffix, Letter | Accumulator>
			: Accumulator
		: Text extends `${infer Variable}${Suffix}${infer Rest}`
		? GetVariablesHelper<Rest, Prefix, Suffix, Variable | Accumulator>
		: Accumulator
	: Suffix extends ""
	? Text extends `${infer _Start}${Prefix}${infer Variable}`
		? Variable extends `${infer _Variable}${Prefix}${infer Rest}`
			? GetVariablesHelper<
					`${Prefix}${Rest}`,
					Prefix,
					Suffix,
					_Variable | Accumulator
			  >
			: Variable | Accumulator
		: Accumulator
	: Text extends `${infer _Start}${Prefix}${infer Variable}${Suffix}${infer Rest}`
	? Variable extends `${infer _Start}${Prefix}${infer _Variable}`
		? GetVariablesHelper<
				`${_Start}${Prefix}${_Variable}${Suffix}${Rest}`,
				Prefix,
				Suffix,
				Accumulator
		  >
		: GetVariablesHelper<Rest, Prefix, Suffix, Variable | Accumulator>
	: Accumulator;
declare type GetVariables<
	Text extends string,
	Prefix extends string,
	Suffix extends string,
> = GetVariablesHelper<Text, Prefix, Suffix, never>;
interface InterpolationOptions<Prefix extends string, Suffix extends string> {
	prefix: Prefix;
	suffix: Suffix;
}
declare type DefaultPrefix = "{";
declare type DefaultSuffix = "}";
interface HydrateText {
	<
		Text extends string,
		Prefix extends string = DefaultPrefix,
		Suffix extends string = DefaultSuffix,
	>(
		text: Text,
		variables?: Record<GetVariables<Text, Prefix, Suffix>, ValueType>,
		interpolationOptions?: InterpolationOptions<Prefix, Suffix>,
	): string;
}
interface ConfigureHydrateText {
	<
		_Prefix extends string = DefaultPrefix,
		_Suffix extends string = DefaultSuffix,
	>(
		interpolationOptions: InterpolationOptions<_Prefix, _Suffix>,
	): <
		Text extends string,
		Prefix extends string = _Prefix,
		Suffix extends string = _Suffix,
	>(
		text: Text,
		variables?: Record<GetVariables<Text, Prefix, Suffix>, ValueType>,
		interpolationOptions?: InterpolationOptions<Prefix, Suffix>,
	) => string;
}
declare const hydrateText: HydrateText;
declare const configureHydrateText: ConfigureHydrateText;
export { configureHydrateText, hydrateText };
export type {
	ConfigureHydrateText,
	DefaultPrefix,
	DefaultSuffix,
	HydrateText,
	InterpolationOptions,
	ValueType,
};
