type PropertyDescriptor = { value: any; writable?: boolean; enumerable?: boolean; configurable?: boolean; } | { get?(this: ThisT): T; set(this: ThisT, val: T): void; enumerable?: boolean; configurable?: boolean; } | { get(this: ThisT): T; set?(this: ThisT, val: T): void; enumerable?: boolean; configurable?: boolean; }; type Exclude = T extends U ? never : T; type Extract = T extends U ? T : never; type Record = { [x in KeyT]: ValT } type ReplaceFunc = (match: string, ...args: any[]) => string; type PromiseFulfillFunc = (val: T) => void; type PromiseThenFunc = (val: T) => NextT; type PromiseRejectFunc = (err: unknown) => void; type PromiseFunc = (resolve: PromiseFulfillFunc, reject: PromiseRejectFunc) => void; type PromiseResult ={ type: 'fulfilled'; value: T; } | { type: 'rejected'; reason: any; } // wippidy-wine, this code is now mine :D type Awaited = T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argument Awaited : // recursively unwrap the value never : // the argument to `then` was not callable T; type IteratorYieldResult = { done?: false; } & (TReturn extends undefined ? { value?: undefined; } : { value: TReturn; }); type IteratorReturnResult = { done: true } & (TReturn extends undefined ? { value?: undefined; } : { value: TReturn; }); type IteratorResult = IteratorYieldResult | IteratorReturnResult; interface Thenable { then(onFulfilled: PromiseThenFunc, onRejected?: PromiseRejectFunc): Promise>; then(onFulfilled: undefined, onRejected?: PromiseRejectFunc): Promise; } interface RegExpResultIndices extends Array<[number, number]> { groups?: { [name: string]: [number, number]; }; } interface RegExpResult extends Array { groups?: { [name: string]: string; }; index: number; input: string; indices?: RegExpResultIndices; escape(raw: string, flags: string): RegExp; } interface Matcher { [Symbol.match](target: string): RegExpResult | string[] | null; [Symbol.matchAll](target: string): IterableIterator; } interface Splitter { [Symbol.split](target: string, limit?: number, sensible?: boolean): string[]; } interface Replacer { [Symbol.replace](target: string, replacement: string | ReplaceFunc): string; } interface Searcher { [Symbol.search](target: string, reverse?: boolean, start?: number): number; } type FlatArray = { "done": Arr, "recur": Arr extends Array ? FlatArray : Arr }[Depth extends -1 ? "done" : "recur"]; interface IArguments { [i: number]: any; length: number; } interface Iterator { next(...args: [] | [TNext]): IteratorResult; return?(value?: TReturn): IteratorResult; throw?(e?: any): IteratorResult; } interface Iterable { [Symbol.iterator](): Iterator; } interface IterableIterator extends Iterator { [Symbol.iterator](): IterableIterator; } interface AsyncIterator { next(...args: [] | [TNext]): Promise>; return?(value?: TReturn | Thenable): Promise>; throw?(e?: any): Promise>; } interface AsyncIterable { [Symbol.asyncIterator](): AsyncIterator; } interface AsyncIterableIterator extends AsyncIterator { [Symbol.asyncIterator](): AsyncIterableIterator; } interface Generator extends Iterator { [Symbol.iterator](): Generator; return(value: TReturn): IteratorResult; throw(e: any): IteratorResult; } interface GeneratorFunction { new (...args: any[]): Generator; (...args: any[]): Generator; readonly length: number; readonly name: string; readonly prototype: Generator; } interface AsyncGenerator extends AsyncIterator { return(value: TReturn | Thenable): Promise>; throw(e: any): Promise>; [Symbol.asyncIterator](): AsyncGenerator; } interface AsyncGeneratorFunction { new (...args: any[]): AsyncGenerator; (...args: any[]): AsyncGenerator; readonly length: number; readonly name: string; readonly prototype: AsyncGenerator; } interface MathObject { readonly E: number; readonly PI: number; readonly SQRT2: number; readonly SQRT1_2: number; readonly LN2: number; readonly LN10: number; readonly LOG2E: number; readonly LOG10E: number; asin(x: number): number; acos(x: number): number; atan(x: number): number; atan2(y: number, x: number): number; asinh(x: number): number; acosh(x: number): number; atanh(x: number): number; sin(x: number): number; cos(x: number): number; tan(x: number): number; sinh(x: number): number; cosh(x: number): number; tanh(x: number): number; sqrt(x: number): number; cbrt(x: number): number; hypot(...vals: number[]): number; imul(a: number, b: number): number; exp(x: number): number; expm1(x: number): number; pow(x: number, y: number): number; log(x: number): number; log10(x: number): number; log1p(x: number): number; log2(x: number): number; ceil(x: number): number; floor(x: number): number; round(x: number): number; fround(x: number): number; trunc(x: number): number; abs(x: number): number; max(...vals: number[]): number; min(...vals: number[]): number; sign(x: number): number; random(): number; clz32(x: number): number; } interface Array extends IterableIterator { [i: number]: T; length: number; toString(): string; // toLocaleString(): string; join(separator?: string): string; fill(val: T, start?: number, end?: number): T[]; pop(): T | undefined; push(...items: T[]): number; concat(...items: (T | T[])[]): T[]; concat(...items: (T | T[])[]): T[]; join(separator?: string): string; reverse(): T[]; shift(): T | undefined; slice(start?: number, end?: number): T[]; sort(compareFn?: (a: T, b: T) => number): this; splice(start: number, deleteCount?: number | undefined, ...items: T[]): T[]; unshift(...items: T[]): number; indexOf(searchElement: T, fromIndex?: number): number; lastIndexOf(searchElement: T, fromIndex?: number): number; every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean; some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; includes(el: any, start?: number): boolean; map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]; find(predicate: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; findIndex(predicate: (value: T, index: number, array: T[]) => boolean, thisArg?: any): number; findLast(predicate: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; findLastIndex(predicate: (value: T, index: number, array: T[]) => boolean, thisArg?: any): number; flat(depth?: D): FlatArray; flatMap(func: (val: T, i: number, arr: T[]) => T | T[], thisAarg?: any): FlatArray; sort(func?: (a: T, b: T) => number): this; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T; reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; entries(): IterableIterator<[number, T]>; values(): IterableIterator; keys(): IterableIterator; } interface ArrayConstructor { new (arrayLength?: number): T[]; new (...items: T[]): T[]; (arrayLength?: number): T[]; (...items: T[]): T[]; isArray(arg: any): arg is any[]; prototype: Array; } interface Boolean { valueOf(): boolean; } interface BooleanConstructor { (val: any): boolean; new (val: any): Boolean; prototype: Boolean; } interface Error { name: string; message: string; stack: string[]; toString(): string; } interface ErrorConstructor { (msg?: any): Error; new (msg?: any): Error; prototype: Error; } interface TypeErrorConstructor extends ErrorConstructor { (msg?: any): TypeError; new (msg?: any): TypeError; prototype: Error; } interface TypeError extends Error { name: 'TypeError'; } interface RangeErrorConstructor extends ErrorConstructor { (msg?: any): RangeError; new (msg?: any): RangeError; prototype: Error; } interface RangeError extends Error { name: 'RangeError'; } interface SyntaxErrorConstructor extends ErrorConstructor { (msg?: any): RangeError; new (msg?: any): RangeError; prototype: Error; } interface SyntaxError extends Error { name: 'SyntaxError'; } interface Function { apply(this: Function, thisArg: any, argArray?: any): any; call(this: Function, thisArg: any, ...argArray: any[]): any; bind(this: Function, thisArg: any, ...argArray: any[]): Function; toString(): string; prototype: any; readonly length: number; name: string; } interface CallableFunction extends Function { (...args: any[]): any; apply(this: (this: ThisArg, ...args: Args) => RetT, thisArg: ThisArg, argArray?: Args): RetT; call(this: (this: ThisArg, ...args: Args) => RetT, thisArg: ThisArg, ...argArray: Args): RetT; bind(this: (this: ThisArg, ...args: [ ...Args, ...Rest ]) => RetT, thisArg: ThisArg, ...argArray: Args): (this: void, ...args: Rest) => RetT; } interface NewableFunction extends Function { new(...args: any[]): any; apply(this: new (...args: Args) => RetT, thisArg: any, argArray?: Args): RetT; call(this: new (...args: Args) => RetT, thisArg: any, ...argArray: Args): RetT; bind(this: new (...args: Args) => RetT, thisArg: any, ...argArray: Args): new (...args: Args) => RetT; } interface FunctionConstructor extends Function { (...args: string[]): (...args: any[]) => any; new (...args: string[]): (...args: any[]) => any; prototype: Function; async( func: (await: (val: T) => Awaited) => (...args: ArgsT) => RetT ): (...args: ArgsT) => Promise; asyncGenerator( func: (await: (val: T) => Awaited, _yield: (val: T) => void) => (...args: ArgsT) => RetT ): (...args: ArgsT) => AsyncGenerator; generator( func: (_yield: (val: T) => TNext) => (...args: ArgsT) => RetT ): (...args: ArgsT) => Generator; } interface Number { toString(): string; valueOf(): number; } interface NumberConstructor { (val: any): number; new (val: any): Number; prototype: Number; parseInt(val: unknown): number; parseFloat(val: unknown): number; } interface Object { constructor: NewableFunction; [Symbol.typeName]: string; valueOf(): this; toString(): string; hasOwnProperty(key: any): boolean; } interface ObjectConstructor extends Function { (arg: string): String; (arg: number): Number; (arg: boolean): Boolean; (arg?: undefined | null): {}; (arg: T): T; new (arg: string): String; new (arg: number): Number; new (arg: boolean): Boolean; new (arg?: undefined | null): {}; new (arg: T): T; prototype: Object; assign(target: T, ...src: object[]): T; create(proto: T, props?: { [key: string]: PropertyDescriptor }): T; keys(obj: T, onlyString?: true): (keyof T)[]; keys(obj: T, onlyString: false): any[]; entries(obj: T, onlyString?: true): [keyof T, T[keyof T]][]; entries(obj: T, onlyString: false): [any, any][]; values(obj: T, onlyString?: true): (T[keyof T])[]; values(obj: T, onlyString: false): any[]; fromEntries(entries: Iterable<[any, any]>): object; defineProperty(obj: ThisT, key: any, desc: PropertyDescriptor): ThisT; defineProperties(obj: ThisT, desc: { [key: string]: PropertyDescriptor }): ThisT; getOwnPropertyNames(obj: T): (keyof T)[]; getOwnPropertySymbols(obj: T): (keyof T)[]; hasOwn(obj: T, key: KeyT): boolean; getOwnPropertyDescriptor(obj: T, key: KeyT): PropertyDescriptor; getOwnPropertyDescriptors(obj: T): { [x in keyof T]: PropertyDescriptor }; getPrototypeOf(obj: any): object | null; setPrototypeOf(obj: T, proto: object | null): T; preventExtensions(obj: T): T; seal(obj: T): T; freeze(obj: T): T; isExtensible(obj: object): boolean; isSealed(obj: object): boolean; isFrozen(obj: object): boolean; } interface String { [i: number]: string; toString(): string; valueOf(): string; charAt(pos: number): string; charCodeAt(pos: number): number; substring(start?: number, end?: number): string; slice(start?: number, end?: number): string; substr(start?: number, length?: number): string; startsWith(str: string, pos?: number): string; endsWith(str: string, pos?: number): string; replace(pattern: string | Replacer, val: string | ReplaceFunc): string; replaceAll(pattern: string | Replacer, val: string | ReplaceFunc): string; match(pattern: string | Matcher): RegExpResult | string[] | null; matchAll(pattern: string | Matcher): IterableIterator; split(pattern: string | Splitter, limit?: number, sensible?: boolean): string; concat(...others: string[]): string; indexOf(term: string | Searcher, start?: number): number; lastIndexOf(term: string | Searcher, start?: number): number; toLowerCase(): string; toUpperCase(): string; trim(): string; includes(term: string, start?: number): boolean; length: number; } interface StringConstructor { (val: any): string; new (val: any): String; fromCharCode(val: number): string; prototype: String; } interface Symbol { valueOf(): symbol; } interface SymbolConstructor { (val?: any): symbol; new(...args: any[]): never; prototype: Symbol; for(key: string): symbol; keyFor(sym: symbol): string; readonly typeName: unique symbol; readonly match: unique symbol; readonly matchAll: unique symbol; readonly split: unique symbol; readonly replace: unique symbol; readonly search: unique symbol; readonly iterator: unique symbol; readonly asyncIterator: unique symbol; } interface Promise extends Thenable { catch(func: PromiseRejectFunc): Promise; finally(func: () => void): Promise; } interface PromiseConstructor { prototype: Promise; new (func: PromiseFunc): Promise>; resolve(val: T): Promise>; reject(val: any): Promise; isAwaitable(val: unknown): val is Thenable; any(promises: T[]): Promise>; race(promises: (Promise|T)[]): Promise; all(promises: T): Promise<{ [Key in keyof T]: Awaited }>; allSettled(...promises: T): Promise<[...{ [P in keyof T]: PromiseResult>}]>; } declare var String: StringConstructor; //@ts-ignore declare const arguments: IArguments; declare var NaN: number; declare var Infinity: number; declare var setTimeout: (handle: (...args: [ ...T, ...any[] ]) => void, delay?: number, ...args: T) => number; declare var setInterval: (handle: (...args: [ ...T, ...any[] ]) => void, delay?: number, ...args: T) => number; declare var clearTimeout: (id: number) => void; declare var clearInterval: (id: number) => void; declare var parseInt: typeof Number.parseInt; declare var parseFloat: typeof Number.parseFloat; declare function log(...vals: any[]): void; declare var Array: ArrayConstructor; declare var Boolean: BooleanConstructor; declare var Promise: PromiseConstructor; declare var Function: FunctionConstructor; declare var Number: NumberConstructor; declare var Object: ObjectConstructor; declare var Symbol: SymbolConstructor; declare var Promise: PromiseConstructor; declare var Math: MathObject; declare var Error: ErrorConstructor; declare var RangeError: RangeErrorConstructor; declare var TypeError: TypeErrorConstructor; declare var SyntaxError: SyntaxErrorConstructor; declare class Map { public [Symbol.iterator](): IterableIterator<[KeyT, ValueT]>; public clear(): void; public delete(key: KeyT): boolean; public entries(): IterableIterator<[KeyT, ValueT]>; public keys(): IterableIterator; public values(): IterableIterator; public get(key: KeyT): ValueT; public set(key: KeyT, val: ValueT): this; public has(key: KeyT): boolean; public get size(): number; public forEach(func: (key: KeyT, val: ValueT, map: Map) => void, thisArg?: any): void; public constructor(); } declare class Set { public [Symbol.iterator](): IterableIterator; public entries(): IterableIterator<[T, T]>; public keys(): IterableIterator; public values(): IterableIterator; public clear(): void; public add(val: T): this; public delete(val: T): boolean; public has(key: T): boolean; public get size(): number; public forEach(func: (key: T, set: Set) => void, thisArg?: any): void; public constructor(); } declare class RegExp implements Matcher, Splitter, Replacer, Searcher { static escape(raw: any, flags?: string): RegExp; prototype: RegExp; exec(val: string): RegExpResult | null; test(val: string): boolean; toString(): string; [Symbol.match](target: string): RegExpResult | string[] | null; [Symbol.matchAll](target: string): IterableIterator; [Symbol.split](target: string, limit?: number, sensible?: boolean): string[]; [Symbol.replace](target: string, replacement: string | ReplaceFunc): string; [Symbol.search](target: string, reverse?: boolean, start?: number): number; readonly dotAll: boolean; readonly global: boolean; readonly hasIndices: boolean; readonly ignoreCase: boolean; readonly multiline: boolean; readonly sticky: boolean; readonly unicode: boolean; readonly source: string; readonly flags: string; lastIndex: number; constructor(pattern?: string, flags?: string); constructor(pattern?: RegExp, flags?: string); }