UNPKG

chromogen

Version:

simple, interaction-driven Jest test generator for Recoil and React Hooks apps

78 lines (77 loc) 3 kB
"use strict"; 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;