hydrate-text
Version:
A small, dependency-free and strongly typed template engine.
87 lines (86 loc) • 2.62 kB
TypeScript
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,
};