diff --git a/src/components/Live/LiveProvider.js b/src/components/Live/LiveProvider.js index 10d7627a..63505f0f 100644 --- a/src/components/Live/LiveProvider.js +++ b/src/components/Live/LiveProvider.js @@ -20,47 +20,51 @@ export default class LiveProvider extends Component { noInline: PropTypes.bool, scope: PropTypes.object, theme: PropTypes.object, + buble: PropTypes.object, transformCode: PropTypes.node }; // eslint-disable-next-line camelcase UNSAFE_componentWillMount() { - const { code, scope, transformCode, noInline } = this.props; + const { code, scope, buble, transformCode, noInline } = this.props; - this.transpile({ code, scope, transformCode, noInline }); + this.transpile({ code, scope, buble, transformCode, noInline }); } componentDidUpdate({ code: prevCode, scope: prevScope, + buble: prevBuble, noInline: prevNoInline, transformCode: prevTransformCode }) { - const { code, scope, noInline, transformCode } = this.props; + const { code, scope, buble, noInline, transformCode } = this.props; if ( code !== prevCode || scope !== prevScope || + buble !== prevBuble || noInline !== prevNoInline || transformCode !== prevTransformCode ) { - this.transpile({ code, scope, transformCode, noInline }); + this.transpile({ code, scope, buble, transformCode, noInline }); } } onChange = code => { - const { scope, transformCode, noInline } = this.props; - this.transpile({ code, scope, transformCode, noInline }); + const { scope, buble, transformCode, noInline } = this.props; + this.transpile({ code, scope, buble, transformCode, noInline }); }; onError = error => { this.setState({ error: error.toString() }); }; - transpile = ({ code, scope, transformCode, noInline = false }) => { + transpile = ({ code, scope, buble, transformCode, noInline = false }) => { // Transpilation arguments const input = { code: transformCode ? transformCode(code) : code, - scope + scope, + buble }; const errorCallback = err => diff --git a/src/utils/transpile/evalCode.js b/src/utils/transpile/evalCode.js index 6c78765e..4f2cf4c2 100644 --- a/src/utils/transpile/evalCode.js +++ b/src/utils/transpile/evalCode.js @@ -1,5 +1,5 @@ import React from 'react'; -import { _poly } from './transform'; +import { _poly } from './polyfills'; const evalCode = (code, scope) => { const scopeKeys = Object.keys(scope); diff --git a/src/utils/transpile/index.js b/src/utils/transpile/index.js index c2ef718a..8b2940d5 100644 --- a/src/utils/transpile/index.js +++ b/src/utils/transpile/index.js @@ -1,13 +1,25 @@ -import transform from './transform'; +import { transform } from 'buble'; import errorBoundary from './errorBoundary'; import evalCode from './evalCode'; -export const generateElement = ({ code = '', scope = {} }, errorCallback) => { +export const generateElement = ( + { code = '', scope = {}, buble = {} }, + errorCallback +) => { // NOTE: Remove trailing semicolon to get an actual expression. const codeTrimmed = code.trim().replace(/;$/, ''); // NOTE: Workaround for classes and arrow functions. - const transformed = transform(`return (${codeTrimmed})`).trim(); + const transformed = transform(`return (${codeTrimmed})`, { + objectAssign: '_poly.assign', + ...buble, + transforms: { + dangerousForOf: true, + dangerousTaggedTemplateString: true, + ...buble.transforms + } + }).code.trim(); + return errorBoundary(evalCode(transformed, scope), errorCallback); }; diff --git a/src/utils/transpile/polyfills.js b/src/utils/transpile/polyfills.js new file mode 100644 index 00000000..d72b1f61 --- /dev/null +++ b/src/utils/transpile/polyfills.js @@ -0,0 +1,3 @@ +import assign from 'core-js/fn/object/assign'; + +export const _poly = { assign }; diff --git a/src/utils/transpile/transform.js b/src/utils/transpile/transform.js deleted file mode 100644 index 28fda2bc..00000000 --- a/src/utils/transpile/transform.js +++ /dev/null @@ -1,14 +0,0 @@ -import { transform as _transform } from 'buble'; -import assign from 'core-js/fn/object/assign'; - -export const _poly = { assign }; - -const opts = { - objectAssign: '_poly.assign', - transforms: { - dangerousForOf: true, - dangerousTaggedTemplateString: true - } -}; - -export default code => _transform(code, opts).code;