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

@triggery/solid

v0.10.0

Published

SolidJS bindings for Triggery — same useEvent / useCondition / useAction surface as React, native to signals + onCleanup. Zero runtime dependencies.

Readme

@triggery/solid

SolidJS bindings for Triggery. Same useEvent / useCondition / useAction shape as @triggery/react, native to Solid's signals and lifecycle.

Install

pnpm add @triggery/core @triggery/solid solid-js

Usage

import { createSignal, type Component } from 'solid-js';
import { createRuntime, createTrigger } from '@triggery/core';
import {
  TriggerRuntimeProvider,
  TriggerScope,
  useAction,
  useCondition,
  useEvent,
} from '@triggery/solid';

type Settings = { sound: boolean; notifications: boolean };

const messageTrigger = createTrigger<{
  events: { 'new-message': { text: string; author: string } };
  conditions: { settings: Settings };
  actions: { showToast: { title: string; body: string } };
}>({
  id: 'message-received',
  events: ['new-message'],
  required: ['settings'],
  handler({ event, conditions, actions }) {
    if (!conditions.settings.notifications) return;
    actions.showToast?.({ title: event.payload.author, body: event.payload.text });
  },
});

const runtime = createRuntime();

const SettingsProvider: Component = () => {
  const [settings] = createSignal<Settings>({ sound: true, notifications: true });
  useCondition(messageTrigger, 'settings', () => settings());
  return null;
};

const Chat: Component = () => {
  const fire = useEvent(messageTrigger, 'new-message');
  return (
    <button onClick={() => fire({ text: 'hi', author: 'Alice' })}>
      send
    </button>
  );
};

const Toast: Component = () => {
  useAction(messageTrigger, 'showToast', ({ title, body }) => {
    console.log(`[${title}] ${body}`);
  });
  return null;
};

export const App: Component = () => (
  <TriggerRuntimeProvider runtime={runtime}>
    <SettingsProvider />
    <Chat />
    <Toast />
  </TriggerRuntimeProvider>
);

API

<TriggerRuntimeProvider runtime>

Provide a Triggery runtime to the subtree. Required for any descendant using useEvent / useCondition / useAction.

<TriggerScope id>

Scope subsequent condition / action registrations. Triggers declared with the matching scope in their config see registrations from inside; global triggers see only registrations from outside any scope.

useEvent(trigger, eventName)

Returns a function that fires the event. Stable identity — call once in setup, reuse the returned function.

useCondition(trigger, name, getter)

Register a getter that the runtime calls at fire time. Pull-only — Solid components don't re-render because of this hook. Read signals naturally inside the getter (() => mySignal()). Automatically unregisters when the enclosing scope disposes.

useAction(trigger, name, handler)

Register an action handler for the trigger. Invoked whenever the trigger body calls actions.<name>(...). Automatically unregisters on dispose.

How Solid integration differs from React

Solid components only run their setup once. No useCallback, no dependency arrays, no ref dance — just close over what you need. Condition getters that read signals automatically see the latest value at fire time because Solid signals are pure functions.

Documentation

Full documentation, recipes and API reference at https://triggeryjs.github.io/packages/solid/.

Related packages

See the full package list in the repo README.

License

MIT © Aleksey Skhomenko