@middy/util
Version:
🛵 The stylish Node.js middleware engine for AWS Lambda (util package)
72 lines (61 loc) • 2.31 kB
TypeScript
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
type LetterLower = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i'
| 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't'
| 'u' | 'v' | 'w' | 'x' | 'y' | 'z'
type LetterUpper = Uppercase<LetterLower>
type AlphaNumeric = Digit | LetterLower | LetterUpper
type SanitizeKeyPrefixLeadingNumber<T> =
// eslint-disable-next-line @typescript-eslint/no-unused-vars
T extends `${infer _ extends Digit}${any}`
? `_${T}`
: T
type SanitizeKeyRemoveDisallowedChar<T> =
T extends `${infer First}${infer Rest}`
? First extends AlphaNumeric
? `${First}${SanitizeKeyRemoveDisallowedChar<Rest>}`
: `_${SanitizeKeyRemoveDisallowedChar<Rest>}`
: T extends ''
? T
: never
type RemoveAllLeadingUnderscore<T> =
T extends `_${infer Rest}`
? RemoveAllLeadingUnderscore<Rest>
: T extends string
? T
: never
type RemoveRepeatedUnderscore<T> =
T extends `${infer First}_${infer Rest}`
? `${First}_${RemoveRepeatedUnderscore<RemoveAllLeadingUnderscore<Rest>>}`
: T extends string
? T
: never
export type SanitizeKey<T> =
RemoveRepeatedUnderscore<
SanitizeKeyRemoveDisallowedChar<
SanitizeKeyPrefixLeadingNumber<T>
>
>
export type SanitizeKeys<T extends Record<string, unknown>> = {
[P in keyof T as SanitizeKey<P>]: T[P]
}
// recursion limit hack from https://www.angularfix.com/2022/01/why-am-i-getting-instantiation-is.html
type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
export type DeepAwaited<T, RecursionDepth extends Prev[number] = 4> =
[RecursionDepth] extends [never]
? unknown // stop evaluating recursively rather than failing with never
: T extends Promise<infer R>
? Awaited<R>
: T extends Record<any, any>
? {
[P in keyof T]:
T[P] extends Promise<infer R>
? Awaited<R> // if it's a Promise resolve
: DeepAwaited<T[P], Prev[RecursionDepth]>
}
: T
export type Choose<
T extends Record<string | number, any>,
K extends string
> = K extends `${infer U}.${infer Rest}` ? Choose<T[U], Rest> : T[K]
export type IsUnknown<T> = unknown extends T ? true : false
export type ArrayValues<T> = T extends Array<infer U> ? U : never