diff --git a/package.json b/package.json
index 9892cc1a..3dc74f58 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,6 @@
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.18.6",
- "@babel/standalone": "^7.20.6",
"@soda/friendly-errors-webpack-plugin": "^1.8.1",
"@types/base64-url": "^2.2.0",
"@types/codemirror": "^5.60.5",
@@ -83,6 +82,7 @@
"css-loader": "^6.7.2",
"current-git-branch": "^1.1.0",
"dedent": "^0.7.0",
+ "esbuild-wasm": "^0.19.5",
"fast-glob": "^3.2.12",
"find-up": "^5.0.0",
"fuzzy": "^0.1.3",
@@ -134,6 +134,7 @@
},
"packageManager": "pnpm@7.18.1",
"volta": {
+ "pnpm": "7.18.1",
"node": "16.13.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a5a2dc05..6b974ae5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,7 +7,6 @@ specifiers:
'@babel/preset-env': ^7.20.2
'@babel/preset-react': ^7.18.6
'@babel/preset-typescript': ^7.18.6
- '@babel/standalone': ^7.20.6
'@changesets/cli': ^2.25.2
'@octokit/rest': ^19.0.5
'@soda/friendly-errors-webpack-plugin': ^1.8.1
@@ -35,6 +34,7 @@ specifiers:
current-git-branch: ^1.1.0
cypress: ^12.0.2
dedent: ^0.7.0
+ esbuild-wasm: ^0.19.5
eslint: ^8.44.0
eslint-config-seek: ^11.3.1
fast-glob: ^3.2.12
@@ -78,7 +78,6 @@ dependencies:
'@babel/preset-env': 7.20.2_@babel+core@7.20.5
'@babel/preset-react': 7.18.6_@babel+core@7.20.5
'@babel/preset-typescript': 7.18.6_@babel+core@7.20.5
- '@babel/standalone': 7.20.6
'@soda/friendly-errors-webpack-plugin': 1.8.1_webpack@5.75.0
'@types/base64-url': 2.2.0
'@types/codemirror': 5.60.5
@@ -101,6 +100,7 @@ dependencies:
css-loader: 6.7.2_webpack@5.75.0
current-git-branch: 1.1.0
dedent: 0.7.0
+ esbuild-wasm: 0.19.5
fast-glob: 3.2.12
find-up: 5.0.0
fuzzy: 0.1.3
@@ -1643,11 +1643,6 @@ packages:
dependencies:
regenerator-runtime: 0.13.11
- /@babel/standalone/7.20.6:
- resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==}
- engines: {node: '>=6.9.0'}
- dev: false
-
/@babel/template/7.18.10:
resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
engines: {node: '>=6.9.0'}
@@ -4784,6 +4779,12 @@ packages:
is-symbol: 1.0.4
dev: true
+ /esbuild-wasm/0.19.5:
+ resolution: {integrity: sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ dev: false
+
/esbuild/0.11.23:
resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==}
hasBin: true
diff --git a/src/Playroom/Frames/Frames.tsx b/src/Playroom/Frames/Frames.tsx
index 79de0932..3f0280fa 100644
--- a/src/Playroom/Frames/Frames.tsx
+++ b/src/Playroom/Frames/Frames.tsx
@@ -37,8 +37,9 @@ export default function Frames({ code, themes, widths }: FramesProps) {
useEffect(() => {
try {
- const newCode = compileJsx(code);
- setRenderCode(newCode);
+ compileJsx(code).then(({ code: newCode }) => {
+ setRenderCode(newCode);
+ });
} catch (e) {}
}, [code]);
diff --git a/src/index.js b/src/index.js
index 9b0f5a8c..4fc28582 100644
--- a/src/index.js
+++ b/src/index.js
@@ -2,6 +2,7 @@ import { renderElement } from './render';
import Playroom from './Playroom/Playroom';
import { StoreProvider } from './StoreContext/StoreContext';
import playroomConfig from './config';
+import * as esbuild from 'esbuild-wasm';
const polyfillIntersectionObserver = () =>
typeof window.IntersectionObserver !== 'undefined'
@@ -26,21 +27,27 @@ polyfillIntersectionObserver().then(() => {
Object.entries(components).filter(([_, value]) => value)
);
- renderElement(
-
-
- ,
- outlet
- );
+ esbuild
+ .initialize({
+ wasmURL: 'https://unpkg.com/esbuild-wasm/esbuild.wasm',
+ })
+ .then(() => {
+ renderElement(
+
+
+ ,
+ outlet
+ );
+ });
};
renderPlayroom();
diff --git a/src/utils/compileJsx.ts b/src/utils/compileJsx.ts
index f67da928..bbb4dc89 100644
--- a/src/utils/compileJsx.ts
+++ b/src/utils/compileJsx.ts
@@ -1,4 +1,4 @@
-import { transform } from '@babel/standalone';
+import { transform as esbuildTransform } from 'esbuild-wasm';
export const ReactFragmentPragma = 'R_F';
export const ReactCreateElementPragma = 'R_cE';
@@ -7,17 +7,11 @@ export const openFragmentTag = '<>';
export const closeFragmentTag = '>';
export const compileJsx = (code: string) =>
- transform(`${openFragmentTag}${code.trim()}${closeFragmentTag}`, {
- presets: [
- [
- 'react',
- {
- pragma: ReactCreateElementPragma,
- pragmaFrag: ReactFragmentPragma,
- },
- ],
- ],
- }).code;
+ esbuildTransform(`${openFragmentTag}${code.trim()}${closeFragmentTag}`, {
+ loader: 'jsx',
+ jsxFactory: ReactCreateElementPragma,
+ jsxFragment: ReactFragmentPragma,
+ });
export const validateCode = (code: string) => {
try {