Skip to content

Commit de96dac

Browse files
committed
feat: add createRequire and remove imports (#65)
1 parent cf98e42 commit de96dac

File tree

11 files changed

+129
-82
lines changed

11 files changed

+129
-82
lines changed

README.md

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ Run your React code on the go [https://react-runner.vercel.app](https://react-ru
88
- Function component
99
- Class component, **with class fields support**
1010
- Composing components with `render` or `export default`
11-
- Support `Typescript`
1211
- Server Side Rendering
12+
- Support `Typescript`
13+
- Support `import` statement via `createRequire` utility
1314

1415
Hacker News [in react-runner](https://react-runner.vercel.app/#hacker-news) vs [in real world](https://react-runner.vercel.app/examples/hacker-news), with the same code
1516

@@ -27,31 +28,49 @@ npm install --save react-runner
2728

2829
- **code** `string`, _required_ the code to be ran
2930
- **scope** `object` globals that could be used in `code`
30-
- **imports** `object` imports that could be used in `code`
31+
32+
### Predefined scope
33+
34+
```js
35+
{
36+
React,
37+
jsxPragma: React.createElement, // useful if you are using Emotion with `css` prop
38+
jsxFragmentPragma: React.Fragment,
39+
}
40+
```
3141

3242
## Usage
3343

3444
```jsx
3545
import { useRunner } from 'react-runner'
3646

37-
const { element, error } = useRunner({ code, scope, imports })
47+
const { element, error } = useRunner({ code, scope })
3848
```
3949

4050
or use `Runner` as a component directly and handle error with `onRendered`
4151

4252
```jsx
4353
import { Runner } from 'react-runner'
4454

45-
const element = (
46-
<Runner
47-
code={code}
48-
scope={scope}
49-
imports={imports}
50-
onRendered={handleRendered}
51-
/>
52-
)
55+
const element = <Runner code={code} scope={scope} onRendered={handleRendered} />
5356
```
5457

58+
### `import` statement
59+
60+
```js
61+
// you can define your own version of `createRequire`
62+
import { createRequire } from 'react-runner'
63+
import * as YourPkg from 'your-pkg'
64+
65+
const scope = {
66+
require: createRquire({
67+
'your-pkg': YourPkg,
68+
}),
69+
}
70+
```
71+
72+
then in your code you can use `import Foo, { Bar } from 'your-pkg'`
73+
5574
## Browser support
5675

5776
```
@@ -70,7 +89,7 @@ I love it, but I love arrow functions for event handlers instead of bind them ma
7089
and I don't want to change my code to be compliant with restrictions, so I created this project,
7190
use [Sucrase](https://github.com/alangpierce/sucrase) instead of [Bublé](https://github.com/bublejs/buble) to transpile the code.
7291

73-
If you are using `react-live` in your project and want a smooth transition, `react-live-runner` is there for you which provide the identical way to play with:
92+
If you are using `react-live` in your project and want a smooth transition, `react-live-runner` is there for you which provide the identical way to play with, and `react-live-runner` re-exports `react-runner` so you can use everything in `react-runner` by importing `react-live-runner`
7493

7594
```jsx
7695
import {
@@ -81,7 +100,7 @@ import {
81100
} from 'react-live-runner'
82101

83102
...
84-
<LiveProvider code={code} scope={scope} imports={imports}>
103+
<LiveProvider code={code} scope={scope}>
85104
<LiveEditor />
86105
<LivePreview />
87106
<LiveError />
@@ -97,7 +116,6 @@ import { useLiveRunner, CodeEditor } from 'react-live-runner'
97116
const { element, error, code, onChange } = useLiveRunner({
98117
initialCode,
99118
scope,
100-
imports,
101119
transformCode,
102120
})
103121

@@ -117,7 +135,7 @@ import { useState, useEffect } from 'react'
117135
import { useRunner } from 'react-runner'
118136

119137
const [code, onChange] = useState(initialCode)
120-
const { element, error } = useRunner({ code, scope, imports })
138+
const { element, error } = useRunner({ code, scope })
121139

122140
useEffect(() => {
123141
onChange(initialCode)

packages/react-live-runner/README.md

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ Run your React code on the go [https://react-runner.vercel.app](https://react-ru
88
- Function component
99
- Class component, **with class fields support**
1010
- Composing components with `render` or `export default`
11-
- Support `Typescript`
1211
- Server Side Rendering
12+
- Support `Typescript`
13+
- Support `import` statement via `createRequire` utility
1314

1415
Hacker News [in react-runner](https://react-runner.vercel.app/#hacker-news) vs [in real world](https://react-runner.vercel.app/examples/hacker-news), with the same code
1516

@@ -27,31 +28,49 @@ npm install --save react-runner
2728

2829
- **code** `string`, _required_ the code to be ran
2930
- **scope** `object` globals that could be used in `code`
30-
- **imports** `object` imports that could be used in `code`
31+
32+
### Predefined scope
33+
34+
```js
35+
{
36+
React,
37+
jsxPragma: React.createElement, // useful if you are using Emotion with `css` prop
38+
jsxFragmentPragma: React.Fragment,
39+
}
40+
```
3141

3242
## Usage
3343

3444
```jsx
3545
import { useRunner } from 'react-runner'
3646

37-
const { element, error } = useRunner({ code, scope, imports })
47+
const { element, error } = useRunner({ code, scope })
3848
```
3949

4050
or use `Runner` as a component directly and handle error with `onRendered`
4151

4252
```jsx
4353
import { Runner } from 'react-runner'
4454

45-
const element = (
46-
<Runner
47-
code={code}
48-
scope={scope}
49-
imports={imports}
50-
onRendered={handleRendered}
51-
/>
52-
)
55+
const element = <Runner code={code} scope={scope} onRendered={handleRendered} />
5356
```
5457

58+
### `import` statement
59+
60+
```js
61+
// you can define your own version of `createRequire`
62+
import { createRequire } from 'react-runner'
63+
import * as YourPkg from 'your-pkg'
64+
65+
const scope = {
66+
require: createRquire({
67+
'your-pkg': YourPkg,
68+
}),
69+
}
70+
```
71+
72+
then in your code you can use `import Foo, { Bar } from 'your-pkg'`
73+
5574
## Browser support
5675

5776
```
@@ -70,7 +89,7 @@ I love it, but I love arrow functions for event handlers instead of bind them ma
7089
and I don't want to change my code to be compliant with restrictions, so I created this project,
7190
use [Sucrase](https://github.com/alangpierce/sucrase) instead of [Bublé](https://github.com/bublejs/buble) to transpile the code.
7291

73-
If you are using `react-live` in your project and want a smooth transition, `react-live-runner` is there for you which provide the identical way to play with:
92+
If you are using `react-live` in your project and want a smooth transition, `react-live-runner` is there for you which provide the identical way to play with, and `react-live-runner` re-exports `react-runner` so you can use everything in `react-runner` by importing `react-live-runner`
7493

7594
```jsx
7695
import {
@@ -81,7 +100,7 @@ import {
81100
} from 'react-live-runner'
82101

83102
...
84-
<LiveProvider code={code} scope={scope} imports={imports}>
103+
<LiveProvider code={code} scope={scope}>
85104
<LiveEditor />
86105
<LivePreview />
87106
<LiveError />
@@ -97,7 +116,6 @@ import { useLiveRunner, CodeEditor } from 'react-live-runner'
97116
const { element, error, code, onChange } = useLiveRunner({
98117
initialCode,
99118
scope,
100-
imports,
101119
transformCode,
102120
})
103121

@@ -117,7 +135,7 @@ import { useState, useEffect } from 'react'
117135
import { useRunner } from 'react-runner'
118136

119137
const [code, onChange] = useState(initialCode)
120-
const { element, error } = useRunner({ code, scope, imports })
138+
const { element, error } = useRunner({ code, scope })
121139

122140
useEffect(() => {
123141
onChange(initialCode)

packages/react-runner/README.md

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ Run your React code on the go [https://react-runner.vercel.app](https://react-ru
88
- Function component
99
- Class component, **with class fields support**
1010
- Composing components with `render` or `export default`
11-
- Support `Typescript`
1211
- Server Side Rendering
12+
- Support `Typescript`
13+
- Support `import` statement via `createRequire` utility
1314

1415
Hacker News [in react-runner](https://react-runner.vercel.app/#hacker-news) vs [in real world](https://react-runner.vercel.app/examples/hacker-news), with the same code
1516

@@ -27,31 +28,49 @@ npm install --save react-runner
2728

2829
- **code** `string`, _required_ the code to be ran
2930
- **scope** `object` globals that could be used in `code`
30-
- **imports** `object` imports that could be used in `code`
31+
32+
### Predefined scope
33+
34+
```js
35+
{
36+
React,
37+
jsxPragma: React.createElement, // useful if you are using Emotion with `css` prop
38+
jsxFragmentPragma: React.Fragment,
39+
}
40+
```
3141

3242
## Usage
3343

3444
```jsx
3545
import { useRunner } from 'react-runner'
3646

37-
const { element, error } = useRunner({ code, scope, imports })
47+
const { element, error } = useRunner({ code, scope })
3848
```
3949

4050
or use `Runner` as a component directly and handle error with `onRendered`
4151

4252
```jsx
4353
import { Runner } from 'react-runner'
4454

45-
const element = (
46-
<Runner
47-
code={code}
48-
scope={scope}
49-
imports={imports}
50-
onRendered={handleRendered}
51-
/>
52-
)
55+
const element = <Runner code={code} scope={scope} onRendered={handleRendered} />
5356
```
5457

58+
### `import` statement
59+
60+
```js
61+
// you can define your own version of `createRequire`
62+
import { createRequire } from 'react-runner'
63+
import * as YourPkg from 'your-pkg'
64+
65+
const scope = {
66+
require: createRquire({
67+
'your-pkg': YourPkg,
68+
}),
69+
}
70+
```
71+
72+
then in your code you can use `import Foo, { Bar } from 'your-pkg'`
73+
5574
## Browser support
5675

5776
```
@@ -70,7 +89,7 @@ I love it, but I love arrow functions for event handlers instead of bind them ma
7089
and I don't want to change my code to be compliant with restrictions, so I created this project,
7190
use [Sucrase](https://github.com/alangpierce/sucrase) instead of [Bublé](https://github.com/bublejs/buble) to transpile the code.
7291

73-
If you are using `react-live` in your project and want a smooth transition, `react-live-runner` is there for you which provide the identical way to play with:
92+
If you are using `react-live` in your project and want a smooth transition, `react-live-runner` is there for you which provide the identical way to play with, and `react-live-runner` re-exports `react-runner` so you can use everything in `react-runner` by importing `react-live-runner`
7493

7594
```jsx
7695
import {
@@ -81,7 +100,7 @@ import {
81100
} from 'react-live-runner'
82101

83102
...
84-
<LiveProvider code={code} scope={scope} imports={imports}>
103+
<LiveProvider code={code} scope={scope}>
85104
<LiveEditor />
86105
<LivePreview />
87106
<LiveError />
@@ -97,7 +116,6 @@ import { useLiveRunner, CodeEditor } from 'react-live-runner'
97116
const { element, error, code, onChange } = useLiveRunner({
98117
initialCode,
99118
scope,
100-
imports,
101119
transformCode,
102120
})
103121

@@ -117,7 +135,7 @@ import { useState, useEffect } from 'react'
117135
import { useRunner } from 'react-runner'
118136

119137
const [code, onChange] = useState(initialCode)
120-
const { element, error } = useRunner({ code, scope, imports })
138+
const { element, error } = useRunner({ code, scope })
121139

122140
useEffect(() => {
123141
onChange(initialCode)

packages/react-runner/src/__tests__/utils.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { create } from 'react-test-renderer'
22

3-
import { generateElement } from '../utils'
3+
import { generateElement, createRequire } from '../utils'
44

55
test('empty code', () => {
66
const element = generateElement({ code: `` })
@@ -227,7 +227,7 @@ test('imports', () => {
227227
const element = generateElement({
228228
code: `import Foo from 'foo'
229229
render(<Foo />)`,
230-
imports: { foo: () => 'hello' },
230+
scope: { require: createRequire({ foo: () => 'hello' }) },
231231
})
232232

233233
expect(element).toMatchInlineSnapshot(`<foo />`)
@@ -239,7 +239,7 @@ test('invalid imports', () => {
239239
generateElement({
240240
code: `import Foo from 'foo'
241241
render(<Foo />)`,
242-
imports: { bar: () => 'hello' },
242+
scope: { require: createRequire({ bar: () => 'hello' }) },
243243
})
244244
).toThrowErrorMatchingInlineSnapshot(`"Module not found: 'foo'"`)
245245
})

packages/react-runner/src/transform.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { transform as _transform } from 'sucrase'
22

3-
export const transform = (code: string, hasImports?: boolean) => {
3+
export const transform = (code: string, transformImports?: boolean) => {
44
return _transform(code, {
5-
transforms: hasImports
5+
transforms: transformImports
66
? ['jsx', 'typescript', 'imports']
77
: ['jsx', 'typescript'],
88
production: true,

packages/react-runner/src/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,4 @@ export type RunnerOptions = {
55
code: string
66
/** globals that could be used in code */
77
scope?: Scope
8-
/** imports that could be used in code */
9-
imports?: Scope
108
}

packages/react-runner/src/useRunner.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,17 @@ export type UseRunnerReturn = {
1616
export const useRunner = ({
1717
code,
1818
scope,
19-
imports,
2019
disableCache,
2120
}: UseRunnerProps): UseRunnerReturn => {
2221
const isMountRef = useRef(true)
2322
const elementRef = useRef<ReactElement | null>(null)
2423
const scopeRef = useRef(scope)
2524
scopeRef.current = scope
26-
const importsRef = useRef(imports)
27-
importsRef.current = imports
2825

2926
const [state, setState] = useState<UseRunnerReturn>(() => {
3027
const element = createElement(Runner, {
3128
code,
3229
scope: scopeRef.current,
33-
imports: importsRef.current,
3430
onRendered: (error) => {
3531
if (error) {
3632
setState({
@@ -54,7 +50,6 @@ export const useRunner = ({
5450
const element = createElement(Runner, {
5551
code,
5652
scope: scopeRef.current,
57-
imports: importsRef.current,
5853
onRendered: (error) => {
5954
if (error) {
6055
setState({

0 commit comments

Comments
 (0)