import type { ParsedPattern, Token } from './parse.ts' // prettier-ignore export type Stringify = T['hostname'] extends Token[] ? `${StringifyTokens}://${StringifyTokens}${StringifyPort}${StringifyPathname}${StringifySearch}` : `${StringifyPathname}${StringifySearch}` // prettier-ignore type StringifyTokens = T extends undefined ? '' : T extends [] ? '' : T extends [infer Head extends Token, ...infer Tail extends Token[]] ? `${StringifyToken}${StringifyTokens}` : never // prettier-ignore type StringifyToken = T extends { type: 'text', value: infer V extends string } ? V : T extends { type: 'variable', name: infer N extends string } ? `:${N}` : T extends { type: 'wildcard', name: infer N extends string } ? `*${N}` : T extends { type: 'wildcard' } ? '*' : T extends { type: 'separator' } ? Sep : T extends { type: 'optional', tokens: infer Tokens extends Token[] } ? `(${StringifyTokens})` : never // prettier-ignore type StringifyPathname = T extends undefined ? '/' : T extends [] ? '/' : T extends Token[] ? StartsWithSeparator extends true ? `${StringifyTokens}` : `/${StringifyTokens}` : never type StringifyPort = T extends string ? `:${T}` : '' type StringifySearch = T extends string ? `?${T}` : '' // prettier-ignore export type StartsWithSeparator = T extends [] ? false : T extends [{ type: 'separator' }, ...Token[]] ? true : T extends [{ type: 'optional', tokens: infer Tokens extends Token[] }, ...Token[]] ? StartsWithSeparator : false