/** * @license * Copyright Google Inc. 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 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory() : typeof define === 'function' && define.amd ? define(factory) : (factory()); }(this, (function () { 'use strict'; /** * @license * Copyright Google Inc. 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 */ var Zone$1 = (function (global) { if (global['Zone']) { throw new Error('Zone already loaded.'); } var Zone = (function () { function Zone(parent, zoneSpec) { this._properties = null; this._parent = parent; this._name = zoneSpec ? zoneSpec.name || 'unnamed' : ''; this._properties = zoneSpec && zoneSpec.properties || {}; this._zoneDelegate = new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec); } Zone.assertZonePatched = function () { if (global.Promise !== ZoneAwarePromise) { throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' + 'has been overwritten.\n' + 'Most likely cause is that a Promise polyfill has been loaded ' + 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' + 'If you must load one, do so before loading zone.js.)'); } }; Object.defineProperty(Zone, "current", { get: function () { return _currentZoneFrame.zone; }, enumerable: true, configurable: true }); Object.defineProperty(Zone, "currentTask", { get: function () { return _currentTask; }, enumerable: true, configurable: true }); Object.defineProperty(Zone.prototype, "parent", { get: function () { return this._parent; }, enumerable: true, configurable: true }); Object.defineProperty(Zone.prototype, "name", { get: function () { return this._name; }, enumerable: true, configurable: true }); Zone.prototype.get = function (key) { var zone = this.getZoneWith(key); if (zone) return zone._properties[key]; }; Zone.prototype.getZoneWith = function (key) { var current = this; while (current) { if (current._properties.hasOwnProperty(key)) { return current; } current = current._parent; } return null; }; Zone.prototype.fork = function (zoneSpec) { if (!zoneSpec) throw new Error('ZoneSpec required!'); return this._zoneDelegate.fork(this, zoneSpec); }; Zone.prototype.wrap = function (callback, source) { if (typeof callback !== 'function') { throw new Error('Expecting function got: ' + callback); } var _callback = this._zoneDelegate.intercept(this, callback, source); var zone = this; return function () { return zone.runGuarded(_callback, this, arguments, source); }; }; Zone.prototype.run = function (callback, applyThis, applyArgs, source) { if (applyThis === void 0) { applyThis = null; } if (applyArgs === void 0) { applyArgs = null; } if (source === void 0) { source = null; } _currentZoneFrame = new ZoneFrame(_currentZoneFrame, this); try { return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source); } finally { _currentZoneFrame = _currentZoneFrame.parent; } }; Zone.prototype.runGuarded = function (callback, applyThis, applyArgs, source) { if (applyThis === void 0) { applyThis = null; } if (applyArgs === void 0) { applyArgs = null; } if (source === void 0) { source = null; } _currentZoneFrame = new ZoneFrame(_currentZoneFrame, this); try { try { return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source); } catch (error) { if (this._zoneDelegate.handleError(this, error)) { throw error; } } } finally { _currentZoneFrame = _currentZoneFrame.parent; } }; Zone.prototype.runTask = function (task, applyThis, applyArgs) { task.runCount++; if (task.zone != this) throw new Error('A task can only be run in the zone which created it! (Creation: ' + task.zone.name + '; Execution: ' + this.name + ')'); var previousTask = _currentTask; _currentTask = task; _currentZoneFrame = new ZoneFrame(_currentZoneFrame, this); try { if (task.type == 'macroTask' && task.data && !task.data.isPeriodic) { task.cancelFn = null; } try { return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs); } catch (error) { if (this._zoneDelegate.handleError(this, error)) { throw error; } } } finally { _currentZoneFrame = _currentZoneFrame.parent; _currentTask = previousTask; } }; Zone.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) { return this._zoneDelegate.scheduleTask(this, new ZoneTask('microTask', this, source, callback, data, customSchedule, null)); }; Zone.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) { return this._zoneDelegate.scheduleTask(this, new ZoneTask('macroTask', this, source, callback, data, customSchedule, customCancel)); }; Zone.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) { return this._zoneDelegate.scheduleTask(this, new ZoneTask('eventTask', this, source, callback, data, customSchedule, customCancel)); }; Zone.prototype.cancelTask = function (task) { var value = this._zoneDelegate.cancelTask(this, task); task.runCount = -1; task.cancelFn = null; return value; }; return Zone; }()); Zone.__symbol__ = __symbol__; var ZoneDelegate = (function () { function ZoneDelegate(zone, parentDelegate, zoneSpec) { this._taskCounts = { microTask: 0, macroTask: 0, eventTask: 0 }; this.zone = zone; this._parentDelegate = parentDelegate; this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS); this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt); this._forkCurrZone = zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate.zone); this._interceptZS = zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS); this._interceptDlgt = zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt); this._interceptCurrZone = zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate.zone); this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS); this._invokeDlgt = zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt); this._invokeCurrZone = zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate.zone); this._handleErrorZS = zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS); this._handleErrorDlgt = zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt); this._handleErrorCurrZone = zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate.zone); this._scheduleTaskZS = zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS); this._scheduleTaskDlgt = zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt); this._scheduleTaskCurrZone = zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate.zone); this._invokeTaskZS = zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS); this._invokeTaskDlgt = zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt); this._invokeTaskCurrZone = zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate.zone); this._cancelTaskZS = zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS); this._cancelTaskDlgt = zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt); this._cancelTaskCurrZone = zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate.zone); this._hasTaskZS = zoneSpec && (zoneSpec.onHasTask ? zoneSpec : parentDelegate._hasTaskZS); this._hasTaskDlgt = zoneSpec && (zoneSpec.onHasTask ? parentDelegate : parentDelegate._hasTaskDlgt); this._hasTaskCurrZone = zoneSpec && (zoneSpec.onHasTask ? this.zone : parentDelegate.zone); } ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) { return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) : new Zone(targetZone, zoneSpec); }; ZoneDelegate.prototype.intercept = function (targetZone, callback, source) { return this._interceptZS ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) : callback; }; ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) { return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) : callback.apply(applyThis, applyArgs); }; ZoneDelegate.prototype.handleError = function (targetZone, error) { return this._handleErrorZS ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) : true; }; ZoneDelegate.prototype.scheduleTask = function (targetZone, task) { try { if (this._scheduleTaskZS) { return this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task); } else if (task.scheduleFn) { task.scheduleFn(task); } else if (task.type == 'microTask') { scheduleMicroTask(task); } else { throw new Error('Task is missing scheduleFn.'); } return task; } finally { if (targetZone == this.zone) { this._updateTaskCount(task.type, 1); } } }; ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) { try { return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) : task.callback.apply(applyThis, applyArgs); } finally { if (targetZone == this.zone && (task.type != 'eventTask') && !(task.data && task.data.isPeriodic)) { this._updateTaskCount(task.type, -1); } } }; ZoneDelegate.prototype.cancelTask = function (targetZone, task) { var value; if (this._cancelTaskZS) { value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task); } else if (!task.cancelFn) { throw new Error('Task does not support cancellation, or is already canceled.'); } else { value = task.cancelFn(task); } if (targetZone == this.zone) { // this should not be in the finally block, because exceptions assume not canceled. this._updateTaskCount(task.type, -1); } return value; }; ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) { return this._hasTaskZS && this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty); }; ZoneDelegate.prototype._updateTaskCount = function (type, count) { var counts = this._taskCounts; var prev = counts[type]; var next = counts[type] = prev + count; if (next < 0) { throw new Error('More tasks executed then were scheduled.'); } if (prev == 0 || next == 0) { var isEmpty = { microTask: counts.microTask > 0, macroTask: counts.macroTask > 0, eventTask: counts.eventTask > 0, change: type }; try { this.hasTask(this.zone, isEmpty); } finally { if (this._parentDelegate) { this._parentDelegate._updateTaskCount(type, count); } } } }; return ZoneDelegate; }()); var ZoneTask = (function () { function ZoneTask(type, zone, source, callback, options, scheduleFn, cancelFn) { this.runCount = 0; this.type = type; this.zone = zone; this.source = source; this.data = options; this.scheduleFn = scheduleFn; this.cancelFn = cancelFn; this.callback = callback; var self = this; this.invoke = function () { _numberOfNestedTaskFrames++; try { return zone.runTask(self, this, arguments); } finally { if (_numberOfNestedTaskFrames == 1) { drainMicroTaskQueue(); } _numberOfNestedTaskFrames--; } }; } ZoneTask.prototype.toString = function () { if (this.data && typeof this.data.handleId !== 'undefined') { return this.data.handleId; } else { return Object.prototype.toString.call(this); } }; // add toJSON method to prevent cyclic error when // call JSON.stringify(zoneTask) ZoneTask.prototype.toJSON = function () { return { type: this.type, source: this.source, data: this.data, zone: this.zone.name, invoke: this.invoke, scheduleFn: this.scheduleFn, cancelFn: this.cancelFn, runCount: this.runCount, callback: this.callback }; }; return ZoneTask; }()); var ZoneFrame = (function () { function ZoneFrame(parent, zone) { this.parent = parent; this.zone = zone; } return ZoneFrame; }()); function __symbol__(name) { return '__zone_symbol__' + name; } var symbolSetTimeout = __symbol__('setTimeout'); var symbolPromise = __symbol__('Promise'); var symbolThen = __symbol__('then'); var _currentZoneFrame = new ZoneFrame(null, new Zone(null, null)); var _currentTask = null; var _microTaskQueue = []; var _isDrainingMicrotaskQueue = false; var _uncaughtPromiseErrors = []; var _numberOfNestedTaskFrames = 0; function scheduleQueueDrain() { // if we are not running in any task, and there has not been anything scheduled // we must bootstrap the initial task creation by manually scheduling the drain if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) { // We are not running in Task, so we need to kickstart the microtask queue. if (global[symbolPromise]) { global[symbolPromise].resolve(0)[symbolThen](drainMicroTaskQueue); } else { global[symbolSetTimeout](drainMicroTaskQueue, 0); } } } function scheduleMicroTask(task) { scheduleQueueDrain(); _microTaskQueue.push(task); } function consoleError(e) { var rejection = e && e.rejection; if (rejection) { console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined); } console.error(e); } function drainMicroTaskQueue() { if (!_isDrainingMicrotaskQueue) { _isDrainingMicrotaskQueue = true; while (_microTaskQueue.length) { var queue = _microTaskQueue; _microTaskQueue = []; for (var i = 0; i < queue.length; i++) { var task = queue[i]; try { task.zone.runTask(task, null, null); } catch (e) { consoleError(e); } } } while (_uncaughtPromiseErrors.length) { var _loop_1 = function () { var uncaughtPromiseError = _uncaughtPromiseErrors.shift(); try { uncaughtPromiseError.zone.runGuarded(function () { throw uncaughtPromiseError; }); } catch (e) { consoleError(e); } }; while (_uncaughtPromiseErrors.length) { _loop_1(); } } _isDrainingMicrotaskQueue = false; } } function isThenable(value) { return value && value.then; } function forwardResolution(value) { return value; } function forwardRejection(rejection) { return ZoneAwarePromise.reject(rejection); } var symbolState = __symbol__('state'); var symbolValue = __symbol__('value'); var source = 'Promise.then'; var UNRESOLVED = null; var RESOLVED = true; var REJECTED = false; var REJECTED_NO_CATCH = 0; function makeResolver(promise, state) { return function (v) { resolvePromise(promise, state, v); // Do not return value or you will break the Promise spec. }; } function resolvePromise(promise, state, value) { if (promise[symbolState] === UNRESOLVED) { if (value instanceof ZoneAwarePromise && value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) && value[symbolState] !== UNRESOLVED) { clearRejectedNoCatch(value); resolvePromise(promise, value[symbolState], value[symbolValue]); } else if (isThenable(value)) { value.then(makeResolver(promise, state), makeResolver(promise, false)); } else { promise[symbolState] = state; var queue = promise[symbolValue]; promise[symbolValue] = value; for (var i = 0; i < queue.length;) { scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]); } if (queue.length == 0 && state == REJECTED) { promise[symbolState] = REJECTED_NO_CATCH; try { throw new Error('Uncaught (in promise): ' + value + (value && value.stack ? '\n' + value.stack : '')); } catch (e) { var error_1 = e; error_1.rejection = value; error_1.promise = promise; error_1.zone = Zone.current; error_1.task = Zone.currentTask; _uncaughtPromiseErrors.push(error_1); scheduleQueueDrain(); } } } } // Resolving an already resolved promise is a noop. return promise; } function clearRejectedNoCatch(promise) { if (promise[symbolState] === REJECTED_NO_CATCH) { promise[symbolState] = REJECTED; for (var i = 0; i < _uncaughtPromiseErrors.length; i++) { if (promise === _uncaughtPromiseErrors[i].promise) { _uncaughtPromiseErrors.splice(i, 1); break; } } } } function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) { clearRejectedNoCatch(promise); var delegate = promise[symbolState] ? onFulfilled || forwardResolution : onRejected || forwardRejection; zone.scheduleMicroTask(source, function () { try { resolvePromise(chainPromise, true, zone.run(delegate, null, [promise[symbolValue]])); } catch (error) { resolvePromise(chainPromise, false, error); } }); } var ZoneAwarePromise = (function () { function ZoneAwarePromise(executor) { var promise = this; if (!(promise instanceof ZoneAwarePromise)) { throw new Error('Must be an instanceof Promise.'); } promise[symbolState] = UNRESOLVED; promise[symbolValue] = []; // queue; try { executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED)); } catch (e) { resolvePromise(promise, false, e); } } ZoneAwarePromise.toString = function () { return 'function ZoneAwarePromise() { [native code] }'; }; ZoneAwarePromise.resolve = function (value) { return resolvePromise(new this(null), RESOLVED, value); }; ZoneAwarePromise.reject = function (error) { return resolvePromise(new this(null), REJECTED, error); }; ZoneAwarePromise.race = function (values) { var resolve; var reject; var promise = new this(function (res, rej) { _a = [res, rej], resolve = _a[0], reject = _a[1]; var _a; }); function onResolve(value) { promise && (promise = null || resolve(value)); } function onReject(error) { promise && (promise = null || reject(error)); } for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { var value = values_1[_i]; if (!isThenable(value)) { value = this.resolve(value); } value.then(onResolve, onReject); } return promise; }; ZoneAwarePromise.all = function (values) { var resolve; var reject; var promise = new this(function (res, rej) { resolve = res; reject = rej; }); var count = 0; var resolvedValues = []; for (var _i = 0, values_2 = values; _i < values_2.length; _i++) { var value = values_2[_i]; if (!isThenable(value)) { value = this.resolve(value); } value.then((function (index) { return function (value) { resolvedValues[index] = value; count--; if (!count) { resolve(resolvedValues); } }; })(count), reject); count++; } if (!count) resolve(resolvedValues); return promise; }; ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) { var chainPromise = new this.constructor(null); var zone = Zone.current; if (this[symbolState] == UNRESOLVED) { this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected); } else { scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected); } return chainPromise; }; ZoneAwarePromise.prototype.catch = function (onRejected) { return this.then(null, onRejected); }; return ZoneAwarePromise; }()); // Protect against aggressive optimizers dropping seemingly unused properties. // E.g. Closure Compiler in advanced mode. ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve; ZoneAwarePromise['reject'] = ZoneAwarePromise.reject; ZoneAwarePromise['race'] = ZoneAwarePromise.race; ZoneAwarePromise['all'] = ZoneAwarePromise.all; var NativePromise = global[__symbol__('Promise')] = global['Promise']; global['Promise'] = ZoneAwarePromise; function patchThen(NativePromise) { var NativePromiseProtototype = NativePromise.prototype; var NativePromiseThen = NativePromiseProtototype[__symbol__('then')] = NativePromiseProtototype.then; NativePromiseProtototype.then = function (onResolve, onReject) { var nativePromise = this; return new ZoneAwarePromise(function (resolve, reject) { NativePromiseThen.call(nativePromise, resolve, reject); }) .then(onResolve, onReject); }; } if (NativePromise) { patchThen(NativePromise); if (typeof global['fetch'] !== 'undefined') { var fetchPromise = void 0; try { // In MS Edge this throws fetchPromise = global['fetch'](); } catch (e) { // In Chrome this throws instead. fetchPromise = global['fetch']('about:blank'); } // ignore output to prevent error; fetchPromise.then(function () { return null; }, function () { return null; }); if (fetchPromise.constructor != NativePromise && fetchPromise.constructor != ZoneAwarePromise) { patchThen(fetchPromise.constructor); } } } // This is not part of public API, but it is usefull for tests, so we expose it. Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors; /* * This code patches Error so that: * - It ignores un-needed stack frames. * - It Shows the associated Zone for reach frame. */ var FrameType; (function (FrameType) { /// Skip this frame when printing out stack FrameType[FrameType["blackList"] = 0] = "blackList"; /// This frame marks zone transition FrameType[FrameType["transition"] = 1] = "transition"; })(FrameType || (FrameType = {})); var NativeError = global[__symbol__('Error')] = global.Error; // Store the frames which should be removed from the stack frames var blackListedStackFrames = {}; // We must find the frame where Error was created, otherwise we assume we don't understand stack var zoneAwareFrame; global.Error = ZoneAwareError; // How should the stack frames be parsed. var frameParserStrategy = null; var stackRewrite = 'stackRewrite'; // fix #595, create property descriptor // for error properties var createProperty = function (props, key) { // if property is already defined, skip it. if (props[key]) { return; } // define a local property // in case error property is not settable var name = __symbol__(key); props[key] = { configurable: true, enumerable: true, get: function () { // if local property has no value // use internal error's property value if (!this[name]) { var error_2 = this[__symbol__('error')]; if (error_2) { this[name] = error_2[key]; } } return this[name]; }, set: function (value) { // setter will set value to local property value this[name] = value; } }; }; // fix #595, create property descriptor // for error method properties var createMethodProperty = function (props, key) { if (props[key]) { return; } props[key] = { configurable: true, enumerable: true, writable: true, value: function () { var error = this[__symbol__('error')]; var errorMethod = (error && error[key]) || this[key]; if (errorMethod) { return errorMethod.apply(error, arguments); } } }; }; var createErrorProperties = function () { var props = Object.create(null); var error = new NativeError(); var keys = Object.getOwnPropertyNames(error); for (var i = 0; i < keys.length; i++) { var key = keys[i]; // Avoid bugs when hasOwnProperty is shadowed if (Object.prototype.hasOwnProperty.call(error, key)) { createProperty(props, key); } } var proto = NativeError.prototype; if (proto) { var pKeys = Object.getOwnPropertyNames(proto); for (var i = 0; i < pKeys.length; i++) { var key = pKeys[i]; // skip constructor if (key !== 'constructor' && key !== 'toString' && key !== 'toSource') { createProperty(props, key); } } } // some other properties are not // in NativeError createProperty(props, 'originalStack'); createProperty(props, 'zoneAwareStack'); // define toString, toSource as method property createMethodProperty(props, 'toString'); createMethodProperty(props, 'toSource'); return props; }; var errorProperties = createErrorProperties(); // for derived Error class which extends ZoneAwareError // we should not override the derived class's property // so we create a new props object only copy the properties // from errorProperties which not exist in derived Error's prototype var getErrorPropertiesForPrototype = function (prototype) { // if the prototype is ZoneAwareError.prototype // we just return the prebuilt errorProperties. if (prototype === ZoneAwareError.prototype) { return errorProperties; } var newProps = Object.create(null); var cKeys = Object.getOwnPropertyNames(errorProperties); var keys = Object.getOwnPropertyNames(prototype); cKeys.forEach(function (cKey) { if (keys.filter(function (key) { return key === cKey; }) .length === 0) { newProps[cKey] = errorProperties[cKey]; } }); return newProps; }; /** * This is ZoneAwareError which processes the stack frame and cleans up extra frames as well as * adds zone information to it. */ function ZoneAwareError() { // make sure we have a valid this // if this is undefined(call Error without new) or this is global // or this is some other objects, we should force to create a // valid ZoneAwareError by call Object.create() if (!(this instanceof ZoneAwareError)) { return ZoneAwareError.apply(Object.create(ZoneAwareError.prototype), arguments); } // Create an Error. var error = NativeError.apply(this, arguments); this[__symbol__('error')] = error; // Save original stack trace error.originalStack = error.stack; // Process the stack trace and rewrite the frames. if (ZoneAwareError[stackRewrite] && error.originalStack) { var frames_1 = error.originalStack.split('\n'); var zoneFrame = _currentZoneFrame; var i = 0; // Find the first frame while (frames_1[i] !== zoneAwareFrame && i < frames_1.length) { i++; } for (; i < frames_1.length && zoneFrame; i++) { var frame = frames_1[i]; if (frame.trim()) { var frameType = blackListedStackFrames.hasOwnProperty(frame) && blackListedStackFrames[frame]; if (frameType === FrameType.blackList) { frames_1.splice(i, 1); i--; } else if (frameType === FrameType.transition) { if (zoneFrame.parent) { // This is the special frame where zone changed. Print and process it accordingly frames_1[i] += " [" + zoneFrame.parent.zone.name + " => " + zoneFrame.zone.name + "]"; zoneFrame = zoneFrame.parent; } else { zoneFrame = null; } } else { frames_1[i] += " [" + zoneFrame.zone.name + "]"; } } } error.stack = error.zoneAwareStack = frames_1.join('\n'); } // use defineProperties here instead of copy property value // because of issue #595 which will break angular2. Object.defineProperties(this, getErrorPropertiesForPrototype(Object.getPrototypeOf(this))); return this; } // Copy the prototype so that instanceof operator works as expected ZoneAwareError.prototype = NativeError.prototype; ZoneAwareError[Zone.__symbol__('blacklistedStackFrames')] = blackListedStackFrames; ZoneAwareError[stackRewrite] = false; if (NativeError.hasOwnProperty('stackTraceLimit')) { // Extend default stack limit as we will be removing few frames. NativeError.stackTraceLimit = Math.max(NativeError.stackTraceLimit, 15); // make sure that ZoneAwareError has the same property which forwards to NativeError. Object.defineProperty(ZoneAwareError, 'stackTraceLimit', { get: function () { return NativeError.stackTraceLimit; }, set: function (value) { return NativeError.stackTraceLimit = value; } }); } if (NativeError.hasOwnProperty('captureStackTrace')) { Object.defineProperty(ZoneAwareError, 'captureStackTrace', { // add named function here because we need to remove this // stack frame when prepareStackTrace below value: function zoneCaptureStackTrace(targetObject, constructorOpt) { NativeError.captureStackTrace(targetObject, constructorOpt); } }); } Object.defineProperty(ZoneAwareError, 'prepareStackTrace', { get: function () { return NativeError.prepareStackTrace; }, set: function (value) { if (!value || typeof value !== 'function') { return NativeError.prepareStackTrace = value; } return NativeError.prepareStackTrace = function (error, structuredStackTrace) { // remove additional stack information from ZoneAwareError.captureStackTrace if (structuredStackTrace) { for (var i = 0; i < structuredStackTrace.length; i++) { var st = structuredStackTrace[i]; // remove the first function which name is zoneCaptureStackTrace if (st.getFunctionName() === 'zoneCaptureStackTrace') { structuredStackTrace.splice(i, 1); break; } } } return value.apply(this, [error, structuredStackTrace]); }; } }); // Now we need to populet the `blacklistedStackFrames` as well as find the // run/runGuraded/runTask frames. This is done by creating a detect zone and then threading // the execution through all of the above methods so that we can look at the stack trace and // find the frames of interest. var detectZone = Zone.current.fork({ name: 'detect', onInvoke: function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) { // Here only so that it will show up in the stack frame so that it can be black listed. return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source); }, onHandleError: function (parentZD, current, target, error) { if (error.originalStack && Error === ZoneAwareError) { var frames_2 = error.originalStack.split(/\n/); var runFrame = false, runGuardedFrame = false, runTaskFrame = false; while (frames_2.length) { var frame = frames_2.shift(); // On safari it is possible to have stack frame with no line number. // This check makes sure that we don't filter frames on name only (must have // linenumber) if (/:\d+:\d+/.test(frame)) { // Get rid of the path so that we don't accidintely find function name in path. // In chrome the seperator is `(` and `@` in FF and safari // Chrome: at Zone.run (zone.js:100) // Chrome: at Zone.run (http://localhost:9876/base/build/lib/zone.js:100:24) // FireFox: Zone.prototype.run@http://localhost:9876/base/build/lib/zone.js:101:24 // Safari: run@http://localhost:9876/base/build/lib/zone.js:101:24 var fnName = frame.split('(')[0].split('@')[0]; var frameType = FrameType.transition; if (fnName.indexOf('ZoneAwareError') !== -1) { zoneAwareFrame = frame; } if (fnName.indexOf('runGuarded') !== -1) { runGuardedFrame = true; } else if (fnName.indexOf('runTask') !== -1) { runTaskFrame = true; } else if (fnName.indexOf('run') !== -1) { runFrame = true; } else { frameType = FrameType.blackList; } blackListedStackFrames[frame] = frameType; // Once we find all of the frames we can stop looking. if (runFrame && runGuardedFrame && runTaskFrame) { ZoneAwareError[stackRewrite] = true; break; } } } } return false; } }); // carefully constructor a stack frame which contains all of the frames of interest which // need to be detected and blacklisted. var detectRunFn = function () { detectZone.run(function () { detectZone.runGuarded(function () { throw new Error('blacklistStackFrames'); }); }); }; // Cause the error to extract the stack frames. detectZone.runTask(detectZone.scheduleMacroTask('detect', detectRunFn, null, function () { return null; }, null)); return global['Zone'] = Zone; })(typeof window === 'object' && window || typeof self === 'object' && self || global); /** * @license * Copyright Google Inc. 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 */ /** * Suppress closure compiler errors about unknown 'Zone' variable * @fileoverview * @suppress {undefinedVars} */ var zoneSymbol = function (n) { return "__zone_symbol__" + n; }; var _global$1 = typeof window === 'object' && window || typeof self === 'object' && self || global; function bindArguments(args, source) { for (var i = args.length - 1; i >= 0; i--) { if (typeof args[i] === 'function') { args[i] = Zone.current.wrap(args[i], source + '_' + i); } } return args; } var isNode = (!('nw' in _global$1) && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'); var EVENT_TASKS = zoneSymbol('eventTasks'); // For EventTarget var ADD_EVENT_LISTENER = 'addEventListener'; var REMOVE_EVENT_LISTENER = 'removeEventListener'; function findExistingRegisteredTask(target, handler, name, capture, remove) { var eventTasks = target[EVENT_TASKS]; if (eventTasks) { for (var i = 0; i < eventTasks.length; i++) { var eventTask = eventTasks[i]; var data = eventTask.data; var listener = data.handler; if ((data.handler === handler || listener.listener === handler) && data.useCapturing === capture && data.eventName === name) { if (remove) { eventTasks.splice(i, 1); } return eventTask; } } } return null; } function findAllExistingRegisteredTasks(target, name, capture, remove) { var eventTasks = target[EVENT_TASKS]; if (eventTasks) { var result = []; for (var i = eventTasks.length - 1; i >= 0; i--) { var eventTask = eventTasks[i]; var data = eventTask.data; if (data.eventName === name && data.useCapturing === capture) { result.push(eventTask); if (remove) { eventTasks.splice(i, 1); } } } return result; } return null; } function attachRegisteredEvent(target, eventTask, isPrepend) { var eventTasks = target[EVENT_TASKS]; if (!eventTasks) { eventTasks = target[EVENT_TASKS] = []; } if (isPrepend) { eventTasks.unshift(eventTask); } else { eventTasks.push(eventTask); } } var defaultListenerMetaCreator = function (self, args) { return { useCapturing: args[2], eventName: args[0], handler: args[1], target: self || _global$1, name: args[0], invokeAddFunc: function (addFnSymbol, delegate) { if (delegate && delegate.invoke) { return this.target[addFnSymbol](this.eventName, delegate.invoke, this.useCapturing); } else { return this.target[addFnSymbol](this.eventName, delegate, this.useCapturing); } }, invokeRemoveFunc: function (removeFnSymbol, delegate) { if (delegate && delegate.invoke) { return this.target[removeFnSymbol](this.eventName, delegate.invoke, this.useCapturing); } else { return this.target[removeFnSymbol](this.eventName, delegate, this.useCapturing); } } }; }; function makeZoneAwareAddListener(addFnName, removeFnName, useCapturingParam, allowDuplicates, isPrepend, metaCreator) { if (useCapturingParam === void 0) { useCapturingParam = true; } if (allowDuplicates === void 0) { allowDuplicates = false; } if (isPrepend === void 0) { isPrepend = false; } if (metaCreator === void 0) { metaCreator = defaultListenerMetaCreator; } var addFnSymbol = zoneSymbol(addFnName); var removeFnSymbol = zoneSymbol(removeFnName); var defaultUseCapturing = useCapturingParam ? false : undefined; function scheduleEventListener(eventTask) { var meta = eventTask.data; attachRegisteredEvent(meta.target, eventTask, isPrepend); return meta.invokeAddFunc(addFnSymbol, eventTask); } function cancelEventListener(eventTask) { var meta = eventTask.data; findExistingRegisteredTask(meta.target, eventTask.invoke, meta.eventName, meta.useCapturing, true); return meta.invokeRemoveFunc(removeFnSymbol, eventTask); } return function zoneAwareAddListener(self, args) { var data = metaCreator(self, args); data.useCapturing = data.useCapturing || defaultUseCapturing; // - Inside a Web Worker, `this` is undefined, the context is `global` // - When `addEventListener` is called on the global context in strict mode, `this` is undefined // see https://github.com/angular/zone.js/issues/190 var delegate = null; if (typeof data.handler == 'function') { delegate = data.handler; } else if (data.handler && data.handler.handleEvent) { delegate = function (event) { return data.handler.handleEvent(event); }; } var validZoneHandler = false; try { // In cross site contexts (such as WebDriver frameworks like Selenium), // accessing the handler object here will cause an exception to be thrown which // will fail tests prematurely. validZoneHandler = data.handler && data.handler.toString() === '[object FunctionWrapper]'; } catch (e) { // Returning nothing here is fine, because objects in a cross-site context are unusable return; } // Ignore special listeners of IE11 & Edge dev tools, see // https://github.com/angular/zone.js/issues/150 if (!delegate || validZoneHandler) { return data.invokeAddFunc(addFnSymbol, data.handler); } if (!allowDuplicates) { var eventTask = findExistingRegisteredTask(data.target, data.handler, data.eventName, data.useCapturing, false); if (eventTask) { // we already registered, so this will have noop. return data.invokeAddFunc(addFnSymbol, eventTask); } } var zone = Zone.current; var source = data.target.constructor['name'] + '.' + addFnName + ':' + data.eventName; zone.scheduleEventTask(source, delegate, data, scheduleEventListener, cancelEventListener); }; } function makeZoneAwareRemoveListener(fnName, useCapturingParam, metaCreator) { if (useCapturingParam === void 0) { useCapturingParam = true; } if (metaCreator === void 0) { metaCreator = defaultListenerMetaCreator; } var symbol = zoneSymbol(fnName); var defaultUseCapturing = useCapturingParam ? false : undefined; return function zoneAwareRemoveListener(self, args) { var data = metaCreator(self, args); data.useCapturing = data.useCapturing || defaultUseCapturing; // - Inside a Web Worker, `this` is undefined, the context is `global` // - When `addEventListener` is called on the global context in strict mode, `this` is undefined // see https://github.com/angular/zone.js/issues/190 var eventTask = findExistingRegisteredTask(data.target, data.handler, data.eventName, data.useCapturing, true); if (eventTask) { eventTask.zone.cancelTask(eventTask); } else { data.invokeRemoveFunc(symbol, data.handler); } }; } function makeZoneAwareRemoveAllListeners(fnName, useCapturingParam) { if (useCapturingParam === void 0) { useCapturingParam = true; } var symbol = zoneSymbol(fnName); var defaultUseCapturing = useCapturingParam ? false : undefined; return function zoneAwareRemoveAllListener(self, args) { var target = self || _global$1; if (args.length === 0) { // remove all listeners without eventName target[EVENT_TASKS] = []; // we don't cancel Task either, because call native eventEmitter.removeAllListeners will // will do remove listener(cancelTask) for us target[symbol](); return; } var eventName = args[0]; var useCapturing = args[1] || defaultUseCapturing; // call this function just remove the related eventTask from target[EVENT_TASKS] findAllExistingRegisteredTasks(target, eventName, useCapturing, true); // we don't need useCapturing here because useCapturing is just for DOM, and // removeAllListeners should only be called by node eventEmitter // and we don't cancel Task either, because call native eventEmitter.removeAllListeners will // will do remove listener(cancelTask) for us target[symbol](eventName); }; } function makeZoneAwareListeners(fnName) { var symbol = zoneSymbol(fnName); return function zoneAwareEventListeners(self, args) { var eventName = args[0]; var target = self || _global$1; if (!target[EVENT_TASKS]) { return []; } return target[EVENT_TASKS] .filter(function (task) { return task.data.eventName === eventName; }) .map(function (task) { return task.data.handler; }); }; } var zoneAwareAddEventListener = makeZoneAwareAddListener(ADD_EVENT_LISTENER, REMOVE_EVENT_LISTENER); var zoneAwareRemoveEventListener = makeZoneAwareRemoveListener(REMOVE_EVENT_LISTENER); var originalInstanceKey = zoneSymbol('originalInstance'); // wrap some native API on `window` function createNamedFn(name, delegate) { try { return (Function('f', "return function " + name + "(){return f(this, arguments)}"))(delegate); } catch (e) { // if we fail, we must be CSP, just return delegate. return function () { return delegate(this, arguments); }; } } function patchMethod(target, name, patchFn) { var proto = target; while (proto && Object.getOwnPropertyNames(proto).indexOf(name) === -1) { proto = Object.getPrototypeOf(proto); } if (!proto && target[name]) { // somehow we did not find it, but we can see it. This happens on IE for Window properties. proto = target; } var delegateName = zoneSymbol(name); var delegate; if (proto && !(delegate = proto[delegateName])) { delegate = proto[delegateName] = proto[name]; proto[name] = createNamedFn(name, patchFn(delegate, delegateName, name)); } return delegate; } // TODO: support cancel task later if necessary function patchMacroTask(obj, funcName, metaCreator) { var setNative = null; function scheduleTask(task) { var data = task.data; data.args[data.callbackIndex] = function () { task.invoke.apply(this, arguments); }; setNative.apply(data.target, data.args); return task; } setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) { var meta = metaCreator(self, args); if (meta.callbackIndex >= 0 && typeof args[meta.callbackIndex] === 'function') { var task = Zone.current.scheduleMacroTask(meta.name, args[meta.callbackIndex], meta, scheduleTask, null); return task; } else { // cause an error by calling it directly. return delegate.apply(self, args); } }; }); } /** * @license * Copyright Google Inc. 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 */ var callAndReturnFirstParam = function (fn) { return function (self, args) { fn(self, args); return self; }; }; // For EventEmitter var EE_ADD_LISTENER = 'addListener'; var EE_PREPEND_LISTENER = 'prependListener'; var EE_REMOVE_LISTENER = 'removeListener'; var EE_REMOVE_ALL_LISTENER = 'removeAllListeners'; var EE_LISTENERS = 'listeners'; var EE_ON = 'on'; var zoneAwareAddListener$1 = callAndReturnFirstParam(makeZoneAwareAddListener(EE_ADD_LISTENER, EE_REMOVE_LISTENER, false, true, false)); var zoneAwarePrependListener = callAndReturnFirstParam(makeZoneAwareAddListener(EE_PREPEND_LISTENER, EE_REMOVE_LISTENER, false, true, true)); var zoneAwareRemoveListener$1 = callAndReturnFirstParam(makeZoneAwareRemoveListener(EE_REMOVE_LISTENER, false)); var zoneAwareRemoveAllListeners = callAndReturnFirstParam(makeZoneAwareRemoveAllListeners(EE_REMOVE_ALL_LISTENER, false)); var zoneAwareListeners = makeZoneAwareListeners(EE_LISTENERS); function patchEventEmitterMethods(obj) { if (obj && obj.addListener) { patchMethod(obj, EE_ADD_LISTENER, function () { return zoneAwareAddListener$1; }); patchMethod(obj, EE_PREPEND_LISTENER, function () { return zoneAwarePrependListener; }); patchMethod(obj, EE_REMOVE_LISTENER, function () { return zoneAwareRemoveListener$1; }); patchMethod(obj, EE_REMOVE_ALL_LISTENER, function () { return zoneAwareRemoveAllListeners; }); patchMethod(obj, EE_LISTENERS, function () { return zoneAwareListeners; }); obj[EE_ON] = obj[EE_ADD_LISTENER]; return true; } else { return false; } } // EventEmitter var events; try { events = require('events'); } catch (err) { } if (events && events.EventEmitter) { patchEventEmitterMethods(events.EventEmitter.prototype); } /** * @license * Copyright Google Inc. 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 */ var fs; try { fs = require('fs'); } catch (err) { } // watch, watchFile, unwatchFile has been patched // because EventEmitter has been patched var TO_PATCH_MACROTASK_METHODS = [ 'access', 'appendFile', 'chmod', 'chown', 'close', 'exists', 'fchmod', 'fchown', 'fdatasync', 'fstat', 'fsync', 'ftruncate', 'futimes', 'lchmod', 'lchown', 'link', 'lstat', 'mkdir', 'mkdtemp', 'open', 'read', 'readdir', 'readFile', 'readlink', 'realpath', 'rename', 'rmdir', 'stat', 'symlink', 'truncate', 'unlink', 'utimes', 'write', 'writeFile', ]; if (fs) { TO_PATCH_MACROTASK_METHODS.filter(function (name) { return !!fs[name] && typeof fs[name] === 'function'; }) .forEach(function (name) { patchMacroTask(fs, name, function (self, args) { return { name: 'fs.' + name, args: args, callbackIndex: args.length > 0 ? args.length - 1 : -1, target: self }; }); }); } /** * @license * Copyright Google Inc. 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 */ function patchTimer(window, setName, cancelName, nameSuffix) { var setNative = null; var clearNative = null; setName += nameSuffix; cancelName += nameSuffix; var tasksByHandleId = {}; function scheduleTask(task) { var data = task.data; data.args[0] = function () { task.invoke.apply(this, arguments); delete tasksByHandleId[data.handleId]; }; data.handleId = setNative.apply(window, data.args); tasksByHandleId[data.handleId] = task; return task; } function clearTask(task) { delete tasksByHandleId[task.data.handleId]; return clearNative(task.data.handleId); } setNative = patchMethod(window, setName, function (delegate) { return function (self, args) { if (typeof args[0] === 'function') { var zone = Zone.current; var options = { handleId: null, isPeriodic: nameSuffix === 'Interval', delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 : null, args: args }; var task = zone.scheduleMacroTask(setName, args[0], options, scheduleTask, clearTask); if (!task) { return task; } // Node.js must additionally support the ref and unref functions. var handle = task.data.handleId; if (handle.ref && handle.unref) { task.ref = handle.ref.bind(handle); task.unref = handle.unref.bind(handle); } return task; } else { // cause an error by calling it directly. return delegate.apply(window, args); } }; }); clearNative = patchMethod(window, cancelName, function (delegate) { return function (self, args) { var task = typeof args[0] === 'number' ? tasksByHandleId[args[0]] : args[0]; if (task && typeof task.type === 'string') { if (task.cancelFn && task.data.isPeriodic || task.runCount === 0) { // Do not cancel already canceled functions task.zone.cancelTask(task); } } else { // cause an error by calling it directly. delegate.apply(window, args); } }; }); } /** * @license * Copyright Google Inc. 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 */ var set = 'set'; var clear = 'clear'; var _global = typeof window === 'object' && window || typeof self === 'object' && self || global; // Timers var timers = require('timers'); patchTimer(timers, set, clear, 'Timeout'); patchTimer(timers, set, clear, 'Interval'); patchTimer(timers, set, clear, 'Immediate'); var shouldPatchGlobalTimers = global.setTimeout !== timers.setTimeout; if (shouldPatchGlobalTimers) { patchTimer(_global, set, clear, 'Timeout'); patchTimer(_global, set, clear, 'Interval'); patchTimer(_global, set, clear, 'Immediate'); } patchNextTick(); // Crypto var crypto; try { crypto = require('crypto'); } catch (err) { } // TODO(gdi2290): implement a better way to patch these methods if (crypto) { var nativeRandomBytes_1 = crypto.randomBytes; crypto.randomBytes = function randomBytesZone(size, callback) { if (!callback) { return nativeRandomBytes_1(size); } else { var zone = Zone.current; var source = crypto.constructor.name + '.randomBytes'; return nativeRandomBytes_1(size, zone.wrap(callback, source)); } }.bind(crypto); var nativePbkdf2_1 = crypto.pbkdf2; crypto.pbkdf2 = function pbkdf2Zone() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var fn = args[args.length - 1]; if (typeof fn === 'function') { var zone = Zone.current; var source = crypto.constructor.name + '.pbkdf2'; args[args.length - 1] = zone.wrap(fn, source); return nativePbkdf2_1.apply(void 0, args); } else { return nativePbkdf2_1.apply(void 0, args); } }.bind(crypto); } // HTTP Client var httpClient; try { httpClient = require('_http_client'); } catch (err) { } if (httpClient && httpClient.ClientRequest) { var ClientRequest_1 = httpClient.ClientRequest.bind(httpClient); httpClient.ClientRequest = function (options, callback) { if (!callback) { return new ClientRequest_1(options); } else { var zone = Zone.current; return new ClientRequest_1(options, zone.wrap(callback, 'http.ClientRequest')); } }; } function patchNextTick() { var setNative = null; function scheduleTask(task) { var args = task.data; args[0] = function () { task.invoke.apply(this, arguments); }; setNative.apply(process, args); return task; } setNative = patchMethod(process, 'nextTick', function (delegate) { return function (self, args) { if (typeof args[0] === 'function') { var zone = Zone.current; var task = zone.scheduleMicroTask('nextTick', args[0], args, scheduleTask); return task; } else { // cause an error by calling it directly. return delegate.apply(process, args); } }; }); } })));