chromogen
Version:
simple, interaction-driven Jest test generator for Recoil and React Hooks apps
78 lines (77 loc) • 3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectorFamily = exports.atomFamily = exports.atom = exports.selector = void 0;
const recoil_1 = require("recoil");
const core_utils_1 = require("./core-utils");
const utils_1 = require("../utils/utils");
const ledger_1 = require("../utils/ledger");
const family_utils_1 = require("./family-utils");
function selector(config) {
const { key, get } = config;
const { transactions, selectors, setters } = ledger_1.ledger;
if (transactions.length > 0
|| !get
|| get.constructor.name === 'AsyncFunction'
|| get.toString().match(/^\s*return\s*_.*\.apply\(this, arguments\);$/m)) {
return (0, recoil_1.selector)(config);
}
const getter = (0, core_utils_1.wrapGetter)(key, get);
const newConfig = { key, get: getter };
if ('set' in config) {
const setter = (0, core_utils_1.wrapSetter)(key, config.set);
newConfig.set = setter;
setters.push(key);
}
const trackedSelector = (0, recoil_1.selector)(newConfig);
selectors.push(trackedSelector.key);
return trackedSelector;
}
exports.selector = selector;
function atom(config) {
const { transactions, atoms } = ledger_1.ledger;
const newAtom = (0, recoil_1.atom)(config);
if (transactions.length === 0)
atoms.push(newAtom);
return newAtom;
}
exports.atom = atom;
function atomFamily(config) {
const { atomFamilies } = ledger_1.ledger;
const { key } = config;
atomFamilies[key] = {};
return (params) => {
const strParams = JSON.stringify(params);
const cachedAtom = atomFamilies[key][strParams];
if (cachedAtom !== undefined)
return cachedAtom;
const newAtomFamilyMember = (0, recoil_1.atomFamily)(config)(params);
if (strParams !== utils_1.dummyParam)
atomFamilies[key][strParams] = newAtomFamilyMember;
return newAtomFamilyMember;
};
}
exports.atomFamily = atomFamily;
function selectorFamily(config) {
const { key, get } = config;
const { transactions, selectorFamilies } = ledger_1.ledger;
if (!get
|| transactions.length > 0
|| get(utils_1.dummyParam).constructor.name === 'AsyncFunction'
|| get(utils_1.dummyParam)
.toString()
.match(/^\s*return\s*_.*\.apply\(this, arguments\);$/m)) {
return (0, recoil_1.selectorFamily)(config);
}
const getter = (0, family_utils_1.wrapFamilyGetter)(key, get);
const newConfig = { key, get: getter };
let isSettable = false;
if ('set' in config) {
isSettable = true;
const setter = (0, family_utils_1.wrapFamilySetter)(key, config.set);
newConfig.set = setter;
}
const trackedSelectorFamily = (0, recoil_1.selectorFamily)(newConfig);
selectorFamilies[key] = { trackedSelectorFamily, prevParams: new Set(), isSettable };
return trackedSelectorFamily;
}
exports.selectorFamily = selectorFamily;