We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
type QPair = [string, string | true]; type MarkAs<A, T> = A extends T ? A : never; // MarkAs<4, number> => 4, MarkAs<"4", number> => never type ToQPair<T extends string[]> = MarkAs<[T[0], T[1] extends undefined ? true : T[1]], QPair>; // ToQPair<['a', 'b']> => ['a', 'b'], ToQPair<['a']> => ['a', true] type Split<T extends string, S extends string> = T extends `${infer X}${S}${infer Y}` ? [X, ...Split<Y, S>] : T extends '' ? [] : [T]; // Split<'a,b,c'> => ['a', 'b', 'c'] type SplitQueryString<T extends string, R extends string[] = Split<T, '&'>> = R extends [infer A, ...infer B] ? [ToQPair<Split<MarkAs<A, string>, '='>>, ...SplitQueryString<T, MarkAs<B, string[]>>] : []; // SplitQueryString<'a=b&c'> => [['a', 'b'], ['c', true]] type FindByKey<K extends string, T extends QPair[]> = T extends [infer A, ...infer B] ? MarkAs<A, QPair>[0] extends K ? [MarkAs<A, QPair>[1], ...FindByKey<K, MarkAs<B, QPair[]>>] : FindByKey<K, MarkAs<B, QPair[]>> : []; // FindByKey<'key', [['key', 'value'], ['test', 'data'], ['key', 'val']]> => ['value', 'val'] type RemoveDuplicates< T extends any[], R extends any[] = [], V extends unknown[] = [], L extends number = V['length'] > = L extends T['length'] ? R : T[L] extends R[number] ? RemoveDuplicates<T, R, [...V, unknown]> : RemoveDuplicates<T, [...R, T[L]], [...V, unknown]>; // RemoveDuplicates<[1, 2, 1, 3]> => [1, 2, 3] type ArrayOrFirstElement<T extends any[]> = T['length'] extends 1 ? T[0] : T; // ArrayOrFirstElement<[1, 2]> => [1, 2], ArrayOrFirstElement<[1]> => 1 type ParseQueryString<T extends string, P extends QPair[] = SplitQueryString<T>> = { [K in P[number][0]]: ArrayOrFirstElement<RemoveDuplicates<FindByKey<K, P>>> };
/* _____________ Test Cases _____________ */ import { Equal, Expect } from '@type-challenges/utils' type cases = [ Expect<Equal<ParseQueryString<''>, {}>>, Expect<Equal<ParseQueryString<'k1'>, { k1: true }>>, Expect<Equal<ParseQueryString<'k1&k1'>, { k1: true }>>, Expect<Equal<ParseQueryString<'k1&k2'>, { k1: true, k2: true }>>, Expect<Equal<ParseQueryString<'k1=v1'>, { k1: 'v1' }>>, Expect<Equal<ParseQueryString<'k1=v1&k1=v2'>, { k1: ['v1', 'v2'] }>>, Expect<Equal<ParseQueryString<'k1=v1&k2=v2'>, { k1: 'v1', k2: 'v2' }>>, Expect<Equal<ParseQueryString<'k1=v1&k2=v2&k1=v2'>, { k1: ['v1', 'v2'], k2: 'v2' }>>, Expect<Equal<ParseQueryString<'k1=v1&k2'>, { k1: 'v1', k2: true }>>, Expect<Equal<ParseQueryString<'k1=v1&k1=v1'>, { k1: 'v1' }>> ]
The text was updated successfully, but these errors were encountered:
No branches or pull requests
151 - Query String Parser
Code
Test cases
The text was updated successfully, but these errors were encountered: