/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */

/**
 * @fileoverview Externs for zone.js
 * @see https://github.com/angular/zone.js
 * @externs
 */

/**
 * @interface
 */
var Zone = function() {};
/**
 * @type {!Zone} The parent Zone.
 */
Zone.prototype.parent;
/**
 * @type {!string} The Zone name (useful for debugging)
 */
Zone.prototype.name;

Zone.assertZonePatched = function() {};

Zone.__symbol__ = function(name) {};

Zone.__load_patch = function(name, fn) {};

/**
 * @type {!Zone} Returns the current [Zone]. Returns the current zone. The only way to change
 * the current zone is by invoking a run() method, which will update the current zone for the
 * duration of the run method callback.
 */
Zone.current;

/**
 * @type {Task} The task associated with the current execution.
 */
Zone.currentTask;

/**
 *  @type {!Zone} Return the root zone.
 */
Zone.root;

/**
 * Returns a value associated with the `key`.
 *
 * If the current zone does not have a key, the request is delegated to the parent zone. Use
 * [ZoneSpec.properties] to configure the set of properties associated with the current zone.
 *
 * @param {!string} key The key to retrieve.
 * @returns {?} The value for the key, or `undefined` if not found.
 */
Zone.prototype.get = function(key) {};

/**
 * Returns a Zone which defines a `key`.
 *
 * Recursively search the parent Zone until a Zone which has a property `key` is found.
 *
 * @param {!string} key The key to use for identification of the returned zone.
 * @returns {?Zone} The Zone which defines the `key`, `null` if not found.
 */
Zone.prototype.getZoneWith = function(key) {};

/**
 * Used to create a child zone.
 *
 * @param {!ZoneSpec} zoneSpec A set of rules which the child zone should follow.
 * @returns {!Zone} A new child zone.
 */
Zone.prototype.fork = function(zoneSpec) {};

/**
 * Wraps a callback function in a new function which will properly restore the current zone upon
 * invocation.
 *
 * The wrapped function will properly forward `this` as well as `arguments` to the `callback`.
 *
 * Before the function is wrapped the zone can intercept the `callback` by declaring
 * [ZoneSpec.onIntercept].
 *
 * @param {!Function} callback the function which will be wrapped in the zone.
 * @param {!string=} source A unique debug location of the API being wrapped.
 * @returns {!Function} A function which will invoke the `callback` through [Zone.runGuarded].
 */
Zone.prototype.wrap = function(callback, source) {};

/**
 * Invokes a function in a given zone.
 *
 * The invocation of `callback` can be intercepted be declaring [ZoneSpec.onInvoke].
 *
 * @param {!Function} callback The function to invoke.
 * @param {?Object=} applyThis
 * @param {?Array=} applyArgs
 * @param {?string=} source A unique debug location of the API being invoked.
 * @returns {*} Value from the `callback` function.
 */
Zone.prototype.run = function(callback, applyThis, applyArgs, source) {};

/**
 * Invokes a function in a given zone and catches any exceptions.
 *
 * Any exceptions thrown will be forwarded to [Zone.HandleError].
 *
 * The invocation of `callback` can be intercepted be declaring [ZoneSpec.onInvoke]. The
 * handling of exceptions can intercepted by declaring [ZoneSpec.handleError].
 *
 * @param {!Function} callback The function to invoke.
 * @param {?Object=} applyThis
 * @param {?Array=} applyArgs
 * @param {?string=} source A unique debug location of the API being invoked.
 * @returns {*} Value from the `callback` function.
 */
Zone.prototype.runGuarded = function(callback, applyThis, applyArgs, source) {};

/**
 * Execute the Task by restoring the [Zone.currentTask] in the Task's zone.
 *
 * @param {!Task} task
 * @param {?Object=} applyThis
 * @param {?Array=} applyArgs
 * @returns {*}
 */
Zone.prototype.runTask = function(task, applyThis, applyArgs) {};

/**
 * @param {string} source
 * @param {!Function} callback
 * @param {?TaskData=} data
 * @param {?function(!Task)=} customSchedule
 * @return {!MicroTask} microTask
 */
Zone.prototype.scheduleMicroTask = function(source, callback, data, customSchedule) {};

/**
 * @param {string} source
 * @param {!Function} callback
 * @param {?TaskData=} data
 * @param {?function(!Task)=} customSchedule
 * @param {?function(!Task)=} customCancel
 * @return {!MacroTask} macroTask
 */
Zone.prototype.scheduleMacroTask = function(
    source, callback, data, customSchedule, customCancel) {};

/**
 * @param {string} source
 * @param {!Function} callback
 * @param {?TaskData=} data
 * @param {?function(!Task)=} customSchedule
 * @param {?function(!Task)=} customCancel
 * @return {!EventTask} eventTask
 */
Zone.prototype.scheduleEventTask = function(
    source, callback, data, customSchedule, customCancel) {};

/**
 * @param {!Task} task
 * @return {!Task} task
 */
Zone.prototype.scheduleTask = function(task) {};

/**
 * @param {!Task} task
 * @return {!Task} task
 */
Zone.prototype.cancelTask = function(task) {};

/**
 * @record
 */
var ZoneSpec = function() {};
/**
 * @type {!string} The name of the zone. Usefull when debugging Zones.
 */
ZoneSpec.prototype.name;

/**
 * @type {Object<string, Object>|undefined} A set of properties to be associated with Zone. Use
 * [Zone.get] to retrieve them.
 */
ZoneSpec.prototype.properties;

/**
 * Allows the interception of zone forking.
 *
 * When the zone is being forked, the request is forwarded to this method for interception.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, ZoneSpec): Zone
 * }
 */
ZoneSpec.prototype.onFork;

/**
 * Allows the interception of the wrapping of the callback.
 *
 * When the zone is being forked, the request is forwarded to this method for interception.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, Function, string): Function
 * }
 */
ZoneSpec.prototype.onIntercept;

/**
 * Allows interception of the callback invocation.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, Function, Object, Array, string): *
 * }
 */
ZoneSpec.prototype.onInvoke;

/**
 * Allows interception of the error handling.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, Object): boolean
 * }
 */
ZoneSpec.prototype.onHandleError;

/**
 * Allows interception of task scheduling.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, Task): Task
 * }
 */
ZoneSpec.prototype.onScheduleTask;

/**
 * Allows interception of task invoke.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, Task, Object, Array): *
 * }
 */
ZoneSpec.prototype.onInvokeTask;

/**
 * Allows interception of task cancelation.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, Task): *
 * }
 */
ZoneSpec.prototype.onCancelTask;
/**
 * Notifies of changes to the task queue empty status.
 *
 * @type {
 *   undefined|?function(ZoneDelegate, Zone, Zone, HasTaskState)
 * }
 */
ZoneSpec.prototype.onHasTask;

/**
 * @interface
 */
var ZoneDelegate = function() {};
/**
 * @type {!Zone} zone
 */
ZoneDelegate.prototype.zone;
/**
 * @param {!Zone} targetZone the [Zone] which originally received the request.
 * @param {!ZoneSpec} zoneSpec the argument passed into the `fork` method.
 * @returns {!Zone} the new forked zone
 */
ZoneDelegate.prototype.fork = function(targetZone, zoneSpec) {};
/**
 * @param {!Zone} targetZone the [Zone] which originally received the request.
 * @param {!Function} callback the callback function passed into `wrap` function
 * @param {string=} source the argument passed into the `wrap` method.
 * @returns {!Function}
 */
ZoneDelegate.prototype.intercept = function(targetZone, callback, source) {};

/**
 * @param {Zone} targetZone the [Zone] which originally received the request.
 * @param {!Function} callback the callback which will be invoked.
 * @param {?Object=} applyThis the argument passed into the `run` method.
 * @param {?Array=} applyArgs the argument passed into the `run` method.
 * @param {?string=} source the argument passed into the `run` method.
 * @returns {*}
 */
ZoneDelegate.prototype.invoke = function(targetZone, callback, applyThis, applyArgs, source) {};
/**
 * @param {!Zone} targetZone the [Zone] which originally received the request.
 * @param {!Object} error the argument passed into the `handleError` method.
 * @returns {boolean}
 */
ZoneDelegate.prototype.handleError = function(targetZone, error) {};
/**
 * @param {!Zone} targetZone the [Zone] which originally received the request.
 * @param {!Task} task the argument passed into the `scheduleTask` method.
 * @returns {!Task} task
 */
ZoneDelegate.prototype.scheduleTask = function(targetZone, task) {};
/**
 * @param {!Zone} targetZone The [Zone] which originally received the request.
 * @param {!Task} task The argument passed into the `scheduleTask` method.
 * @param {?Object=} applyThis The argument passed into the `run` method.
 * @param {?Array=} applyArgs The argument passed into the `run` method.
 * @returns {*}
 */
ZoneDelegate.prototype.invokeTask = function(targetZone, task, applyThis, applyArgs) {};
/**
 * @param {!Zone} targetZone The [Zone] which originally received the request.
 * @param {!Task} task The argument passed into the `cancelTask` method.
 * @returns {*}
 */
ZoneDelegate.prototype.cancelTask = function(targetZone, task) {};
/**
 * @param {!Zone} targetZone The [Zone] which originally received the request.
 * @param {!HasTaskState} hasTaskState
 */
ZoneDelegate.prototype.hasTask = function(targetZone, hasTaskState) {};

/**
 * @interface
 */
var HasTaskState = function() {};

/**
 * @type {boolean}
 */
HasTaskState.prototype.microTask;
/**
 * @type {boolean}
 */
HasTaskState.prototype.macroTask;
/**
 * @type {boolean}
 */
HasTaskState.prototype.eventTask;
/**
 * @type {TaskType}
 */
HasTaskState.prototype.change;

/**
 * @interface
 */
var TaskType = function() {};

/**
 * @interface
 */
var TaskState = function() {};

/**
 * @interface
 */
var TaskData = function() {};
/**
 * @type {boolean|undefined}
 */
TaskData.prototype.isPeriodic;
/**
 * @type {number|undefined}
 */
TaskData.prototype.delay;
/**
 * @type {number|undefined}
 */
TaskData.prototype.handleId;

/**
 * @interface
 */
var Task = function() {};
/**
 * @type {TaskType}
 */
Task.prototype.type;
/**
 * @type {TaskState}
 */
Task.prototype.state;
/**
 * @type {string}
 */
Task.prototype.source;
/**
 * @type {Function}
 */
Task.prototype.invoke;
/**
 * @type {Function}
 */
Task.prototype.callback;
/**
 * @type {TaskData}
 */
Task.prototype.data;
/**
 * @param {!Task} task
 */
Task.prototype.scheduleFn = function(task) {};
/**
 * @param {!Task} task
 */
Task.prototype.cancelFn = function(task) {};
/**
 * @type {Zone}
 */
Task.prototype.zone;
/**
 * @type {number}
 */
Task.prototype.runCount;
Task.prototype.cancelScheduleRequest = function() {};

/**
 * @interface
 * @extends {Task}
 */
var MicroTask = function() {};
/**
 * @interface
 * @extends {Task}
 */
var MacroTask = function() {};
/**
 * @interface
 * @extends {Task}
 */
var EventTask = function() {};

/**
 * @type {?string}
 */
Error.prototype.zoneAwareStack;

/**
 * @type {?string}
 */
Error.prototype.originalStack;
