long-stack-trace-zone.umd.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. 'use strict';
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. /**
  14. * @license Angular v<unknown>
  15. * (c) 2010-2022 Google LLC. https://angular.io/
  16. * License: MIT
  17. */
  18. (function (factory) {
  19. typeof define === 'function' && define.amd ? define(factory) :
  20. factory();
  21. })((function () {
  22. 'use strict';
  23. /**
  24. * @fileoverview
  25. * @suppress {globalThis}
  26. */
  27. var NEWLINE = '\n';
  28. var IGNORE_FRAMES = {};
  29. var creationTrace = '__creationTrace__';
  30. var ERROR_TAG = 'STACKTRACE TRACKING';
  31. var SEP_TAG = '__SEP_TAG__';
  32. var sepTemplate = SEP_TAG + '@[native]';
  33. var LongStackTrace = /** @class */ (function () {
  34. function LongStackTrace() {
  35. this.error = getStacktrace();
  36. this.timestamp = new Date();
  37. }
  38. return LongStackTrace;
  39. }());
  40. function getStacktraceWithUncaughtError() {
  41. return new Error(ERROR_TAG);
  42. }
  43. function getStacktraceWithCaughtError() {
  44. try {
  45. throw getStacktraceWithUncaughtError();
  46. }
  47. catch (err) {
  48. return err;
  49. }
  50. }
  51. // Some implementations of exception handling don't create a stack trace if the exception
  52. // isn't thrown, however it's faster not to actually throw the exception.
  53. var error = getStacktraceWithUncaughtError();
  54. var caughtError = getStacktraceWithCaughtError();
  55. var getStacktrace = error.stack ?
  56. getStacktraceWithUncaughtError :
  57. (caughtError.stack ? getStacktraceWithCaughtError : getStacktraceWithUncaughtError);
  58. function getFrames(error) {
  59. return error.stack ? error.stack.split(NEWLINE) : [];
  60. }
  61. function addErrorStack(lines, error) {
  62. var trace = getFrames(error);
  63. for (var i = 0; i < trace.length; i++) {
  64. var frame = trace[i];
  65. // Filter out the Frames which are part of stack capturing.
  66. if (!IGNORE_FRAMES.hasOwnProperty(frame)) {
  67. lines.push(trace[i]);
  68. }
  69. }
  70. }
  71. function renderLongStackTrace(frames, stack) {
  72. var longTrace = [stack ? stack.trim() : ''];
  73. if (frames) {
  74. var timestamp = new Date().getTime();
  75. for (var i = 0; i < frames.length; i++) {
  76. var traceFrames = frames[i];
  77. var lastTime = traceFrames.timestamp;
  78. var separator = "____________________Elapsed ".concat(timestamp - lastTime.getTime(), " ms; At: ").concat(lastTime);
  79. separator = separator.replace(/[^\w\d]/g, '_');
  80. longTrace.push(sepTemplate.replace(SEP_TAG, separator));
  81. addErrorStack(longTrace, traceFrames.error);
  82. timestamp = lastTime.getTime();
  83. }
  84. }
  85. return longTrace.join(NEWLINE);
  86. }
  87. // if Error.stackTraceLimit is 0, means stack trace
  88. // is disabled, so we don't need to generate long stack trace
  89. // this will improve performance in some test(some test will
  90. // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
  91. function stackTracesEnabled() {
  92. // Cast through any since this property only exists on Error in the nodejs
  93. // typings.
  94. return Error.stackTraceLimit > 0;
  95. }
  96. Zone['longStackTraceZoneSpec'] = {
  97. name: 'long-stack-trace',
  98. longStackTraceLimit: 10,
  99. // add a getLongStackTrace method in spec to
  100. // handle handled reject promise error.
  101. getLongStackTrace: function (error) {
  102. if (!error) {
  103. return undefined;
  104. }
  105. var trace = error[Zone.__symbol__('currentTaskTrace')];
  106. if (!trace) {
  107. return error.stack;
  108. }
  109. return renderLongStackTrace(trace, error.stack);
  110. },
  111. onScheduleTask: function (parentZoneDelegate, currentZone, targetZone, task) {
  112. if (stackTracesEnabled()) {
  113. var currentTask = Zone.currentTask;
  114. var trace = currentTask && currentTask.data && currentTask.data[creationTrace] || [];
  115. trace = [new LongStackTrace()].concat(trace);
  116. if (trace.length > this.longStackTraceLimit) {
  117. trace.length = this.longStackTraceLimit;
  118. }
  119. if (!task.data)
  120. task.data = {};
  121. if (task.type === 'eventTask') {
  122. // Fix issue https://github.com/angular/zone.js/issues/1195,
  123. // For event task of browser, by default, all task will share a
  124. // singleton instance of data object, we should create a new one here
  125. // The cast to `any` is required to workaround a closure bug which wrongly applies
  126. // URL sanitization rules to .data access.
  127. task.data = __assign({}, task.data);
  128. }
  129. task.data[creationTrace] = trace;
  130. }
  131. return parentZoneDelegate.scheduleTask(targetZone, task);
  132. },
  133. onHandleError: function (parentZoneDelegate, currentZone, targetZone, error) {
  134. if (stackTracesEnabled()) {
  135. var parentTask = Zone.currentTask || error.task;
  136. if (error instanceof Error && parentTask) {
  137. var longStack = renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
  138. try {
  139. error.stack = error.longStack = longStack;
  140. }
  141. catch (err) {
  142. }
  143. }
  144. }
  145. return parentZoneDelegate.handleError(targetZone, error);
  146. }
  147. };
  148. function captureStackTraces(stackTraces, count) {
  149. if (count > 0) {
  150. stackTraces.push(getFrames((new LongStackTrace()).error));
  151. captureStackTraces(stackTraces, count - 1);
  152. }
  153. }
  154. function computeIgnoreFrames() {
  155. if (!stackTracesEnabled()) {
  156. return;
  157. }
  158. var frames = [];
  159. captureStackTraces(frames, 2);
  160. var frames1 = frames[0];
  161. var frames2 = frames[1];
  162. for (var i = 0; i < frames1.length; i++) {
  163. var frame1 = frames1[i];
  164. if (frame1.indexOf(ERROR_TAG) == -1) {
  165. var match = frame1.match(/^\s*at\s+/);
  166. if (match) {
  167. sepTemplate = match[0] + SEP_TAG + ' (http://localhost)';
  168. break;
  169. }
  170. }
  171. }
  172. for (var i = 0; i < frames1.length; i++) {
  173. var frame1 = frames1[i];
  174. var frame2 = frames2[i];
  175. if (frame1 === frame2) {
  176. IGNORE_FRAMES[frame1] = true;
  177. }
  178. else {
  179. break;
  180. }
  181. }
  182. }
  183. computeIgnoreFrames();
  184. }));