Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions src/components/Live/LiveProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 =>
Expand Down
2 changes: 1 addition & 1 deletion src/utils/transpile/evalCode.js
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
18 changes: 15 additions & 3 deletions src/utils/transpile/index.js
Original file line number Diff line number Diff line change
@@ -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);
};

Expand Down
3 changes: 3 additions & 0 deletions src/utils/transpile/polyfills.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import assign from 'core-js/fn/object/assign';

export const _poly = { assign };
14 changes: 0 additions & 14 deletions src/utils/transpile/transform.js

This file was deleted.