Skip to content

Commit 007eaf4

Browse files
authored
Support nonReactive to avoid encouraging use of noContext (#510)
1 parent 8097eea commit 007eaf4

File tree

3 files changed

+59
-3
lines changed

3 files changed

+59
-3
lines changed

src/context.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { Slot } from "@wry/context";
22
import { AnyEntry } from "./entry.js";
33

4-
export const parentEntrySlot = new Slot<AnyEntry>();
4+
export const parentEntrySlot = new Slot<AnyEntry | undefined>();
5+
6+
export function nonReactive<R>(fn: () => R): R {
7+
return parentEntrySlot.withValue(void 0, fn);
8+
}
59

610
export {
711
bind as bindContext,

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { parentEntrySlot } from "./context.js";
1313
export {
1414
bindContext,
1515
noContext,
16+
nonReactive,
1617
setTimeout,
1718
asyncFromGen,
1819
} from "./context.js";

src/tests/context.ts

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
import { Slot } from "@wry/context";
12
import * as assert from "assert";
2-
import { wrap, setTimeout, asyncFromGen, noContext } from '../index.js';
3+
import {
4+
wrap,
5+
setTimeout,
6+
asyncFromGen,
7+
noContext,
8+
nonReactive,
9+
} from '../index.js';
310

411
describe("asyncFromGen", function () {
512
it("is importable", function () {
@@ -154,4 +161,48 @@ describe("noContext", function () {
154161
parent.dirty();
155162
assert.deepEqual(parent(), [4, 2]);
156163
});
157-
});
164+
});
165+
166+
describe("nonReactive", function () {
167+
const otherSlot = new Slot<string>();
168+
169+
it("censors only optimism-related context", function () {
170+
let innerCounter = 0;
171+
const inner = wrap(() => ++innerCounter);
172+
const outer = wrap(() => ({
173+
fromInner: nonReactive(() => inner()),
174+
fromOther: nonReactive(() => otherSlot.getValue()),
175+
}));
176+
assert.strictEqual(otherSlot.getValue(), undefined);
177+
otherSlot.withValue("preserved", () => {
178+
assert.deepEqual(outer(), { fromInner: 1, fromOther: "preserved" });
179+
assert.deepEqual(outer(), { fromInner: 1, fromOther: "preserved" });
180+
inner.dirty();
181+
assert.deepEqual(outer(), { fromInner: 1, fromOther: "preserved" });
182+
assert.strictEqual(inner(), 2);
183+
outer.dirty();
184+
assert.deepEqual(outer(), { fromInner: 2, fromOther: "preserved" });
185+
});
186+
assert.strictEqual(otherSlot.getValue(), undefined);
187+
});
188+
189+
it("same test using noContext, for comparison", function () {
190+
let innerCounter = 0;
191+
const inner = wrap(() => ++innerCounter);
192+
const outer = wrap(() => ({
193+
fromInner: noContext(inner),
194+
fromOther: noContext(() => otherSlot.getValue()),
195+
}));
196+
assert.strictEqual(otherSlot.getValue(), undefined);
197+
otherSlot.withValue("preserved", () => {
198+
assert.deepEqual(outer(), { fromInner: 1, fromOther: void 0 });
199+
assert.deepEqual(outer(), { fromInner: 1, fromOther: void 0 });
200+
inner.dirty();
201+
assert.deepEqual(outer(), { fromInner: 1, fromOther: void 0 });
202+
assert.strictEqual(inner(), 2);
203+
outer.dirty();
204+
assert.deepEqual(outer(), { fromInner: 2, fromOther: void 0 });
205+
});
206+
assert.strictEqual(otherSlot.getValue(), undefined);
207+
});
208+
});

0 commit comments

Comments
 (0)