UNPKG

bloom-layout

Version:
509 lines (412 loc) 16.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.__RewireAPI__ = exports.__ResetDependency__ = exports.__set__ = exports.__Rewire__ = exports.__GetDependency__ = exports.__get__ = exports.RedBoxError = undefined; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _style = require('./style.js'); var _style2 = _interopRequireDefault(_style); var _errorStackParser = require('error-stack-parser'); var _errorStackParser2 = _interopRequireDefault(_errorStackParser); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); var _lib = require('./lib'); var _sourcemappedStacktrace = require('sourcemapped-stacktrace'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var RedBoxError = exports.RedBoxError = function (_get__2) { _inherits(RedBoxError, _get__2); function RedBoxError(props) { _classCallCheck(this, RedBoxError); var _this = _possibleConstructorReturn(this, (RedBoxError.__proto__ || Object.getPrototypeOf(RedBoxError)).call(this, props)); _this.state = { error: null, mapped: false }; _this.mapOnConstruction(props.error); return _this; } // State is used to store the error mapped to the source map. _createClass(RedBoxError, [{ key: 'componentDidMount', value: function componentDidMount() { if (!this.state.mapped) this.mapError(this.props.error); } // Try to map the error when the component gets constructed, this is possible // in some cases like evals. }, { key: 'mapOnConstruction', value: function mapOnConstruction(error) { var stackLines = error.stack.split('\n'); // There's no stack, only the error message. if (stackLines.length < 2) { this.state = { error: error, mapped: true }; return; } // Using the “eval” setting on webpack already gives the correct location. var isWebpackEval = stackLines[1].search(/\(webpack:\/{3}/) !== -1; if (isWebpackEval) { // No changes are needed here. this.state = { error: error, mapped: true }; return; } // Other eval follow a specific pattern and can be easily parsed. var isEval = stackLines[1].search(/\(eval at/) !== -1; if (!isEval) { // mapping will be deferred until `componentDidMount` this.state = { error: error, mapped: false }; return; } // The first line is the error message. var fixedLines = [stackLines.shift()]; // The rest needs to be fixed. var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = stackLines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var stackLine = _step.value; var evalStackLine = stackLine.match(/(.+)\(eval at (.+) \(.+?\), .+(\:[0-9]+\:[0-9]+)\)/); if (evalStackLine) { var _evalStackLine = _slicedToArray(evalStackLine, 4), atSomething = _evalStackLine[1], file = _evalStackLine[2], rowColumn = _evalStackLine[3]; fixedLines.push(atSomething + ' (' + file + rowColumn + ')'); } else { // TODO: When stack frames of different types are detected, try to load the additional source maps fixedLines.push(stackLine); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } error.stack = fixedLines.join('\n'); this.state = { error: error, mapped: true }; } }, { key: 'mapError', value: function mapError(error) { var _this2 = this; _get__('mapStackTrace')(error.stack, function (mappedStack) { error.stack = mappedStack.join('\n'); _this2.setState({ error: error, mapped: true }); }); } }, { key: 'renderFrames', value: function renderFrames(frames) { var _props = this.props, filename = _props.filename, editorScheme = _props.editorScheme, useLines = _props.useLines, useColumns = _props.useColumns; var _get__3 = _get__('assign')({}, _get__('style'), this.props.style), frame = _get__3.frame, file = _get__3.file, linkToFile = _get__3.linkToFile; return frames.map(function (f, index) { var text = void 0; var url = void 0; if (index === 0 && filename && !_get__('isFilenameAbsolute')(f.fileName)) { url = _get__('makeUrl')(filename, editorScheme); text = _get__('makeLinkText')(filename); } else { var lines = useLines ? f.lineNumber : null; var columns = useColumns ? f.columnNumber : null; url = _get__('makeUrl')(f.fileName, editorScheme, lines, columns); text = _get__('makeLinkText')(f.fileName, lines, columns); } return _get__('React').createElement( 'div', { style: frame, key: index }, _get__('React').createElement( 'div', null, f.functionName ), _get__('React').createElement( 'div', { style: file }, _get__('React').createElement( 'a', { href: url, style: linkToFile }, text ) ) ); }); } }, { key: 'render', value: function render() { // The error is received as a property to initialize state.error, which may // be updated when it is mapped to the source map. var error = this.state.error; var className = this.props.className; var _get__4 = _get__('assign')({}, _get__('style'), this.props.style), redbox = _get__4.redbox, message = _get__4.message, stack = _get__4.stack, frame = _get__4.frame; var frames = void 0; var parseError = void 0; try { frames = _get__('ErrorStackParser').parse(error); } catch (e) { parseError = new Error('Failed to parse stack trace. Stack trace information unavailable.'); } if (parseError) { frames = _get__('React').createElement( 'div', { style: frame, key: 0 }, _get__('React').createElement( 'div', null, parseError.message ) ); } else { frames = this.renderFrames(frames); } return _get__('React').createElement( 'div', { style: redbox, className: className }, _get__('React').createElement( 'div', { style: message }, error.name, ': ', error.message ), _get__('React').createElement( 'div', { style: stack }, frames ) ); } }]); return RedBoxError; }(_get__('Component')); // "Portal" component for actual RedBoxError component to // render to (directly under body). Prevents bugs as in #27. RedBoxError.propTypes = { error: _get__('PropTypes').instanceOf(Error).isRequired, filename: _get__('PropTypes').string, editorScheme: _get__('PropTypes').string, useLines: _get__('PropTypes').bool, useColumns: _get__('PropTypes').bool, style: _get__('PropTypes').object, className: _get__('PropTypes').string }; RedBoxError.displayName = 'RedBoxError'; RedBoxError.defaultProps = { useLines: true, useColumns: true }; var RedBox = function (_get__5) { _inherits(RedBox, _get__5); function RedBox() { _classCallCheck(this, RedBox); return _possibleConstructorReturn(this, (RedBox.__proto__ || Object.getPrototypeOf(RedBox)).apply(this, arguments)); } _createClass(RedBox, [{ key: 'componentDidMount', value: function componentDidMount() { this.el = document.createElement('div'); document.body.appendChild(this.el); this.renderRedBoxError(); } }, { key: 'componentDidUpdate', value: function componentDidUpdate() { this.renderRedBoxError(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { _get__('ReactDOM').unmountComponentAtNode(this.el); document.body.removeChild(this.el); this.el = null; } }, { key: 'renderRedBoxError', value: function renderRedBoxError() { _get__('ReactDOM').render(_get__('React').createElement(_get__('RedBoxError'), this.props), this.el); } }, { key: 'render', value: function render() { return null; } }]); return RedBox; }(_get__('Component')); RedBox.propTypes = { error: _get__('PropTypes').instanceOf(Error).isRequired }; RedBox.displayName = 'RedBox'; exports.default = RedBox; var _RewiredData__ = Object.create(null); var INTENTIONAL_UNDEFINED = '__INTENTIONAL_UNDEFINED__'; var _RewireAPI__ = {}; (function () { function addPropertyToAPIObject(name, value) { Object.defineProperty(_RewireAPI__, name, { value: value, enumerable: false, configurable: true }); } addPropertyToAPIObject('__get__', _get__); addPropertyToAPIObject('__GetDependency__', _get__); addPropertyToAPIObject('__Rewire__', _set__); addPropertyToAPIObject('__set__', _set__); addPropertyToAPIObject('__reset__', _reset__); addPropertyToAPIObject('__ResetDependency__', _reset__); addPropertyToAPIObject('__with__', _with__); })(); function _get__(variableName) { if (_RewiredData__ === undefined || _RewiredData__[variableName] === undefined) { return _get_original__(variableName); } else { var value = _RewiredData__[variableName]; if (value === INTENTIONAL_UNDEFINED) { return undefined; } else { return value; } } } function _get_original__(variableName) { switch (variableName) { case 'PropTypes': return _propTypes2.default; case 'mapStackTrace': return _sourcemappedStacktrace.mapStackTrace; case 'assign': return _objectAssign2.default; case 'style': return _style2.default; case 'isFilenameAbsolute': return _lib.isFilenameAbsolute; case 'makeUrl': return _lib.makeUrl; case 'makeLinkText': return _lib.makeLinkText; case 'ErrorStackParser': return _errorStackParser2.default; case 'Component': return _react.Component; case 'ReactDOM': return _reactDom2.default; case 'React': return _react2.default; case 'RedBoxError': return RedBoxError; } return undefined; } function _assign__(variableName, value) { if (_RewiredData__ === undefined || _RewiredData__[variableName] === undefined) { return _set_original__(variableName, value); } else { return _RewiredData__[variableName] = value; } } function _set_original__(variableName, _value) { switch (variableName) {} return undefined; } function _update_operation__(operation, variableName, prefix) { var oldValue = _get__(variableName); var newValue = operation === '++' ? oldValue + 1 : oldValue - 1; _assign__(variableName, newValue); return prefix ? newValue : oldValue; } function _set__(variableName, value) { if ((typeof variableName === 'undefined' ? 'undefined' : _typeof(variableName)) === 'object') { Object.keys(variableName).forEach(function (name) { _RewiredData__[name] = variableName[name]; }); } else { if (value === undefined) { _RewiredData__[variableName] = INTENTIONAL_UNDEFINED; } else { _RewiredData__[variableName] = value; } return function () { _reset__(variableName); }; } } function _reset__(variableName) { delete _RewiredData__[variableName]; } function _with__(object) { var rewiredVariableNames = Object.keys(object); var previousValues = {}; function reset() { rewiredVariableNames.forEach(function (variableName) { _RewiredData__[variableName] = previousValues[variableName]; }); } return function (callback) { rewiredVariableNames.forEach(function (variableName) { previousValues[variableName] = _RewiredData__[variableName]; _RewiredData__[variableName] = object[variableName]; }); var result = callback(); if (!!result && typeof result.then == 'function') { result.then(reset).catch(reset); } else { reset(); } return result; }; } var _typeOfOriginalExport = typeof RedBox === 'undefined' ? 'undefined' : _typeof(RedBox); function addNonEnumerableProperty(name, value) { Object.defineProperty(RedBox, name, { value: value, enumerable: false, configurable: true }); } if ((_typeOfOriginalExport === 'object' || _typeOfOriginalExport === 'function') && Object.isExtensible(RedBox)) { addNonEnumerableProperty('__get__', _get__); addNonEnumerableProperty('__GetDependency__', _get__); addNonEnumerableProperty('__Rewire__', _set__); addNonEnumerableProperty('__set__', _set__); addNonEnumerableProperty('__reset__', _reset__); addNonEnumerableProperty('__ResetDependency__', _reset__); addNonEnumerableProperty('__with__', _with__); addNonEnumerableProperty('__RewireAPI__', _RewireAPI__); } exports.__get__ = _get__; exports.__GetDependency__ = _get__; exports.__Rewire__ = _set__; exports.__set__ = _set__; exports.__ResetDependency__ = _reset__; exports.__RewireAPI__ = _RewireAPI__;