UNPKG

react-admin-kit

Version:

A react based UI components for admin system

166 lines (161 loc) 6.76 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.setupGlobalErrorHandling = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper")); // 类型定义 // 扩展全局 Error 构造函数的类型定义 // 扩展的错误类 var ExtendedError = /*#__PURE__*/function (_Error) { (0, _inherits2.default)(ExtendedError, _Error); var _super = (0, _createSuper2.default)(ExtendedError); function ExtendedError(message) { var _this; (0, _classCallCheck2.default)(this, ExtendedError); _this = _super.call(this, message); _this.name = _this.constructor.name; if (Error.captureStackTrace) { Error.captureStackTrace((0, _assertThisInitialized2.default)(_this), _this.constructor); } return _this; } return (0, _createClass2.default)(ExtendedError); }( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error)); // 简化的警告配置,直接添加需要忽略的消息字符串即可 var IGNORED_WARNING_MESSAGES = ['`bordered` is deprecated', 'Warning: findDOMNode is deprecated', 'antd: Form.Item']; // 默认配置 var DEFAULT_CONFIG = { maxErrorsPerSecond: 10, enableConsoleOverride: true, ignoredWarnings: IGNORED_WARNING_MESSAGES }; // 简化的警告过滤器 var WarningFilter = /*#__PURE__*/function () { function WarningFilter() { (0, _classCallCheck2.default)(this, WarningFilter); } (0, _createClass2.default)(WarningFilter, null, [{ key: "shouldIgnore", value: function shouldIgnore(message) { if (typeof message !== 'string') return false; return IGNORED_WARNING_MESSAGES.some(function (warningMsg) { return message.includes(warningMsg); }); } }]); return WarningFilter; }(); // 错误限流器 var ErrorThrottler = /*#__PURE__*/function () { function ErrorThrottler(maxErrorsPerSecond) { (0, _classCallCheck2.default)(this, ErrorThrottler); (0, _defineProperty2.default)(this, "errorCount", 0); (0, _defineProperty2.default)(this, "lastErrorTime", 0); this.maxErrorsPerSecond = maxErrorsPerSecond; } (0, _createClass2.default)(ErrorThrottler, [{ key: "shouldThrottle", value: function shouldThrottle() { var now = Date.now(); if (now - this.lastErrorTime > 1000) { this.errorCount = 0; this.lastErrorTime = now; } if (this.errorCount >= this.maxErrorsPerSecond) { return true; } this.errorCount++; return false; } }]); return ErrorThrottler; }(); // 错误处理器 var ErrorHandler = /*#__PURE__*/function () { function ErrorHandler(customHandler) { var maxErrorsPerSecond = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10; (0, _classCallCheck2.default)(this, ErrorHandler); (0, _defineProperty2.default)(this, "isHandlingError", false); (0, _defineProperty2.default)(this, "throttler", void 0); (0, _defineProperty2.default)(this, "defaultHandler", function (error, errorInfo) { console.error('Caught an error:', error, errorInfo); }); this.customHandler = customHandler; this.throttler = new ErrorThrottler(maxErrorsPerSecond); } (0, _createClass2.default)(ErrorHandler, [{ key: "handle", value: function handle(error, errorInfo) { if (this.throttler.shouldThrottle()) { console.warn('Too many errors, throttling error handling'); return; } if (this.isHandlingError) { console.warn('Error occurred while handling another error, skipping to prevent potential infinite loop'); return; } this.isHandlingError = true; try { if (this.customHandler) { this.customHandler(error, errorInfo); } else { this.defaultHandler(error, errorInfo); } } catch (handlerError) { console.error('Error occurred in error handler:', handlerError); } finally { this.isHandlingError = false; } } }]); return ErrorHandler; }(); /** * @description: 全局运行时异常处理 * @param {ErrorHandlerFunction} customErrorHandler * @param {Partial<ErrorHandlingConfig>} config */ var setupGlobalErrorHandling = exports.setupGlobalErrorHandling = function setupGlobalErrorHandling(customErrorHandler) { var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var finalConfig = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, DEFAULT_CONFIG), config); var errorHandler = new ErrorHandler(customErrorHandler, finalConfig.maxErrorsPerSecond); // 设置 window.onerror 处理器 window.onerror = function (message, source, lineno, colno, error) { errorHandler.handle(error || new Error(message), "window.onerror: ".concat(source, ":").concat(lineno, ":").concat(colno)); return true; }; // 设置 unhandledrejection 事件处理器 window.addEventListener('unhandledrejection', function (event) { errorHandler.handle(event.reason, 'unhandledPromiseRejection'); }); if (finalConfig.enableConsoleOverride) { // 重写 console 方法 var originalConsoleError = console.error; var originalConsoleWarn = console.warn; console.warn = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (WarningFilter.shouldIgnore(args[0])) return; originalConsoleWarn.apply(console, args); }; console.error = function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } if (WarningFilter.shouldIgnore(args[0])) return; errorHandler.handle(args[0] instanceof Error ? args[0] : new Error(args.join(' ')), 'console.error'); originalConsoleError.apply(console, args); }; } return { ExtendedError: ExtendedError, handleError: errorHandler.handle.bind(errorHandler) }; };