@aliemir/react-live
Version:
A production-focused playground for live editing React code
43 lines (37 loc) • 1.2 kB
JavaScript
import React from "react";
import transform from "./transform";
import errorBoundary from "./errorBoundary";
import evalCode from "./evalCode";
export const generateElement = (
{ code = "", scope = {}, opts = {} },
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})`, opts).trim();
return errorBoundary(
evalCode(transformed, { React, ...scope }),
errorCallback
);
};
export const renderElementAsync = (
{ code = "", scope = {}, opts = {} },
resultCallback,
errorCallback
// eslint-disable-next-line consistent-return
) => {
const 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, opts), { React, ...scope, render });
};