
Research
Malicious npm Packages Impersonate Flashbots SDKs, Targeting Ethereum Wallet Credentials
Four npm packages disguised as cryptographic tools steal developer credentials and send them to attacker-controlled Telegram infrastructure.
[](https://github.com/conorhastings/react-syntax-highlighter/actions) [
Inspired by the reducerComponent
of ReasonReact
, this provides a way to declaratively declare side effects with updates, or to execute a side effect through the reducer while keeping the reducer pure.
The general idea being that the side effects simply declare intent to execute further code, but belong with the update.
reducers always return one of Update
, NoUpdate
, UpdateWithSideEffects
, or SideEffects
function.
One example in which this may be useful is when dispatching a second action depends on the success of the first action, instead of waiting to find out, one can declare the side effect along side the update.
npm install use-reducer-with-side-effects
yarn add use-reducer-with-side-effects
Update(newState)
Outside of returning the functions of above inside you're reducer this should function almost identically to the built in useReducer.
import React, { useReducer } from 'react';
function Avatar({ userName }) {
const [state, dispatch] = useReducer(
(state, action) => {
switch (action.type) {
case FETCH_AVATAR: {
return { ...state, fetchingAvatar: true };
}
case FETCH_AVATAR_SUCCESS: {
return { ...state, fetchingAvatar: false, avatar: action.avatar };
}
case FETCH_AVATAR_FAILURE: {
return { ...state, fetchingAvatar: false };
}
}
},
{ avatar: null }
);
useEffect(() => {
dispatch({ type: FETCH_AVATAR });
fetch(`/avatar/${userName}`).then(
avatar => dispatch({ type: FETCH_AVATAR_SUCCESS, avatar }),
dispatch({ type: FETCH_AVATAR_FAILURE })
);
}, [userName]);
return <img src={!state.fetchingAvatar && state.avatar ? state.avatar : DEFAULT_AVATAR} />
}
Library with colocated async action
import useReducerWithSideEffects, { UpdateWithSideEffect, Update } from 'use-reducer-with-side-effects';
function Avatar({ userName }) {
const [{ fetchingAvatar, avatar }, dispatch] = useReducerWithSideEffects(
(state, action) => {
switch (action.type) {
case FETCH_AVATAR: {
return UpdateWithSideEffect({ ...state, fetchingAvatar: true }, (state, dispatch) => { // the second argument can also be an array of side effects
fetch(`/avatar/${userName}`).then(
avatar =>
dispatch({
type: FETCH_AVATAR_SUCCESS,
avatar
}),
dispatch({ type: FETCH_AVATAR_FAILURE })
);
});
}
case FETCH_AVATAR_SUCCESS: {
return Update({ ...state, fetchingAvatar: false, avatar: action.avatar });
}
case FETCH_AVATAR_FAILURE: {
return Update({ ...state, fetchingAvatar: false })
}
}
},
{ avatar: null }
);
useEffect(() => dispatch({ type: FETCH_AVATAR }) , [userName]);
return <img src={!fetchingAvatar && avatar ? avatar : DEFAULT_AVATAR} />;
}
FAQs
[](https://github.com/conorhastings/react-syntax-highlighter/actions) [
The npm package cersei receives a total of 1 weekly downloads. As such, cersei popularity was classified as not popular.
We found that cersei demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Four npm packages disguised as cryptographic tools steal developer credentials and send them to attacker-controlled Telegram infrastructure.
Security News
Ruby maintainers from Bundler and rbenv teams are building rv to bring Python uv's speed and unified tooling approach to Ruby development.
Security News
Following last week’s supply chain attack, Nx published findings on the GitHub Actions exploit and moved npm publishing to Trusted Publishers.