chromogen
Version:
simple, interaction-driven Jest test generator for Recoil and React Hooks apps
41 lines (40 loc) • 1.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.chromogenZustandMiddleware = void 0;
const ledger_1 = require("../utils/ledger");
const chromogenImpl = (creatorFunction) => (set, get, api) => {
const initialStateEntries = creatorFunction(api.setState, get, api);
const initialRender = filterOutFuncs(initialStateEntries);
ledger_1.ledger.initialRender = initialRender;
api.setState = (partial, replace, action, ...args) => {
const oldStore = filterOutFuncs(get());
const r = set(partial, replace);
const newStore = filterOutFuncs(get());
const changedValues = diffStateObjects(oldStore, newStore);
const newAction = {
action: typeof action === 'string' ? action : 'UnknownAction',
changedValues,
arguments: args,
};
ledger_1.ledger.transactions.push(newAction);
return r;
};
return creatorFunction(api.setState, get, api);
};
exports.chromogenZustandMiddleware = chromogenImpl;
const filterOutFuncs = (store) => {
const result = {};
for (const [k, v] of Object.entries(store)) {
if (typeof v !== 'function')
result[k] = v;
}
return result;
};
const diffStateObjects = (oldStore, newStore) => {
const changedValues = {};
for (const [k, v] of Object.entries(newStore)) {
if (JSON.stringify(oldStore[k]) !== JSON.stringify(v))
changedValues[k] = v;
}
return changedValues;
};