/* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable @typescript-eslint/no-explicit-any */ // eslint-disable-next-line @typescript-eslint/triple-slash-reference /* eslint-disable @typescript-eslint/triple-slash-reference */ /// /// declare const enum UcType { null = 0, integer = 1, boolean = 2, string = 3, double = 4, array = 5, object = 6, regexp = 7, function = 8, // closure = 9, // upvalue = 10, // resource = 11, // program = 12, // source = 13 } declare type UcTypeToJs = UC extends UcType.null ? nil : UC extends UcType.integer ? int : UC extends UcType.boolean ? bool : UC extends UcType.string ? str : UC extends UcType.double ? double : UC extends UcType.array ? array : UC extends UcType.object ? obj : UC extends UcType.regexp ? regexp : UC extends UcType.function ? func : never; declare type UcTypeOfJs = T extends nil ? UcType.null : T extends int ? UcType.integer : T extends bool ? UcType.boolean : T extends str ? UcType.string : T extends double ? UcType.double : T extends array ? UcType.array : T extends obj ? UcType.object : T extends regexp ? UcType.regexp : T extends func ? UcType.function : never; declare type UcTypeToName = UC extends UcType.null ? null : UC extends UcType.integer ? 'int' : UC extends UcType.boolean ? 'bool' : UC extends UcType.string ? 'string' : UC extends UcType.double ? 'double' : UC extends UcType.array ? 'array' : UC extends UcType.object ? 'object' : UC extends UcType.regexp ? 'regexp' : UC extends UcType.function ? 'function' : never; declare type UcTypeOfName = UN extends null ? UcType.null : UN extends 'int' ? UcType.integer : UN extends 'bool' ? UcType.boolean : UN extends 'string' ? UcType.string : UN extends 'double' ? UcType.double : UN extends 'array' ? UcType.array : UN extends 'object' ? UcType.object : UN extends 'regexp' ? UcType.regexp : UN extends 'function' ? UcType.function : never; declare type UcNameOfJsType = T extends int | double ? 'int' | 'double' : T extends bool ? 'bool' : T extends str ? 'string' : T extends array ? 'array' : T extends regexp ? 'regexp' : T extends func ? 'function' : T extends obj ? 'object' : T extends nil ? null : never; declare type nil = null | undefined; declare type obj = Record; declare type bool = boolean; declare type int = number; declare type double = number; declare type str = string; declare type num = int | double; declare type numeric = num | str; declare type regexp = RegExp; declare type array = T[]; declare type func = (this: T, ...args: A[]) => R; declare type Exception = { type: str; message: str; stacktrace: { filename: str; line: int; byte: int; function?: str; context?: str; }[]; }; declare type UcTypeName = UcTypeToName; declare type uc_scalar = nil | bool | int | double | str | regexp; declare type uc_any = uc_scalar | obj | array | func; declare type uc_array = { readonly [n: number]: T; }; declare type $uc = js_type extends null | undefined ? nil : js_type extends (infer T)[] ? array : js_type extends (...args: any[]) => any ? func : js_type extends true | false | boolean ? bool : js_type extends number ? num : js_type extends RegExp ? regexp : js_type extends string ? str : js_type extends object | Record ? obj : never; /** fixes object types to transform optional props so that they can accept null as well */ declare type Nils = { [Key in keyof O]: Key extends OptionalPropertiesOf ? O[Key] | nil : O[Key]; }; declare type UcPartial = Nils>; declare type NilsToOptionals = Pick> & { [K in NullablePropertiesOf]?: NonNullable; }; declare type OptionalPropertiesOf = Exclude< { [K in keyof T]: T extends Record ? never : K; }[keyof T], undefined >; declare type NullablePropertiesOf = Exclude< { [K in keyof T]: T extends Record ? (null extends T[K] ? K : never) : K; }[keyof T], undefined >; declare type NonNullablePropertiesOf = Exclude< { [K in keyof T]: T extends Record ? (null extends T[K] ? never : K) : never; }[keyof T], undefined >;