import type { Parse, ParsedPattern, Separator, Token } from './parse.ts' import type { StartsWithSeparator, Stringify } from './stringify.ts' /** Join two pattern source strings together at the type level. */ export type JoinPatterns = _JoinPatterns, Parse> type _JoinPatterns = Stringify<{ protocol: JoinOriginField hostname: JoinOriginField port: JoinOriginField pathname: JoinPathnames search: JoinSearch }> // prettier-ignore type JoinOriginField< A extends ParsedPattern, B extends ParsedPattern, Field extends 'protocol' | 'hostname' | 'port' > = B['hostname'] extends Token[] ? B[Field] : A[Field] // prettier-ignore type JoinPathnames = B extends undefined ? A : B extends [] ? A : A extends undefined ? B : A extends [] ? B : A extends Token[] ? B extends Token[] ? JoinPathnameTokens, B> : never : never // prettier-ignore type RemoveTrailingSeparator = T extends [...infer Rest extends Token[], Separator] ? Rest : T // prettier-ignore type JoinPathnameTokens = B extends [Separator] ? A : StartsWithSeparator extends true ? [...A, ...B] : [...A, Separator, ...B] // prettier-ignore type JoinSearch = B extends undefined ? A : A extends undefined ? B : `${A}&${B}`