export type ProblemBase = { type: string; title: string; detail?: string; instance?: string; stack?: string; cause?: any; }; export type ProblemInterface = ProblemBase; export interface ProblemOptions { } export interface MixinProblemOptions { typePrefix?: string; } export type CopyProblemOptions> = { mode?: 'leaveProps' | 'skipProps'; properties?: T; }; export type ToObjectProblemOptions = { includeStack?: boolean; includeCause?: boolean; }; export type StringifyProblemOptions = { includeStack?: boolean; includeCause?: boolean; }; export interface Constructable { new (...args: any[]): T; } type IsAny = unknown extends T ? [keyof T] extends [never] ? false : true : false; type PathImpl = Key extends string ? IsAny extends true ? never : T[Key] extends Record ? `${Key}.${PathImpl> & string}` | `${Key}.${Exclude & string}` : never : never; export type Path = keyof T extends string ? (PathImpl | keyof T) extends infer P ? P extends string | keyof T ? P : keyof T : keyof T : never; export type PathValue> = P extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? Rest extends Path ? PathValue : never : never : P extends keyof T ? T[P] : never; export {};