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

frampton-app

v0.0.8

Published

A module for wiring apps with frampton.js

Readme

Frampton-App

Build Status

A module for wiring an application with frampton.js

This is essentially a pure JavaScript implementation of Elm's StartApp.

The Elm Architecture

Install

npm install --save frampton
npm install --save frampton-dom
npm install --save frampton-app

Include

<script src="./node_modules/frampton/dist/frampton.js"></script>
<script src="./node_modules/frampton-dom/dist/frampton-dom.js"></script>
<script src="./node_modules/frampton-app/dist/frampton-app.js"></script>

BasicApp

A basic app updates a state based on a list of inputs

const BasicApp = Frampton.App.basic;
const Never = Frampton.Data.Task.never;
const Signal = Frampton.Signal.create;

const inputs = Signal();

// Get the initial app state and initial tasks to run
function init() {
  const initialState = { name : 'Larry' };
  const initialTask = Never();
  return [initialState, initialTask];
}

// Update state based on messages
function update(msg, state) {
  switch(msg) {
    case 'input happened':
      const newState = { name : 'Bob' };
      return [newState, Never()];

    default:
      return [state, Never()];
  }
}

// Create app
// Inputs is an array of Signal objects used to introduce events to the system.
const app = BasicApp({
  init : init,
  update : update,
  inputs : [inputs]
});

// The return value is a Signal of the current app state
app.value((currentState) => {
  console.log('The current app state: ', currentState);
});

inputs.push('input happened');

WithViewApp

An app with a view take two additional parameters, a function to render a view and a DOM node to attach the view to.

const WithViewApp = Frampton.App.withView;
const Never = Frampton.Data.Task.never;
const { div, text } = Frampton.DOM.Html;

// Get the initial app state and initial tasks to run
function init() {
  const initialState = { name : 'Larry' };
  const initialTask = Never();
  return [initialState, initialTask];
}

// Update state based on messages
function update(msg, state) {
  switch(msg) {
    case 'click happened':
      const newState = { name : 'Bob' };
      return [newState, Never()];

    default:
      return [state, Never()];
  }
}

// Render view based on state
// Return values of event handlers are fed to update function as messages
function view(state) {
  const clickHandler = (evt) => {
    return 'click happened';
  };

  return div({ onClick : clickHandler }, [
    text('click me')
  ]);
}

// Create app
const app = WithViewApp({
  init : init,
  update : update,
  view : view,
  rootElement : document.getElementById('app-root')
});

// The return value is a Signal of the current app state
app.value((currentState) => {
  console.log('The current app state: ', currentState);
});