Skip to content

Commit 34a6041

Browse files
authored
Merge pull request #260 from maksnester/mn/disable-transpilation-option
feat: add transpileOptions prop to LiveProvider
2 parents c09b4bc + 08b945d commit 34a6041

File tree

7 files changed

+59
-16
lines changed

7 files changed

+59
-16
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"lint": "eslint --config .eslintrc \"./**/*.js\""
2020
},
2121
"dependencies": {
22+
"@types/buble": "^0.20.0",
2223
"buble": "0.19.6",
2324
"core-js": "^3.14.0",
2425
"dom-iterator": "^1.0.0",

src/components/Live/LiveProvider.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ function LiveProvider({
1212
disabled,
1313
scope,
1414
transformCode,
15+
transpileOptions,
1516
noInline = false
1617
}) {
1718
const [state, setState] = useState({
@@ -23,7 +24,8 @@ function LiveProvider({
2324
// Transpilation arguments
2425
const input = {
2526
code: transformCode ? transformCode(newCode) : newCode,
26-
scope
27+
scope,
28+
transpileOptions
2729
};
2830

2931
const errorCallback = error =>
@@ -45,7 +47,7 @@ function LiveProvider({
4547

4648
useEffect(() => {
4749
transpile(code);
48-
}, [code, scope, noInline, transformCode]);
50+
}, [code, scope, noInline, transformCode, transpileOptions]);
4951

5052
const onChange = newCode => transpile(newCode);
5153

@@ -76,7 +78,8 @@ LiveProvider.propTypes = {
7678
noInline: PropTypes.bool,
7779
scope: PropTypes.object,
7880
theme: PropTypes.object,
79-
transformCode: PropTypes.func
81+
transformCode: PropTypes.node,
82+
transpileOptions: PropTypes.object
8083
};
8184

8285
LiveProvider.defaultProps = {

src/utils/test/transpile.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ describe('transpile', () => {
5959

6060
expect(wrapper.text()).toBe('Hello World!');
6161
});
62+
63+
it('adopts code generation based on transpileOptions', () => {
64+
const code = `(() => {
65+
class Foo { async bar() { await Promise.resolve(1); } }
66+
})();`;
67+
68+
expect(() => generateElement({ code })).toThrow();
69+
70+
expect(() =>
71+
generateElement({
72+
code,
73+
transpileOptions: {
74+
transforms: { classes: false, asyncAwait: false }
75+
}
76+
})
77+
).not.toThrow();
78+
});
6279
});
6380

6481
describe('renderElementAsync', () => {

src/utils/transpile/index.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,24 @@ import transform from './transform';
22
import errorBoundary from './errorBoundary';
33
import evalCode from './evalCode';
44

5-
export const generateElement = ({ code = '', scope = {} }, errorCallback) => {
5+
export const generateElement = (
6+
{ code = '', scope = {}, transpileOptions },
7+
errorCallback
8+
) => {
69
// NOTE: Remove trailing semicolon to get an actual expression.
710
const codeTrimmed = code.trim().replace(/;$/, '');
811

912
// NOTE: Workaround for classes and arrow functions.
10-
const transformed = transform(`return (${codeTrimmed})`).trim();
13+
const transformed = transform(
14+
`return (${codeTrimmed})`,
15+
transpileOptions
16+
).trim();
17+
1118
return errorBoundary(evalCode(transformed, scope), errorCallback);
1219
};
1320

1421
export const renderElementAsync = (
15-
{ code = '', scope = {} },
22+
{ code = '', scope = {}, transpileOptions },
1623
resultCallback,
1724
errorCallback
1825
// eslint-disable-next-line consistent-return
@@ -31,5 +38,5 @@ export const renderElementAsync = (
3138
);
3239
}
3340

34-
evalCode(transform(code), { ...scope, render });
41+
evalCode(transform(code, transpileOptions), { ...scope, render });
3542
};

src/utils/transpile/transform.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ import assign from 'core-js/features/object/assign';
33

44
export const _poly = { assign };
55

6-
const opts = {
7-
objectAssign: '_poly.assign',
8-
transforms: {
9-
dangerousForOf: true,
10-
dangerousTaggedTemplateString: true
11-
}
12-
};
6+
export default (code, transpileOptions = {}) => {
7+
const opts = {
8+
...transpileOptions,
9+
objectAssign: '_poly.assign',
10+
transforms: {
11+
dangerousForOf: true,
12+
dangerousTaggedTemplateString: true,
13+
...transpileOptions.transforms
14+
}
15+
};
1316

14-
export default code => _transform(code, opts).code;
17+
return _transform(code, opts).code;
18+
};

typings/react-live.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import { ComponentClass, StatelessComponent, HTMLProps, ComponentType, Context } from 'react'
1+
import { ComponentClass, HTMLProps, ComponentType, Context } from 'react'
22
import { PrismTheme, Language } from 'prism-react-renderer';
3+
import { TransformOptions } from 'buble';
4+
5+
type TranspileOptions = TransformOptions & { transforms: {asyncAwait?: boolean}}
36

47
// Helper types
58
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
@@ -14,6 +17,7 @@ export type LiveProviderProps = Omit<DivProps, 'scope'> & {
1417
code?: string;
1518
noInline?: boolean;
1619
transformCode?: (code: string) => string;
20+
transpileOptions?: TranspileOptions;
1721
language?: Language;
1822
disabled?: boolean;
1923
theme?: PrismTheme;

yarn.lock

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,13 @@
383383
react-split-pane "^0.1.77"
384384
react-treebeard "^2.1.0"
385385

386+
"@types/buble@^0.20.0":
387+
version "0.20.0"
388+
resolved "https://registry.yarnpkg.com/@types/buble/-/buble-0.20.0.tgz#8c076a500bb297a3955bd832ae4a1ec5ccf25753"
389+
integrity sha512-tS+DwolzYtDuayJspUABudwjeF8t0mGzchixMDcxN9Vn96IL23AFCsZVoX3gbPkYbZnvD3W+nWCtB/HyxUaeXg==
390+
dependencies:
391+
magic-string "^0.25.0"
392+
386393
"@types/node@*":
387394
version "12.7.2"
388395
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44"

0 commit comments

Comments
 (0)