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

@kyle-villeneuve/deepstate

v1.0.2

Published

## Motivation

Downloads

2

Readme

DeepState

Motivation

To make updating immutable objects and arrays more succinct and readable.

Usage

deepState(initialState, path, update);

initialState: an object or array you wish to update. This original value will never be mutated, a new copy will be created where item(s) at the end of the path are updated as specified by the update value or function.

path: an array of strings (keys) and/or objects (conditions). Objects can be used when the value at that particular path depth is an array. Objects keys are conditions that must be met for an element to be updated. For example, passing an object like the following would update all values in an array where name === 'example'

{
  name: 'example';
}

Object values can either be primitives or a function. As shown above, primitive values are the same as comparing strict equality, multiple object properties means that multiple conditions must be true for the element in the array to be updated.

When an object value is a function, if the function returns true then the element will be updated. The following example would update all elements in an array where the id > 5 && name === 'bob'

{ id: (id) => id > 5, name: 'bob' }

update: can either be a static value or a callback function where the element(s) at the end of the path are passed as an argument. The callback function must be pure and should never mutate the state directly. Alternatively, you can also pass any value you want to replace at the end of the path specified. All three examples below create a new state object with the same data.

// using a callback
// this is convenient when you want to perform more complex mutations
deepState(state, ['users', { id: 5 }, 'posts', { id: 2 }], post => ({
  ...post,
  title: 'updated post title',
}));
// using a value
deepState(
  state,
  ['users', { id: 5 }, 'posts', { id: 2 }, 'title'],
  'updated post title'
);
// handwritten
{
    ...state,
    users: state.users.map(user => user.id === 5 ?
        {
            ...user,
            posts: user.posts.map(post => post.id === 2 ? {
                ...post,
                title: "updated post title"
            }: post)
        } : user
    )
}