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-crud-provider

v0.0.1-alpha.7

Published

This library is designed to store entities in redux and handles CRUD operations with a backend. It relies on `redux-crud` for handling redux and adds specific actions to create, read, update and delete entities on a backend.

Readme

Build Status

redux-crud-provider

This library is designed to store entities in redux and handles CRUD operations with a backend. It relies on redux-crud for handling redux and adds specific actions to create, read, update and delete entities on a backend.

How to

Define your entities

First, you need to define the entities used in your application.

The type of a ResourceDefinition can be found here.

Examples of ResourceDefinition can be found here.

Setup reducers

The library provides you with two reducers in order to keep track of the different entities of your application and the network activity.

createReducersForResources(entityDefinitions)
createActivityReducersForResources(entityDefinitions)

See an example of the redux setup here.

Selecting the entities from redux

To access the entities in your application, the library provides you with two selectors.

select(myResourceDefinition).asArray
select(myResourceDefinition).byId

Those can be used in your mapStateToProps like this:

import {select} from 'redux-crud-provider'

const mapStateToProps = state => ({
  books: select(BookResource).asArray(state),
  authorsById: select(AuthorResource).byId(state),
})

Setup the CRUD thunks

This library relies on redux-thunk in order to dispatch actions that will trigger backend calls. Make sure you have redux-thunk configured as a redux middleware in your application.

In order to update the entities in redux through backend calls, you need to create thunks.

const crudThunks = createCrudThunks(config)

The config needs to have this type. See an example here.

The createCrudThunks function will return an object with the following action creators:

Fetch all

crudThunks.fetchAll({resource, path, replace = false, params})

Parameters

| Name | Type | Required | Description | | -------- | ------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | resource | ResourceDefinition | yes | The resource that will be fetched | | path | string | | An optional path to use to fetch the resources. resource.defaultPath is used by default | | replace | boolean | | If true, all entities in redux will be dropped and replaced with the result from the backend. If false, entities retrieved will be merged with the existing one. | | params | object | | An optional object containing query params for the call |

Fetch one

crudThunks.fetchOne({resource, path, uuid, params})

Parameters

| Name | Type | Required | Description | | -------- | ------------------ | -------- | --------------------------------------------------------------------------------------------------- | | resource | ResourceDefinition | yes | The resource that will be fetched | | path | string | | An optional path to use to fetch the resource. ${resource.defaultPath}/${uuid} is used by default | | uuid | string | yes | The uuid of the entity that needs to be fetched | | params | object | | An optional object containing query params for the call |

Create

crudThunks.createResource({resource, path, entity})

Parameters

| Name | Type | Required | Description | | -------- | ------------------ | -------- | ------------------------------------------------------------------------------------------- | | resource | ResourceDefinition | yes | The resource that will be created | | path | string | | An optional path to use to fetch the resource. ${resource.defaultPath} is used by default | | entity | object | yes | An object containing the properties that will be sent to the backend |

Update

crudThunks.updateResource({resource, path, merge = true, entity, method, body})

Parameters

| Name | Type | Required | Description | | -------- | ------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | resource | ResourceDefinition | yes | The resource that will be updated | | path | string | | An optional path to use to fetch the resource. ${resource.defaultPath}/${entity[resource.key]} is used by default | | merge | boolean | | Whether or not to merge the entity provided with the existing entity in redux for the optimistic update | | entity | object | yes | An object containing the properties that will be sent to the backend | | method | string | | The method to use for the request. PATCH by default | | body | object | | Sometimes you are calling a route that will return an updated entity but where the body you send is not such an entity. This is typically the case for custom actions. If you provide a body, it will be used instead of the entity for the request. The response will then be handled like normal and the entity in the store will be updated with the response. |

Delete

crudThunks.deleteResource({resource, path, entity})

Parameters

| Name | Type | Required | Description | | -------- | ------------------ | -------- | ------------------------------------------------------------------------------------------------------------------- | | resource | ResourceDefinition | yes | The resource that will be deleted | | path | string | | An optional path to use to fetch the resource. ${resource.defaultPath}/${entity[resource.key]} is used by default | | entity | object | yes | An object containing the properties that will be sent to the backend |

Providers

Often, you won't need to use the thunks directly. Instead, the library provides you with react components that dispatch those actions for you.

ResourceListProvider

Example:

<ResourceListProvider crudThunks={crudThunks} resource={BookResource}>
  {({entities}) => (
    <ul>
      {entities.map(book => (
        <li key={book.id}>{book.name}</li>
      ))}
    </ul>
  )}
</ResourceListProvider>

Props

| Name | Type | Required | Description | | --------------- | ------------------ | -------- | ------------------------------------------------------------------------- | | children | function | yes | Render prop, see description below | | resource | ResourceDefinition | yes | The resource to use | | path | string | | Passed to crudThunks.fetchAll | | replace | boolean | | Passed to crudThunks.fetchAll | | params | object | | Passed to crudThunks.fetchAll | | autoFetch | boolean | | Triggers a call do the backend automatically to refresh the data in redux | | loadingRender | React Element | | A react element to render while data are being fetched | | crudThunks | object | yes | The result of createCrudThunks |

Children function

The children function will be called with an object with the following properties:

| Name | Type | Description | | ---------- | -------- | --------------------------------------------------- | | entities | array | The list of entities | | fetchAll | function | A function to trigger a fetch from the backend | | loading | boolean | true when there is an ongoing call to the backend |

ResourceProvider

Example:

<ResourceProvider
  crudThunks={crudThunks}
  resource={Book}
  uuid={match.params.uuid}
>
  {({entity}) => <h1>{entity.name}</h1>}
</ResourceProvider>

Props

| Name | Type | Required | Description | | --------------- | ------------------ | -------- | -------------------------------------------------------------------------------------------- | | children | function | yes | Render prop, see description below | | resource | ResourceDefinition | yes | The resource to use | | uuid | string | yes | The uuid of the entity to manage | | path | string | | Passed to crudThunks.fetchOne, crudThunks.updateResource and crudThunks.deleteResource | | params | object | | Passed to crudThunks.fetchOne | | autoFetch | boolean | | Triggers a call do the backend automatically to refresh the data in redux | | loadingRender | React Element | | A react element to render while data are being fetched | | crudThunks | object | yes | The result of createCrudThunks | | postAction | function | | A function called after a successful update or delete |

Children function

The children function will be called with an object with the following properties:

| Name | Type | Description | | ----------------------- | -------- | ------------------------------------------------------ | | entity | any | The entity | | fetchEntity | function | A function to re-fetch the entity from the backend | | updateEntity | function | A function to update the entity (calls the backend) | | deleteEntity | function | A function to delete the entity (calls the backend) | | thunks.fetchOne | function | The fetchOne thunk already bound to dispatch | | thunks.updateResource | function | The updateResource thunk already bound to dispatch | | thunks.deleteResource | function | The deleteResource thunk already bound to dispatch | | isFetching | boolean | True when the entity is being fetched | | isUpdating | boolean | True when the entity is being updated | | isRemoving | boolean | True when the entity is being deleted |

Peer dependencies

  • axios
  • react
  • react-redux
  • redux
  • reselect

yarn add axios react redux react-redux reselect