@sm.ahmadi77/type-safe-url-s
Version:
A lightweight TypeScript library for writing URLs in a type-safe manner 👍.
40 lines (37 loc) • 1.75 kB
TypeScript
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 };