diff --git a/src/cache.js b/src/cache.js index 47d6f96f..2d58eeb4 100644 --- a/src/cache.js +++ b/src/cache.js @@ -114,7 +114,13 @@ export function get(target, key, fn) { return entry.value; } -export function assert(target, key, value) { +export function assert(target, key, value, force) { + if (context && !force) { + throw Error( + `Try to assert value of the '${key}' inside of the value function`, + ); + } + const entry = getEntry(target, key); entry.value = undefined; diff --git a/src/store.js b/src/store.js index 23984052..1c9857ed 100644 --- a/src/store.js +++ b/src/store.js @@ -318,11 +318,16 @@ function getTypeConstructor(type, key) { function setModelState(model, state, value) { const lastConfig = cache.getEntry(model, "state").value; - cache.assert(model, "state", { - state, - value, - error: (state === "error" ? value : lastConfig?.error) || false, - }); + cache.assert( + model, + "state", + { + state, + value, + error: (state === "error" ? value : lastConfig?.error) || false, + }, + true, + ); return model; } @@ -1622,7 +1627,7 @@ function resolveModel(Model, config, id) { const clone = Object.freeze(Object.create(lastModel)); definitions.set(clone, config); - cache.assert(clone, "state", getModelState(nextModel)); + cache.assert(clone, "state", getModelState(nextModel), true); return clone; } diff --git a/test/spec/cache.js b/test/spec/cache.js index d00472f6..6697827c 100644 --- a/test/spec/cache.js +++ b/test/spec/cache.js @@ -34,6 +34,14 @@ describe("cache:", () => { ).toThrow(); }); + it("throws for assert value inside of the getter call", () => { + expect(() => + get(target, "key", () => { + assert(target, "key", "value"); + }), + ).toThrow(); + }); + it("re-throws getter error with cleanup", () => { expect(() => get(target, "key", () =>