@burnsred/entity-duck
v2.0.0-rc.1
Published
entity-duck
Readme
@burnsred/entity-duck
const action = {
meta: {
entity: '',
id: 'uuid',
},
payload: undefined,
promise: '',
type: '@@Person/entities/PEOPLE_GET',
};Configuration in client app
import { configureStore } from '@reduxjs/toolkit';
import { Map } from 'immutable';
import { combineReducers } from 'redux-immutable';
import {
createDuckReducerFromRequires,
duckMiddleware,
filterEntityRequirements,
} from '@burnsred/entity-duck';
import { axiosInstance } from 'api';
import * as entities from 'entities';
import { settings } from 'settings';
// In dev, cross-check the barrel against all entity files on disk and warn
// about any Entity-with-duck that was forgotten in entities/index.ts.
// import.meta.glob must be a string literal — pass the result, not the pattern.
const requirements = filterEntityRequirements(
entities,
import.meta.env.DEV
? import.meta.glob('./entities/**/*.ts', { eager: true })
: undefined,
);
// Alternatively, skip the barrel entirely — glob auto-discovers every entity:
// const requirements = collectEntityRequirements(
// import.meta.glob('./entities/**/*.ts', { eager: true }),
// );
const rootReducerMap = createDuckReducerFromRequires(
requirements,
combineReducers,
);
export const store = configureStore({
reducer: combineReducers(rootReducerMap),
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
// Immutable.js values are not serializable / plain objects
serializableCheck: false,
immutableCheck: false,
}).concat(duckMiddleware({ settings, client: axiosInstance })),
preloadedState: Map(),
// https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/API/Arguments.md
devTools: import.meta.env.DEV && { trace: true, traceLimit: 100 },
});