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

somehooks

v0.0.4

Published

Framework agnostic hooks

Readme

SomeHooks

A collection of framework agnostic hooks.

Abstract

SomeHooks manages state and side-effects in functional pipelines and works well with asyncronous and callback-driven environments.

Unlike other libraries, SomeHooks do not depend on order, location, or scope.

They can be used anywhere.

Types of Hooks

There are three categories of hooks:

  • passive
  • reactive
  • custom

All hooks are based on the createMemo pattern.

Passive hooks

Most Hooks are passive hooks and cache the result of an expensive operation.

SomeHooks includes the following passive hooks:

Reactive Hooks

A reactive hook requests updates from a given call stack.

Keep in mind, reactive hooks can cause infinite loops.

SomeHooks includes the following reactive hooks:

Custom Hooks

Passive and reactive hooks can be combined to create custom hooks.

While other environments require transpilation to use hooks alongside components, SomeHooks is scoped to the browser. It requires a more declarative and factory-driven approach.

Keep in mind: custom hooks are potentially comprised of reactive hooks, so custom hooks can cause infinite loops.

A custom hooks should factory return a custom hook function. In the example below, the createClock factory returns a useClock hook.

Typescript:

import type { RequestUpdate } from "somehooks";

const createClock = (requestUpdate: RequestUpdate) => {
  const clockState = createState<string>(requestUpdate);
  const clockEffect = createEffect();

  return () => {
    const [state, setState] = clockState(new Date().toLocaleTimeString());

    clockEffect(() => {
      const stub = setInterval(() => {
        setState(new Date().toLocaleTimeString());
      }, 1000);

      return () => {
        clearInterval(stub);
      };
    }, []);

    return state;
  };
};

Javascript:

const createClock = (requestUpdate) => {
  const clockState = createState(requestUpdate);
  const clockEffect = createEffect();

  return () => {
    const [state, setState] = clockState(new Date().toLocaleTimeString());

    clockEffect(() => {
      const stub = setInterval(() => {
        setState(new Date().toLocaleTimeString());
      }, 1000);

      return () => {
        clearInterval(stub);
      };
    }, []);

    return state;
  };
};

Webcomponents

Custom hooks can isolate complicated logic in webcomponents to a single function call.

Below is a slightly modified version of the createClock factory example found above. It accounts for the isConnected event found in Webcomponents.

Typescript:

import { LitElement, html } from "lit";
import { createState, createEffect } from "somehooks";

import type { RequestUpdate } from "somehooks";

const createClock = (requestUpdate: RequestUpdate) => {
  const clockState = createState<string>(requestUpdate);
  const clockEffect = createEffect();

  return (isConnected: boolean) => {
    const [state, setState] = clockState(new Date().toLocaleTimeString());

    clockEffect(() => {
      if (!isConnected) {
        return;
      }

      const stub = setInterval(() => {
        setState(new Date().toLocaleTimeString());
      }, 1000);

      return () => {
        clearInterval(stub);
      };
    }, [isConnected]);

    return state;
  };
};

Javascript:

import { LitElement, html } from "lit";
import { createState, createEffect } from "somehooks";

const createClock = (requestUpdate) => {
  const clockState = createState(requestUpdate);
  const clockEffect = createEffect();

  return (isConnected) => {
    const [state, setState] = clockState(new Date().toLocaleTimeString());

    clockEffect(() => {
      if (!isConnected) {
        return;
      }

      const stub = setInterval(() => {
        setState(new Date().toLocaleTimeString());
      }, 1000);

      return () => {
        clearInterval(stub);
      };
    }, [isConnected]);

    return state;
  };
};

The createClock hook above is used in the example Webcomponent below.

class MyClock extends LitElement {
  useClock = createClock(() => this.requestUpdate());

  render() {
    const timestring = this.useClock(this.isConnected);

    return html`<p>${timestring}</p>`;
  }
}

License

SomeHooks is released under the Apache License Version 2.0