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

@alesmenzel/nuclear-core

v1.0.0

Published

Framework agnostic state management library

Downloads

5

Readme

🍱 Nuclear Core

Framework agnostic reactive state management library.

Installation

npm install @alesmenzel/nuclear-core

Usage

Atom

Atom is the basic building block. It is a micro observable wrapper that emits an update event you can listen on with subscribe(...). The value of Atom can be anything. By default the update event will be fired only when the value changes with strict value comparison ===, but you can change the equality function to for example deepEqual if you want to with atom's options.

import { atom } from "@alesmenzel/nuclear-core"

const listOfBears = atom(['🧸', '🐻', '🐻‍❄️'])
// With options
// const listOfBears = atom(['🧸', '🐻', '🐻‍❄️'], { equal: _.deepEqual })
listOfBears.value // -> ['🧸', '🐻', '🐻‍❄️']
listOfBears.get() // -> ['🧸', '🐻', '🐻‍❄️']
listOfBears.value = ['🐻‍❄️'] // -> ['🐻‍❄️']
listOfBears.set((bears) => [...bears, '🐻‍❄️']) // -> ['🐻‍❄️', '🐻‍❄️']
listOfBears.set(['🐻‍❄️', '🐻‍❄️', '🐻‍❄️']) // -> ['🐻‍❄️', '🐻‍❄️', '🐻‍❄️']

const onUpdate = (bears) => {
  console.log(bears)
}
const unsubscribe = listOfBears.subscribe(onUpdate)
listOfBears.unsubscribe(onUpdate) // or unsubscribe()

Derived Atom

DerivedAtom is also an Atom, but its value is derived from the given list of atoms and a select function. Since DerivedAtom is also an Atom, you can do anything that you can do with Atom (see above).

import { derive } from "@alesmenzel/nuclear-core"

const shoppingList = atom([{name: '🍎', qt: 10, price: 3}, {name: '🍐', qt: 2, price: 5}])
const grandTotal = derive([shoppingList], (list) => {
  return list.reduce((acc, item) => acc + item.qt * item.price, 0)
})

grandTotal.value // 40

Custom Atom

Atom by itself is pretty plain reactive container, would it be great if we could create a reactive model with helper methods like addItemToCart(...) or increase/decreaseQuantity(...)? I think it would.

import { Atom, derive } from "@alesmenzel/nuclear-core"

type ShoppingListItem = {name: string, qt: number, price: number}

class ShoppingListAtom extends Atom<ShoppingListItem[]> {
  addItemToCart(item: ShoppingListItem) {
    this._value = [...this._value, item]
  }

  increaseQuantity(itemName, count = 1) {
    // In a real project, you would probably want to store the items in a Map instead, so you can access them directly
    this._value = this._value.map(item => item.name === itemName ? {...item, qt: item.qt + count} : item)
  }
}

const shoppingList = new ShoppingListAtom([{name: '🍎', qt: 10, price: 3}, {name: '🍐', qt: 2, price: 5}])
const grandTotal = derive([shoppingList], (list) => {
  return list.reduce((acc, item) => acc + item.qt * item.price, 0)
})

grandTotal.value // 40

You could also create your custom DeriveAtom if you want to with helper functions like getPriceInEuro(...) for example.