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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@mfellner/valtio-inversify

v1.0.0-alpha.0

Published

Create class-based valtio stores with inversify.

Downloads

4

Readme

valtio-inversify 🪬

Build Status Codecov Build Size Version Downloads

Create valtio state from class-based stores using Inversify

valtio-inversify consists of TypeScript decorators and a middleware for Inversify. It allows valtio stores...

  • to be declared as injectable classes
  • to declare actions as class methods
  • to define subscriptions as (static) class methods
  • to create derived properties with acessor methods

Existing valtio utilities can still be used like usual.

import { valtioProxyMiddleware, valtio } from "@mfellner/valtio-inversify";

@valtio()
@injectable()
class CounterStore {
  count = 0;

  increment() {
    this.count += 1;
  }
}

const container = new Container();
container.applyMiddleware(valtioProxyMiddleware);

const counter = container.get(CounterStore);

Motivation

This library builds on top of the officially documented pattern for using classes as stores (to organize actions).

valtio-inversify enables an object-oriented approach to state management and aims to make state management code more maintainable and testable.

For instance, external dependencies like API clients can simply be injected into stores with the help of inversify.

valtio-inversify was inspired by the work on valtio-factory. If using Inversify is not an option for your own use case, perhaps valtio-factory would be a better fit as it aims to solve similar problems as this library.

Define actions

Actions are declared as methods on the class.

Subscribe

Subscribe to the whole state with instance methods

A class method annoted with @subscribe() will be subscribed to any state changes.

import { subscribe, valtio } from "@mfellner/valtio-inversify";

@valtio()
@injectable()
class CounterStore {
  count = 0;

  increment() {
    this.count += 1;
  }

  @subscribe()
  private onUpdated() {
    console.log("current count:", this.count);
  }
}

Subscription methods can be declared private or protected because they shouldn't be called externally.

Subscribe to a key with static methods

@subscribe takes an optional key argument to subscribe the annotated method only to state changes on the given key.

The annotated method will receive the updated value as an argument.

Subscriptions by key can be declared as static methods.

@valtio()
@injectable()
class CounterStore {
  @subscribe({ key: "count" })
  static onCountUpdated(value: number) {
    // called when `count` changes
  }

  count = 0;
}

Options

  • @subscribe<T> – For increased type safety, @subscribe can take an optional type argument.
  • @subscribe<T>({key?: keyof T}) – The annotated method will be subscribed to this key using valtio/utils/subscribeKey.
  • @subscribe({notifyInSync?: boolean}) – The subscription will be updated synchronously.

⚠️ Unsubscribe not supported

There's currently no way to unsubscribe a subscription.

Derive properties with accessor methods

Accessor ("getter") methods annoated with @derived() can return derived properties based on the current state. The methods are internally wapped with valtio/utils/derive.

import { derived, valtio } from "@mfellner/valtio-inversify";

@valtio()
@injectable()
class CounterStore {
  count = 0;

  increment() {
    this.count += 1;
  }

  @derived()
  get squaredCount() {
    return this.count * this.count;
  }
}

Options

  • @derived({sync?: boolean}) – This optional parameter is passed on to valtio's derive utility function.