import { ExtractParamName, ParamEnd, ParamIsGreedy, ParamIsOptionalOrHasDefault, ParamStart } from '../types/params'; import { Param } from '../types/paramTypes'; import { Identity } from '../types/utilities'; import { MakeOptional } from '../utilities/makeOptional'; type WithParamsParamsInput = TValue extends `${string}${ParamStart}${infer TParam}${ParamEnd}${infer Rest}` ? Record, Param | undefined> & WithParamsParamsInput : {}; type WithParamsParamsOutput = Record> = TValue extends `${string}${ParamStart}${infer TParam}${ParamEnd}${infer Rest}` ? ExtractParamName extends keyof TParams ? TParams[ExtractParamName] extends Param ? Record, { param: TParams[ExtractParamName]; isOptional: ParamIsOptionalOrHasDefault]>; isGreedy: ParamIsGreedy; }> & WithParamsParamsOutput : Record, { param: StringConstructor; isOptional: ParamIsOptionalOrHasDefault]>; isGreedy: ParamIsGreedy; }> & WithParamsParamsOutput : Record, { param: StringConstructor; isOptional: ParamIsOptionalOrHasDefault]>; isGreedy: ParamIsGreedy; }> & WithParamsParamsOutput : {}; declare const UrlPartsWithParamsSymbol: unique symbol; export type UrlParam = { param: TParam; isOptional: boolean; isGreedy: boolean; }; export type RequiredUrlParam = { param: TParam; isOptional: false; isGreedy: false; }; export type OptionalUrlParam = { param: TParam; isOptional: true; isGreedy: false; }; export type UrlParams = Record; export type UrlPart = { value: string; params: TParams; [UrlPartsWithParamsSymbol]: true; }; export type ToUrlPart = T extends string ? UrlPart> : T extends undefined ? UrlPart<{}> : unknown extends T ? UrlPart<{}> : T; export declare function toUrlPart(value: T): ToUrlPart; export declare function withParams>>(value: TValue, params: TParams): UrlPart>; export declare function withParams(): UrlPart<{}>; /** * Type for query source that can be converted to a UrlPart object. * Supports * { query: 'foo=bar' } * { query: 'foo=[bar]' } * { query: { foo: 'bar' } } * { query: [['foo', 'bar']] } * { query: { foo: Param } } * { query: [[ 'foo', Param ]] } */ export type UrlQueryPart = UrlPart | Record | [string, Param][]; export type ToUrlQueryPart = T extends string ? UrlPart> : T extends UrlPart ? T : T extends undefined ? UrlPart<{}> : T extends Record ? UrlPart> : T extends [string, string | Param][] ? UrlPart> : UrlPart<{}>; type QueryRecordToUrlPart> = { [K in keyof T as T[K] extends string ? never : ExtractParamName]: { param: T[K]; isOptional: ParamIsOptionalOrHasDefault; isGreedy: false; }; }; type QueryArrayToUrlPart = T extends [infer First extends [string, string | Param], ...infer Rest extends [string, string | Param][]] ? First extends [string, string] ? {} : First extends [infer TKey extends string, infer TValue extends Param] ? Identity, { param: TValue; isOptional: ParamIsOptionalOrHasDefault; isGreedy: false; }> & QueryArrayToUrlPart> : never : {}; export declare function toUrlQueryPart(querySource: T): ToUrlQueryPart; export {};