import { MergeIntersection, MakeOptionalPropertiesAcceptUndefined } from 'advanced-type-utilities';

/** Options for creating URL strings. */
type UrlBuilderOptions = {
    /** default value: '' */
    baseUrl?: string | undefined;
    /** default value: true */
    autoAddLeadingSlash?: boolean | undefined;
    /** default value: false */
    autoAddTrailingSlash?: boolean | undefined;
};
declare const PATH_SEGMENTS_KEY: unique symbol;
declare const OPTIONS_KEY: unique symbol;
declare const QUERY_PARAMS_KEY: unique symbol;
declare function createRootPathObject<UrlSchema>(options?: UrlBuilderOptions): PathObject<UrlSchema>;
type Internal = {
    [PATH_SEGMENTS_KEY]: string[];
    [OPTIONS_KEY]: UrlBuilderOptions;
};
type PathObject<UrlSchema> = UrlSchema extends (...pathParams: infer PathParams) => infer NestedUrlSchema ? MergeIntersection<Internal & ("?" extends keyof UrlSchema ? {
    [QUERY_PARAMS_KEY]: UrlSchema["?"];
} : {}) & {
    [K in Exclude<keyof UrlSchema, "?" | symbol>]: PathObject<UrlSchema[K]>;
}> & ((...pathParams: PathParams) => PathObject<NestedUrlSchema>) : MergeIntersection<Internal & ("?" extends keyof UrlSchema ? {
    [QUERY_PARAMS_KEY]: UrlSchema["?"];
} : {}) & {
    [K in Exclude<keyof UrlSchema, "?" | symbol>]: PathObject<UrlSchema[K]>;
}>;
declare function urlOf<T extends {
    [PATH_SEGMENTS_KEY]: string[];
    [OPTIONS_KEY]: UrlBuilderOptions;
    [QUERY_PARAMS_KEY]: object;
}>(pathObject: T, queryParams?: MakeOptionalPropertiesAcceptUndefined<Partial<T[typeof QUERY_PARAMS_KEY]>>): string;
declare function urlOf<T extends {
    [PATH_SEGMENTS_KEY]: string[];
    [OPTIONS_KEY]: UrlBuilderOptions;
}>(pathObject: T): string;

export { type UrlBuilderOptions, createRootPathObject, urlOf };
