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

redux-entitize

v0.7.1

Published

Manage all entities in a normalized redux state.

Readme

redux-entitize

Automated redux-state management for all your entities.

redux-entitize helps you organize all your entities in unified and normalized state. It ships with:

  • a reducer
  • a set of action creators to populate your state with entity data
  • a set of selectors to retrieve entities from the state

Install

yarn add redux-entitize
# or
npm install --save redux-entitize

Getting Started

1. Define your schemas

You need to tell redux-entitize about all your normalizr-schemas by defining a schemaMap:

// schemaMap.js

import { normalize, schema } from 'normalizr';

const userSchema = new schema.Entity('users');
const commentSchema = new schema.Entity('comments', {
  commenter: userSchema
});

export const schemaMap = {
  users: userSchema,
  comments: commentSchema,
};

2. Add the entities-reducer

// reducers.js

import { createEntitiesReducer } from 'redux-entitize';
import { combineReducers } from 'redux';
import { schemaMap } from './schemaMap';

const entitiesReducer = createEntitiesReducer(schemas);

export const reducers = combineReducers({
  entities: entitiesReducer // must be called entities
  // ... your other reducers
});

Note: In order for the selectors to Just Work™, the state slice must be called entities.

Dispatch update actions

To add new entities or update existing ones, use updateEntityAction / updateEntitiesAction.

To remove an entity from your state, use deleteEntityAction.

// main.js

import { createStore } from 'redux';
import {
  updateEntityAction,
  updateEntitiesAction,
  deleteEntityAction,
} from 'redux-entitize';

import { reducers } from './reducers';

const store = createStore(reducers);

store.dispatch(
  updateEntityAction('users', {
    id: "1234",
    email: "[email protected]",
    age: 25,
  })
);

store.dispatch(
  updateEntitiesAction('comments', [{
    id: "567",
    message: "Hello world.",
    commenter: "1234",
  }, {
    id: "890",
    message: "Yet another comment. Even by the same commenter",
    commenter: "1234",
  }])
);

store.dispatch(
  deleteEntityAction('comments', "567");
);

Note: Where these actions are actually dispatched is dependent on how your app is interacting with the API.

Select entities from state

redux-entitize provides a selectors factory to simplify selecting entities from the state. It's strongly recommended to use these, because

  • selected entities will be automatically de-normalized
  • selectors are based on reselect, so they are memoized (otherwise you application will most likely be slow)
  • selectors are meant to remain stable throughout changes of the internal entities-state
// selectors.js

import { createSelectors } from 'redux-entitize';

// Assuming we have that `schemaMap` variable from above when you created your schemas
import { schemaMap } from './schemaMap'

export const selectors = createSelectors(schemaMap)

Import the selectors in your components and render data as you like.

// UserList.js

import React from 'react';
import { connect } from 'react-redux';

import UserList './UserList';
import {
  selectEntity,
  selectEntities
} from './selectors';

function mapStateToProps(state) {
  return {
    // Get all entities of a type
    allUsers: selectEntities(state, 'users'),

    // Get all entities of a type with certain IDs
    // (state.userList.filteredIds === ['id1', 'id2', 'id3'])
    filteredUsers: selectEntities(state, 'users', state.userList.filteredIds),

    // Get a single entity of a type with a certain ID
    // (state.login.userId === 'id123')
    loggedInUser: selectEntity(state, 'users', state.login.userId)
  };
}

export default connect(mapStateToProps)(UserList);