Skip to content

Commit

Permalink
Merge pull request #62 from luisherranz/support-setters
Browse files Browse the repository at this point in the history
Support setters
  • Loading branch information
luisherranz authored Jan 11, 2024
2 parents 025c3ca + beee51e commit 13ccbb9
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/hot-ties-play.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"deepsignal": minor
---

Add support for setters.
5 changes: 4 additions & 1 deletion packages/deepsignal/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const arrayToArrayOfSignals = new WeakMap();
const proxies = new WeakSet();
const objToIterable = new WeakMap();
const rg = /^\$/;
const descriptor = Object.getOwnPropertyDescriptor;
let peeking = false;

export const deepSignal = <T extends object>(obj: T): DeepSignal<T> => {
Expand Down Expand Up @@ -58,7 +59,7 @@ const get =
const key = returnSignal ? fullKey.replace(rg, "") : fullKey;
if (
!signals.has(key) &&
typeof Object.getOwnPropertyDescriptor(target, key)?.get === "function"
typeof descriptor(target, key)?.get === "function"
) {
signals.set(
key,
Expand All @@ -83,6 +84,8 @@ const get =
const objectHandlers = {
get: get(false),
set(target: object, fullKey: string, val: any, receiver: object): boolean {
if (typeof descriptor(target, fullKey)?.set === "function")
return Reflect.set(target, fullKey, val, receiver);
if (!proxyToSignals.has(receiver)) proxyToSignals.set(receiver, new Map());
const signals = proxyToSignals.get(receiver);
if (fullKey[0] === "$") {
Expand Down
40 changes: 40 additions & 0 deletions packages/deepsignal/core/test/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,21 @@ describe("deepsignal/core", () => {
expect(store.nested.b).to.equal(3);
});

it("should support setting values with setters", () => {
const store = deepSignal({
counter: 1,
get double() {
return store.counter * 2;
},
set double(val) {
store.counter = val / 2;
},
});
expect(store.counter).to.equal(1);
store.double = 4;
expect(store.counter).to.equal(2);
});

it("should update array length", () => {
expect(store.array.length).to.equal(2);
store.array.push(4);
Expand Down Expand Up @@ -394,6 +409,31 @@ describe("deepsignal/core", () => {
});

describe("computations", () => {
it("should subscribe to values mutated with setters", () => {
const store = deepSignal({
counter: 1,
get double() {
return store.counter * 2;
},
set double(val) {
store.counter = val / 2;
},
});
let counter = 0;
let double = 0;

effect(() => {
counter = store.counter;
double = store.double;
});

expect(counter).to.equal(1);
expect(double).to.equal(2);
store.double = 4;
expect(counter).to.equal(2);
expect(double).to.equal(4);
});

it("should subscribe to changes when an item is removed from the array", () => {
const store = deepSignal([0, 0, 0]);
let sum = 0;
Expand Down

0 comments on commit 13ccbb9

Please sign in to comment.