An open API service indexing awesome lists of open source software.

https://github.com/lukasmoellerch/playground-hook


https://github.com/lukasmoellerch/playground-hook

Last synced: about 2 months ago
JSON representation

Awesome Lists containing this project

README

        


playground-hook




A simple hook that allows you to include JavaScript playgrounds in your React app.




- Supports mutliple files
- Transpiles the source code using scurase
- Dynamically loads modules when they are needed
- The UI is up to you

## Example

codesandbox: https://codesandbox.io/s/boring-mendeleev-tcpdv

```tsx
const [entry, setEntry] = useState(code);
const { node, error, run } = usePlayground(
{
entry: entry
},
"entry",
{
react: lazyModule(React)
}
);
return (



setEntry(e.target.value)} />

Run
{node}

);
```

## Usage

The primary export of this package is a hook named `usePlayground` with the following signature:

```tsx
function usePlayground(
codeModules: Record,
entry?: string,
modules?: Record Promise>, () => Record | undefined]>
): {
error: Error | undefined;
node: React.ReactNode;
run: () => readonly [Promise, React.MutableRefObject<...>] | readonly [...];
promise: React.MutableRefObject<...>;
cancel: React.MutableRefObject<...>;
}
```

`codeModules` is a mapping that specifies the "files" that should be available in the execution context and which should be transpiled internally. When you call `run` the module named `entry` is executed. Using the `modules` parameter additional modules can be specified which are available as an object or a dynamic import. You can use it to inject modules into the sandbox. If you for example want your UI library available in the playground you have to specify it in modules. The signature of modules might look weird, but it is required to allow both the SSR use case and to dynamically load the parts of the module which are required. This package also exports a utility function called `lazyModule` which returns an object that can be passed to modules as a value. You have to provide `lazyModule` with a synchronously loaded variant of your module and you can optionally provide a variant that is loaded asynchronously if it is required. This is useful if you want some parts of your library available all the time but don't want the entire library loaded when it is not needed.

## Bundle Size

The bundle provided by the package as it is distributed by npm includes a modified build of sucrase that doesn't support typescript and flow type annotations