npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

beaf

v0.2.0

Published

Show the BEfore and AFter of your text transformation/processing/whatever.

Readme

BEAF 🍖

BEAF is little thingy that allows you to make an online REPL for whatever you want to demonstrate. It takes text input from the left (before), runs it through a thing that transforms it, and puts the output on the right (after).

Think SassMeister or the Babel REPL.

Installation

Install the libraries and its peerDependencies using either yarn or npm:

yarn

yarn add beaf
yarn add brace react react-dom react-redux redux redux-thunk

npm

npm install --save beaf
npm install --save brace react react-dom react-redux redux redux-thunk

Usage

The main ingredient in BEAF is the transformation function. This takes the content of the textarea on the left and any optional parameters and puts it through some black box of your design, which returns either a Promise or the transformed value. The result of that transformation is displayed on the right.

createBeaf

The easiest way to get started is using createBeaf. You can simply give it a transformation function, run it through your bundler of choice, and it'll work.

Here's an example of your entry file:

import { createBeaf } from 'beaf';

createBeaf((text, options) => {
  let transformedText = text;
  // YOUR CODE HERE
  return transformedText;
});

createBeaf can also take an options object instead, which lets you do all sorts of crazy stuff. For example, you can set colors or pick a theme and syntax mode for the Ace editor.

import { createBeaf } from 'beaf';

// Brace themes and modes need to be imported to work!
import 'brace/theme/monokai';
import 'brace/mode/jsx';
import 'brace/mode/javascript';

createBeaf({
  localStorageKey: 'BEAF_REPL',
  title: 'My cool Babel compiler',
  toolbarOptions: [{
    type: 'checkbox',
    key: 'jsx',
    name: 'Enable JSX'
    defaultValue: true,
  }],
  transform: (input, options) => babelCompileSync(input, options), // hand-wavey
  theme: 'monokai'
  inputMode: 'jsx',
  outputMode: 'javascript',
  backgroundColor: '#ffffff',
  textColor: '#333333',
  headerBackgroundColor: '#fd8382',
  headerTextColor: '#ffffff',
  toolbarBackgroundColor: '#2fc639',
  toolbarTextColor: '#ffffff',
  subheaderBackgroundColor: '#1996fc',
  subheaderTextColor: '#ffffff',
});

Supported options

General options
  • transform is a function that takes an input string from the left panel and an options object and returns the transformed value for the right panel.

  • input sets initial value for the left editor panel.

  • output sets initial value for the right editor panel.

  • options is an object of options that gets passed into the transformation function.

  • title is displayed at the top of BEAF.

  • titleUrl sets a clickthrough URL on the title.

  • menuItems specifies array of { name, url } objects to use as links in the top-right corner of the header.

  • toolbarOptions specifies an array of { type, key, name, defaultValue } objects to populate the toolbar with controls that change the transform options. Supported types are text, number, checkbox, and select (use options to populate the drop-down).

  • localStorageKey can be used to set a key in local storage where the BEAF editor values are saved. By default, BEAF saves the editor values in local storage under BEAF_REPL, but you can change or disable it.

  • inputTitle is the header of the left pane.

  • outputTitle is the header of the right pane.

Theming options

These options get passed to the Ace editor.

  • theme is the syntax theme for Ace.
  • inputMode is the left editor's input mode for syntax highlighting.
  • outputMode is the right editor's input mode for syntax highlighting.

These options set text/background colors and fonts.

  • backgroundColor
  • textColor
  • fontFamily
  • headerBackgroundColor
  • headerTextColor
  • headerFontFamily
  • toolbarBackgroundColor
  • toolbarTextColor
  • toolbarFontFamily
  • subheaderBackgroundColor
  • subheaderTextColor
  • subheaderFontFamily
  • editorFontFamily
Component overrides

You can pass props to the React components used in BEAF from the top level.

  • headerProps are passed to the header component.
  • toolbarProps are passed to the toolbar component.
  • paneProps are passed to each of the pane components, which wrap the left and right editors.
  • inputProps are passed to the left pane's editor component.
  • outputProps are passed to the right pane's editor component.

If you want, you can even override the components entirely, such as if you want the right pane to be a non-Ace editor.

  • HeaderComponent is the title and menu.
  • ToolbarComponent is the toolbar for setting options.
  • InputComponent is the editor in the left pane.
  • OutputComponent is the editor in the right pane.

React Component

BEAF is a React component hooked up to a Redux store. You can incorporate it (or pieces of it) into a larger React application, if that's more your style. You can override the components used for the header and each editor!

import { Beaf } from 'beaf';

class YourComponent extends Component {
  render() {
    return (
      <Beaf
        input="Initial text value"
        transform={(input, options) => { /* ... */}}
      />
    );
  }
}

Fun fact: createBeaf is just a wrapper around the Beaf component, so all of the options described above can be used as props here.

Contributing / TODO

I have a little list of top-of-mind things that I want to add to this thing sooner or later. Do you want to help? How nice of you! Please submit a pull request.

  • Getters on the Beaf component
  • More exploration around using Beaf as a controlled component
  • Improved documentation
  • Progress spinner for async transforms
  • Error indicator if the transformation somehow failed
  • Tests, I guess

Developing and playing around with the examples in the repository is pretty straightforward. npm run start starts a Webpack dev server, then you can go to http://localhost:8086/simple (or whatever example you're testing) and see what's going on.