jam-cloud/jam-ui/node_modules/react-live/dist/react-live.js

555 lines
16 KiB
JavaScript

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('prop-types'), require('react-simple-code-editor'), require('prism-react-renderer'), require('buble'), require('core-js/fn/object/assign')) :
typeof define === 'function' && define.amd ? define(['exports', 'react', 'prop-types', 'react-simple-code-editor', 'prism-react-renderer', 'buble', 'core-js/fn/object/assign'], factory) :
(factory((global.ReactLive = {}),global.React,global.propTypes,global.Editor,global.Prism,global.Buble,global.assign));
}(this, (function (exports,React,propTypes,Editor,Highlight,buble,assign) { 'use strict';
var React__default = 'default' in React ? React['default'] : React;
propTypes = propTypes && propTypes.hasOwnProperty('default') ? propTypes['default'] : propTypes;
Editor = Editor && Editor.hasOwnProperty('default') ? Editor['default'] : Editor;
var Highlight__default = 'default' in Highlight ? Highlight['default'] : Highlight;
assign = assign && assign.hasOwnProperty('default') ? assign['default'] : assign;
var theme = {
plain: {
color: '#C5C8C6',
backgroundColor: '#1D1F21'
},
styles: [{
types: ['prolog', 'comment', 'doctype', 'cdata'],
style: {
color: 'hsl(30, 20%, 50%)'
}
}, {
types: ['property', 'tag', 'boolean', 'number', 'constant', 'symbol'],
style: { color: 'hsl(350, 40%, 70%)' }
}, {
types: ['attr-name', 'string', 'char', 'builtin', 'insterted'],
style: {
color: 'hsl(75, 70%, 60%)'
}
}, {
types: ['operator', 'entity', 'url', 'string', 'variable', 'language-css'],
style: {
color: 'hsl(40, 90%, 60%)'
}
}, {
types: ['deleted'],
style: {
color: 'rgb(255, 85, 85)'
}
}, {
types: ['italic'],
style: {
fontStyle: 'italic'
}
}, {
types: ['important', 'bold'],
style: {
fontWeight: 'bold'
}
}, {
types: ['regex', 'important'],
style: {
color: '#e90'
}
}, {
types: ['atrule', 'attr-value', 'keyword'],
style: {
color: 'hsl(350, 40%, 70%)'
}
}, {
types: ['punctuation', 'symbol'],
style: {
opacity: '0.7'
}
}]
};
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 classCallCheck = function (instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var inherits = function (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 objectWithoutProperties = function (obj, keys) {
var target = {};
for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;
if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
target[i] = obj[i];
}
return target;
};
var possibleConstructorReturn = function (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;
};
var CodeEditor = function (_Component) {
inherits(CodeEditor, _Component);
function CodeEditor() {
var _temp, _this, _ret;
classCallCheck(this, CodeEditor);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.state = {
code: ''
}, _this.updateContent = function (code) {
_this.setState({ code: code }, function () {
if (_this.props.onChange) {
_this.props.onChange(_this.state.code);
}
});
}, _this.highlightCode = function (code) {
return React__default.createElement(
Highlight__default,
{
Prism: Highlight.Prism,
code: code,
theme: _this.props.theme || theme,
language: _this.props.language
},
function (_ref) {
var tokens = _ref.tokens,
getLineProps = _ref.getLineProps,
getTokenProps = _ref.getTokenProps;
return React__default.createElement(
React.Fragment,
null,
tokens.map(function (line, i) {
return (
// eslint-disable-next-line react/jsx-key
React__default.createElement(
'div',
getLineProps({ line: line, key: i }),
line.map(function (token, key) {
return (
// eslint-disable-next-line react/jsx-key
React__default.createElement('span', getTokenProps({ token: token, key: key }))
);
})
)
);
})
);
}
);
}, _temp), possibleConstructorReturn(_this, _ret);
}
CodeEditor.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {
if (props.code !== state.prevCodeProp) {
return { code: props.code, prevCodeProp: props.code };
}
return null;
};
CodeEditor.prototype.render = function render() {
// eslint-disable-next-line no-unused-vars
var _props = this.props,
style = _props.style,
_code = _props.code,
onChange = _props.onChange,
language = _props.language,
theme$$1 = _props.theme,
rest = objectWithoutProperties(_props, ['style', 'code', 'onChange', 'language', 'theme']);
var code = this.state.code;
var baseTheme = theme$$1 && _typeof(theme$$1.plain) === 'object' ? theme$$1.plain : {};
return React__default.createElement(Editor, _extends({
value: code,
padding: 10,
highlight: this.highlightCode,
onValueChange: this.updateContent,
style: _extends({
whiteSpace: 'pre',
fontFamily: 'monospace'
}, baseTheme, style)
}, rest));
};
return CodeEditor;
}(React.Component);
var LiveContext = React.createContext({});
var _poly = { assign: assign };
var opts = {
objectAssign: '_poly.assign',
transforms: {
dangerousForOf: true,
dangerousTaggedTemplateString: true
}
};
var transform = (function (code) {
return buble.transform(code, opts).code;
});
var errorBoundary = function errorBoundary(Element, errorCallback) {
return function (_Component) {
inherits(ErrorBoundary, _Component);
function ErrorBoundary() {
classCallCheck(this, ErrorBoundary);
return possibleConstructorReturn(this, _Component.apply(this, arguments));
}
ErrorBoundary.prototype.componentDidCatch = function componentDidCatch(error) {
errorCallback(error);
};
ErrorBoundary.prototype.render = function render() {
return typeof Element === 'function' ? React__default.createElement(Element, null) : Element;
};
return ErrorBoundary;
}(React.Component);
};
var evalCode = function evalCode(code, scope) {
var scopeKeys = Object.keys(scope);
var scopeValues = scopeKeys.map(function (key) {
return scope[key];
});
// eslint-disable-next-line no-new-func
var res = new (Function.prototype.bind.apply(Function, [null].concat(['_poly', 'React'], scopeKeys, [code])))();
return res.apply(undefined, [_poly, React__default].concat(scopeValues));
};
var generateElement = function generateElement(_ref, errorCallback) {
var _ref$code = _ref.code,
code = _ref$code === undefined ? '' : _ref$code,
_ref$scope = _ref.scope,
scope = _ref$scope === undefined ? {} : _ref$scope;
// NOTE: Remove trailing semicolon to get an actual expression.
var codeTrimmed = code.trim().replace(/;$/, '');
// NOTE: Workaround for classes and arrow functions.
var transformed = transform('return (' + codeTrimmed + ')').trim();
return errorBoundary(evalCode(transformed, scope), errorCallback);
};
var renderElementAsync = function renderElementAsync(_ref2, resultCallback, errorCallback
// eslint-disable-next-line consistent-return
) {
var _ref2$code = _ref2.code,
code = _ref2$code === undefined ? '' : _ref2$code,
_ref2$scope = _ref2.scope,
scope = _ref2$scope === undefined ? {} : _ref2$scope;
var render = function render(element) {
if (typeof element === 'undefined') {
errorCallback(new SyntaxError('`render` must be called with valid JSX.'));
} else {
resultCallback(errorBoundary(element, errorCallback));
}
};
if (!/render\s*\(/.test(code)) {
return errorCallback(new SyntaxError('No-Inline evaluations must call `render`.'));
}
evalCode(transform(code), _extends({}, scope, { render: render }));
};
var LiveProvider = function (_Component) {
inherits(LiveProvider, _Component);
function LiveProvider() {
var _temp, _this, _ret;
classCallCheck(this, LiveProvider);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.onChange = function (code) {
var _this$props = _this.props,
scope = _this$props.scope,
transformCode = _this$props.transformCode,
noInline = _this$props.noInline;
_this.transpile({ code: code, scope: scope, transformCode: transformCode, noInline: noInline });
}, _this.onError = function (error) {
_this.setState({ error: error.toString() });
}, _this.transpile = function (_ref) {
var code = _ref.code,
scope = _ref.scope,
transformCode = _ref.transformCode,
_ref$noInline = _ref.noInline,
noInline = _ref$noInline === undefined ? false : _ref$noInline;
// Transpilation arguments
var input = {
code: transformCode ? transformCode(code) : code,
scope: scope
};
var errorCallback = function errorCallback(err) {
return _this.setState({ element: undefined, error: err.toString() });
};
var renderElement = function renderElement(element) {
return _this.setState(_extends({}, state, { element: element }));
};
// State reset object
var state = { unsafeWrapperError: undefined, error: undefined };
try {
if (noInline) {
_this.setState(_extends({}, state, { element: null })); // Reset output for async (no inline) evaluation
renderElementAsync(input, renderElement, errorCallback);
} else {
renderElement(generateElement(input, errorCallback));
}
} catch (error) {
_this.setState(_extends({}, state, { error: error.toString() }));
}
}, _temp), possibleConstructorReturn(_this, _ret);
}
// eslint-disable-next-line camelcase
LiveProvider.prototype.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() {
var _props = this.props,
code = _props.code,
scope = _props.scope,
transformCode = _props.transformCode,
noInline = _props.noInline;
this.transpile({ code: code, scope: scope, transformCode: transformCode, noInline: noInline });
};
LiveProvider.prototype.componentDidUpdate = function componentDidUpdate(_ref2) {
var prevCode = _ref2.code,
prevScope = _ref2.scope,
prevNoInline = _ref2.noInline,
prevTransformCode = _ref2.transformCode;
var _props2 = this.props,
code = _props2.code,
scope = _props2.scope,
noInline = _props2.noInline,
transformCode = _props2.transformCode;
if (code !== prevCode || scope !== prevScope || noInline !== prevNoInline || transformCode !== prevTransformCode) {
this.transpile({ code: code, scope: scope, transformCode: transformCode, noInline: noInline });
}
};
LiveProvider.prototype.render = function render() {
var _props3 = this.props,
children = _props3.children,
code = _props3.code,
language = _props3.language,
theme = _props3.theme,
disabled = _props3.disabled;
return React__default.createElement(
LiveContext.Provider,
{
value: _extends({}, this.state, {
code: code,
language: language,
theme: theme,
disabled: disabled,
onError: this.onError,
onChange: this.onChange
})
},
children
);
};
return LiveProvider;
}(React.Component);
LiveProvider.defaultProps = {
code: '',
noInline: false,
language: 'jsx',
disabled: false
};
function LiveEditor(props) {
return React__default.createElement(
LiveContext.Consumer,
null,
function (_ref) {
var code = _ref.code,
language = _ref.language,
theme = _ref.theme,
disabled = _ref.disabled,
onChange = _ref.onChange;
return React__default.createElement(CodeEditor, _extends({
theme: theme,
code: code,
language: language,
disabled: disabled,
onChange: onChange
}, props));
}
);
}
function LiveError(props) {
return React__default.createElement(
LiveContext.Consumer,
null,
function (_ref) {
var error = _ref.error;
return error ? React__default.createElement(
'pre',
props,
error
) : null;
}
);
}
function LivePreview(_ref) {
var Component = _ref.Component,
rest = objectWithoutProperties(_ref, ['Component']);
return React__default.createElement(
Component,
rest,
React__default.createElement(
LiveContext.Consumer,
null,
function (_ref2) {
var Element = _ref2.element;
return Element && React__default.createElement(Element, null);
}
)
);
}
LivePreview.defaultProps = {
Component: 'div'
};
function withLive(WrappedComponent) {
var WithLive = function (_Component) {
inherits(WithLive, _Component);
function WithLive() {
classCallCheck(this, WithLive);
return possibleConstructorReturn(this, _Component.apply(this, arguments));
}
WithLive.prototype.render = function render() {
var _this2 = this;
return React__default.createElement(
LiveContext.Consumer,
null,
function (live) {
return React__default.createElement(WrappedComponent, _extends({ live: live }, _this2.props));
}
);
};
return WithLive;
}(React.Component);
return WithLive;
}
exports.Editor = CodeEditor;
exports.LiveProvider = LiveProvider;
exports.LiveEditor = LiveEditor;
exports.LiveError = LiveError;
exports.LivePreview = LivePreview;
exports.LiveContext = LiveContext;
exports.withLive = withLive;
exports.generateElement = generateElement;
exports.renderElementAsync = renderElementAsync;
Object.defineProperty(exports, '__esModule', { value: true });
})));