Skip to content

Instantly share code, notes, and snippets.

@zRains
Created March 31, 2025 07:48
Show Gist options
  • Save zRains/b9063f0fb859bb8b3fd8eaf73d2b7142 to your computer and use it in GitHub Desktop.
Save zRains/b9063f0fb859bb8b3fd8eaf73d2b7142 to your computer and use it in GitHub Desktop.
ExtractFieldsFromStaticDefinition impl. GraphQL
export type StrLen<T extends string, __Res extends Array<string> = []> = T extends `${infer A}${infer RestB}`
? StrLen<RestB, [...__Res, A]>
: __Res['length']
export type IsValidPath<
T extends string,
__Res extends boolean = StrLen<T> extends 0 ? false : true,
> = T extends `${infer A}${infer RestB}`
? __Res extends false
? false
: IsValidPath<RestB, A extends ' ' | '/' ? false : true>
: __Res
export type FilterValidPath<T extends Array<string>, __Res extends Array<string> = []> = T extends [
infer A extends string,
...infer RestB extends Array<string>,
]
? FilterValidPath<RestB, IsValidPath<A> extends true ? [...__Res, A] : __Res>
: __Res
export type PathLikeToStrImpl<T extends Array<string>, Res extends string = ''> = T extends [
infer FirstP extends string,
...infer RestP extends Array<string>,
]
? PathLikeToStrImpl<RestP, Res extends '' ? FirstP : `${Res}/${FirstP}`>
: Res
export type PathLikeToStr<
T extends Array<string>,
__FilteredT extends Array<string> = FilterValidPath<T>,
> = __FilteredT['length'] extends 0 ? '' : PathLikeToStrImpl<__FilteredT>
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never
export type LastOfUnion<U> = UnionToIntersection<U extends any ? () => U : never> extends () => infer R ? R : never
export type UnionToTuple<U, Last = LastOfUnion<U>> = [U] extends [never]
? []
: [...UnionToTuple<Exclude<U, Last>>, Last]
export type ObjUnWrapper<
T extends Record<string, unknown>,
__Path extends Array<string> = [],
__Res extends Array<Array<string>> = [],
__KeysOfT extends Array<unknown> = UnionToTuple<keyof T>,
> = __KeysOfT extends [infer A extends keyof T, ...infer RestB]
? ObjUnWrapper<
T,
[...__Path, Extract<A, string>],
ConvertToPathLike<Extract<T[A], Readonly<Array<unknown>>>, [...__Path, Extract<A, string>], __Res>,
RestB
>
: __Res
export type ConvertToPathLike<
T extends Readonly<Array<any>>,
__Path extends Array<string> = [],
__Res extends Array<Array<string>> = [],
> = T extends Readonly<[infer A, ...infer RestB]>
? ConvertToPathLike<
RestB,
__Path,
A extends string ? [...__Res, [...__Path, A]] : ObjUnWrapper<Extract<A, Record<string, unknown>>, __Path, __Res>
>
: __Res
export type ConvertToPathLikeToStrArr<T extends Array<Array<string>>, __Res extends Array<string> = []> = T extends [
infer A extends Array<string>,
...infer RestB extends Array<Array<string>>,
]
? ConvertToPathLikeToStrArr<RestB, [...__Res, PathLikeToStr<A>]>
: __Res
export type ExtractFieldsFromStaticDefinition<T extends Readonly<Array<unknown>>> = ConvertToPathLikeToStrArr<
ConvertToPathLike<T>
>[number]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment