// These types are derived in large part from the Microsoft-supplied types for // ES2015 Promises. They have been tweaked to support RSVP's extensions to the // Promises A+ spec and the additional helper functions it supplies. declare namespace RSVP { // All the Promise methods essentially flatten existing promises, so that // you don't end up with `Promise>>` if you happen // to return another `Promise` from a `.then()` invocation, etc. So all of // them can take a type or a promise-like/then-able type. type Arg = T | PromiseLike; // RSVP supplies status for promises in certain places. enum State { fulfilled = "fulfilled", rejected = "rejected", pending = "pending", } type Resolved = { state: State.fulfilled; value: T; }; type Rejected = { state: State.rejected; reason: T; }; type Pending = { state: State.pending; }; type PromiseState = Resolved | Rejected | Pending; type Deferred = { promise: Promise; resolve: (value?: RSVP.Arg) => void; reject: (reason?: any) => void; }; interface InstrumentEvent { guid: string; // guid of promise. Must be globally unique, not just within the implementation childGuid: string; // child of child promise (for chained via `then`) eventName: string; // one of ['created', 'chained', 'fulfilled', 'rejected'] detail: any; // fulfillment value or rejection reason, if applicable label: string; // label passed to promise's constructor timeStamp: number; // milliseconds elapsed since 1 January 1970 00:00:00 UTC up until now } interface ObjectWithEventMixins { on( eventName: "created" | "chained" | "fulfilled" | "rejected", listener: (event: InstrumentEvent) => void, ): void; on(eventName: "error", errorHandler: (reason: any) => void): void; on(eventName: string, callback: (value: any) => void): void; off(eventName: string, callback?: (value: any) => void): void; trigger(eventName: string, options?: any, label?: string): void; } class EventTarget { /** `RSVP.EventTarget.mixin` extends an object with EventTarget methods. */ static mixin(object: object): ObjectWithEventMixins; /** Registers a callback to be executed when `eventName` is triggered */ static on( eventName: "created" | "chained" | "fulfilled" | "rejected", listener: (event: InstrumentEvent) => void, ): void; static on(eventName: "error", errorHandler: (reason: any) => void): void; static on(eventName: string, callback: (value: any) => void): void; /** * You can use `off` to stop firing a particular callback for an event. * * If you don't pass a `callback` argument to `off`, ALL callbacks for the * event will not be executed when the event fires. */ static off(eventName: string, callback?: (value: any) => void): void; /** * Use `trigger` to fire custom events. * * You can also pass a value as a second argument to `trigger` that will be * passed as an argument to all event listeners for the event */ static trigger(eventName: string, options?: any, label?: string): void; } class Promise implements PromiseLike { constructor( executor: (resolve: (value?: RSVP.Arg) => void, reject: (reason?: any) => void) => void, label?: string, ); new( executor: (resolve: (value?: RSVP.Arg) => void, reject: (reason?: any) => void) => void, ): RSVP.Promise; then( onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, onRejected?: ((reason: any) => TResult2 | PromiseLike) | null, label?: string, ): RSVP.Promise; catch( onRejected?: ((reason: any) => TResult | PromiseLike) | null, label?: string, ): RSVP.Promise; finally(onFinally?: U | PromiseLike): RSVP.Promise; readonly [Symbol.toStringTag]: "Promise"; static all( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; static all( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; static all( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; static all( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4, T5, T6, T7]>; static all( values: [Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4, T5, T6]>; static all( values: [Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4, T5]>; static all( values: [Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[T1, T2, T3, T4]>; static all(values: [Arg, Arg, Arg], label?: string): RSVP.Promise<[T1, T2, T3]>; static all(values: [Arg, Arg], label?: string): Promise<[T1, T2]>; static all(values: Array>, label?: string): RSVP.Promise; static race( values: [ Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, T10 | PromiseLike, ], label?: string, ): RSVP.Promise; static race( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise; static race( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise; static race( values: [Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise; static race( values: [Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise; static race( values: [Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise; static race( values: [Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise; static race(values: [Arg, Arg, Arg], label?: string): RSVP.Promise; static race(values: [Arg, Arg], label?: string): RSVP.Promise; static race(values: Array>, label?: string): RSVP.Promise; static reject(reason?: any, label?: string): RSVP.Promise; static resolve(value?: Arg, label?: string): RSVP.Promise; static resolve(): RSVP.Promise; /** * @deprecated */ static cast: typeof RSVP.Promise.resolve; } const all: typeof Promise.all; const race: typeof Promise.race; const reject: typeof Promise.reject; const resolve: typeof Promise.resolve; function rethrow(reason: any): void; const cast: typeof Promise.cast; const on: typeof EventTarget.on; const off: typeof EventTarget.off; // ----- denodeify ----- // // Here be absurd things because we don't have variadic types. All of // this will go away if we can ever write this: // // denodeify<...T, ...A>( // nodeFunc: (...args: ...A, callback: (err: any, ...cbArgs: ...T) => any) => void, // options?: false // ): (...args: ...A) => RSVP.Promise<...T> // // That day, however, may never come. So, in the meantime, we do this. function denodeify( nodeFunc: (arg1: A, callback: (err: any, data1: T1, data2: T2, data3: T3) => void) => void, options?: false, ): (arg1: A) => RSVP.Promise; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data1: T1, data2: T2) => void) => void, options?: false, ): (arg1: A) => RSVP.Promise; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data: T) => void) => void, options?: false, ): (arg1: A) => RSVP.Promise; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data1: T1, data2: T2, data3: T3) => void) => void, options: true, ): (arg1: A) => RSVP.Promise<[T1, T2, T3]>; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data1: T1, data2: T2) => void) => void, options: true, ): (arg1: A) => RSVP.Promise<[T1, T2]>; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data: T) => void) => void, options: true, ): (arg1: A) => RSVP.Promise<[T]>; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data1: T1, data2: T2, data3: T3) => void) => void, options: [K1, K2, K3], ): (arg1: A) => RSVP.Promise<{ [K in K1]: T1 } & { [K in K2]: T2 } & { [K in K3]: T3 }>; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data1: T1, data2: T2) => void) => void, options: [K1, K2], ): (arg1: A) => RSVP.Promise<{ [K in K1]: T1 } & { [K in K2]: T2 }>; function denodeify( nodeFunc: (arg1: A, callback: (err: any, data: T) => void) => void, options: [K1], ): (arg1: A) => RSVP.Promise<{ [K in K1]: T }>; // ----- hash and hashSettled ----- // function hash(object: { [P in keyof T]: Arg }, label?: string): RSVP.Promise; function hashSettled( object: { [P in keyof T]: Arg }, label?: string, ): RSVP.Promise<{ [P in keyof T]: PromiseState }>; function allSettled( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise< [ PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, ] >; function allSettled( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise< [ PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, ] >; function allSettled( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise< [ PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, ] >; function allSettled( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise< [ PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, ] >; function allSettled( entries: [Arg, Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise< [PromiseState, PromiseState, PromiseState, PromiseState, PromiseState, PromiseState] >; function allSettled( entries: [Arg, Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[PromiseState, PromiseState, PromiseState, PromiseState, PromiseState]>; function allSettled( entries: [Arg, Arg, Arg, Arg], label?: string, ): RSVP.Promise<[PromiseState, PromiseState, PromiseState, PromiseState]>; function allSettled( entries: [Arg, Arg, Arg], label?: string, ): RSVP.Promise<[PromiseState, PromiseState, PromiseState]>; function allSettled( entries: [Arg, Arg], label?: string, ): RSVP.Promise<[PromiseState, PromiseState]>; function allSettled(entries: Array>, label?: string): RSVP.Promise<[PromiseState]>; function map( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4 | T5 | T6) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4 | T5) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3 | T4) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg, Arg], mapFn: (item: T1 | T2 | T3) => U, label?: string, ): RSVP.Promise; function map( entries: [Arg, Arg], mapFn: (item: T1 | T2) => U, label?: string, ): RSVP.Promise; function map( entries: Array>, mapFn: (item: T) => U, label?: string, ): RSVP.Promise; function filter( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg, Arg, Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4 | T5 | T6 | T7) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg, Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4 | T5 | T6) => boolean, label?: string, ): RSVP.Promise & { length: 6 }>; function filter( entries: [Arg, Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4 | T5) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3 | T4) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg, Arg], filterFn: (item: T1 | T2 | T3) => boolean, label?: string, ): RSVP.Promise>; function filter( entries: [Arg, Arg], filterFn: (item: T1 | T2) => boolean, label?: string, ): RSVP.Promise>; function filter(entries: Array>, filterFn: (item: T) => boolean, label?: string): RSVP.Promise; function defer(label?: string): Deferred; function configure(name: string): T; function configure(name: string, value: T): void; function asap(callback: (callbackArg: T) => U, arg: T): void; const async: typeof asap; } export default RSVP; export interface Promise extends RSVP.Promise {} export const Promise: typeof RSVP.Promise; export interface EventTarget extends RSVP.EventTarget {} export const EventTarget: typeof RSVP.EventTarget; export const asap: typeof RSVP.asap; export const cast: typeof RSVP.cast; export const all: typeof RSVP.all; export const allSettled: typeof RSVP.allSettled; export const race: typeof RSVP.race; export const hash: typeof RSVP.hash; export const hashSettled: typeof RSVP.hashSettled; export const rethrow: typeof RSVP.rethrow; export const defer: typeof RSVP.defer; export const denodeify: typeof RSVP.denodeify; export const configure: typeof RSVP.configure; export const on: typeof RSVP.on; export const off: typeof RSVP.off; export const resolve: typeof RSVP.resolve; export const reject: typeof RSVP.reject; export const map: typeof RSVP.map; export const async: typeof RSVP.async; export const filter: typeof RSVP.filter;