mosx
Version:
Multiview observable state management engine
515 lines • 55.4 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
const patchpack_1 = require("patchpack");
const index_1 = require("../index");
const tester_1 = require("../src/tester");
let Public = class Public {
constructor(params = {}) {
this.name = "";
const that = this;
Object.keys(params).forEach(key => {
that[key] = params[key];
});
}
get comp() { return this.pprop; }
get pcomp() { return this.mobx; }
};
__decorate([
index_1.mx
], Public.prototype, "prop", void 0);
__decorate([
index_1.mx.private
], Public.prototype, "pprop", void 0);
__decorate([
index_1.mx.computed
], Public.prototype, "comp", null);
__decorate([
index_1.mx.computed.private
], Public.prototype, "pcomp", null);
__decorate([
index_1.mx.observable
], Public.prototype, "mobx", void 0);
Public = __decorate([
index_1.mx.Object
], Public);
let Private = class Private extends Public {
};
__decorate([
index_1.mx
], Private.prototype, "ext", void 0);
Private = __decorate([
index_1.mx.Object.private
], Private);
class State extends Public {
}
__decorate([
index_1.mx
], State.prototype, "prop1", void 0);
__decorate([
index_1.mx.private
], State.prototype, "pprop1", void 0);
const state = new State({ name: "state" });
index_1.Mosx.addTag(state, "123");
const c1 = (id, value) => id === "client2" ? undefined : value;
const c2 = (id, value) => id === "client1" ? undefined : value;
const stateTracker = index_1.Mosx.createTracker(state, { serializer: index_1.SchemaSerializer, reversible: true });
const tester = new tester_1.MosxTester(stateTracker);
const decoder = {
client1: new patchpack_1.PatchPack(),
client2: new patchpack_1.PatchPack()
};
describe("Snapshot of state", () => {
const s1 = index_1.Mosx.getSnapshot(state, ["1"]);
const s2 = index_1.Mosx.getSnapshot(state, ["123"]);
const view1encoded = stateTracker.snapshot({ tags: ["1"] });
const view1 = decoder.client1.decodeState(view1encoded);
test(`should be equal decoded and snapshot for client1`, () => {
expect(s1).toMatchObject(view1);
});
const view2encoded = stateTracker.snapshot({ tags: ["123"] });
const view2 = decoder.client2.decodeState(view2encoded);
test(`should be equal decoded and snapshot for client2`, () => {
expect(s2).toMatchObject(view2);
});
test(`should be equal schema`, () => {
expect(decoder.client1.schema).toMatchObject(decoder.client2.schema);
});
});
tester.addListener("client1", "1");
tester.addListener("client2", ["2", "123"]);
const unhandledTest = (unhandled) => {
test("should not be unhandled patches", () => {
unhandled.length && console.log(unhandled);
expect(unhandled.length).toBe(0);
});
};
describe("Replace public property", () => {
const value = "test value";
tester
.onAction(() => state.prop = value)
.trigger(2, (id, change) => {
const { encoded } = change, patch = __rest(change, ["encoded"]);
test(`${id} should get replace change for property`, () => {
expect(patch).toMatchObject({ path: "/prop", op: "replace", value });
expect(patch).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Replace public property with private object", () => {
const oldValue = state.prop;
const obj = { prop: "test", pprop: "test2", ext: "ext" };
const value = new Private(Object.assign(Object.assign({}, obj), { name: "prop" }));
index_1.Mosx.setParent(value, state);
tester
.onAction(() => state.prop = value)
.trigger(2, (id, change) => {
const { encoded } = change, patch = __rest(change, ["encoded"]);
test(`${id} should get replace change for property`, () => {
expect(patch).toMatchObject({ path: "/prop", op: "replace", value: c2(id, obj), oldValue });
expect(patch).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Replace private property", () => {
const value = "test value";
tester
.onAction(() => state.pprop = value)
.trigger((id, _a) => {
var { encoded } = _a, patch = __rest(_a, ["encoded"]);
test(`${id} should get replace change for computed property`, () => {
expect(id).toBe("client1");
expect(patch).toEqual({ path: "/comp", op: "replace", value });
expect(patch).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, patch = __rest(_a, ["encoded"]);
test(`${id} should get replace change for computed property`, () => {
expect(id).toBe("client2");
expect(patch).toEqual({ path: "/comp", op: "replace", value });
expect(patch).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private property`, () => {
expect(id).toBe("client2");
expect(change).toEqual({ path: "/pprop", op: "replace", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Set property to public array", () => {
tester
.onAction(() => state.prop1 = [])
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for array property`, () => {
expect(change).toEqual({ path: "/prop1", op: "replace", value: [] });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Add to public array", () => {
const value = "test value";
tester
.onAction(() => state.prop1.push(value))
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for array property`, () => {
expect(change).toEqual({ path: "/prop1/0", op: "add", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Update item in public array", () => {
const oldValue = "test value";
const value = "test value 2";
tester
.onAction(() => state.prop1[0] = value)
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get remove change for array property`, () => {
expect(change).toEqual({ path: "/prop1/0", op: "replace", value, oldValue });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Remove from public array", () => {
const oldValue = state.prop1[0];
tester
.onAction(() => state.prop1.pop())
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get remove change for array property`, () => {
expect(change).toEqual({ path: "/prop1/0", op: "remove", oldValue });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Add private object to public array", () => {
const obj = { prop: "test", pprop: "test2", ext: "ext" };
const value = new Private(Object.assign(Object.assign({}, obj), { name: "prop1/0" }));
index_1.Mosx.setParent(value, state);
tester
.onAction(() => state.prop1.push(value))
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for array property`, () => {
expect(change).toMatchObject({ path: "/prop1/0", op: "add", value: c2(id, obj) });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Replace property in private object in public array", () => {
const value = "test value";
const oldValue = state.prop1[0].prop;
tester
.onAction(() => state.prop1[0].prop = value)
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private property`, () => {
expect(id).toBe("client2");
expect(change).toEqual({ path: "/prop1/0/prop", op: "replace", value, oldValue });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Remove private object from public array", () => {
const obj = { prop: "test value", pprop: "test2", ext: "ext" };
tester
.onAction(() => state.prop1.pop())
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get remove change for array property`, () => {
expect(change).toMatchObject({ path: "/prop1/0", op: "remove", oldValue: c2(id, obj) });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Set private property to array", () => {
tester
.onAction(() => state.pprop1 = [])
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for array property`, () => {
expect(id).toBe("client2");
expect(change).toEqual({ path: "/pprop1", op: "replace", value: [] });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Add to private array", () => {
const value = "test value";
tester
.onAction(() => state.pprop1.push(value))
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for array property`, () => {
expect(id).toBe("client2");
expect(change).toEqual({ path: "/pprop1/0", op: "add", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Remove from private array", () => {
const oldValue = state.pprop1[0];
tester
.onAction(() => state.pprop1.pop())
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get remove change for array property`, () => {
expect(id).toBe("client2");
expect(change).toEqual({ path: "/pprop1/0", op: "remove", oldValue });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Set property to public map", () => {
tester
.onAction(() => state.prop1 = new Map())
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for array property`, () => {
expect(change).toEqual({ path: "/prop1", op: "replace", value: {}, oldValue: [] });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Add to public map", () => {
const key = "12345";
const value = "test value";
tester
.onAction(() => state.prop1.set(key, value))
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for map property`, () => {
expect(change).toEqual({ path: "/prop1/" + key, op: "add", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Replace item in public map", () => {
const key = "12345";
const oldValue = state.prop1.get(key);
const value = "test value 2";
tester
.onAction(() => state.prop1.set(key, value))
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for map property`, () => {
expect(change).toEqual({ path: "/prop1/" + key, op: "replace", value, oldValue });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Add private object to public map", () => {
const key = "private";
const obj = { prop: "test", pprop: "test2", ext: "ext" };
const value = new Private(Object.assign(Object.assign({}, obj), { name: "prop1/private" }));
index_1.Mosx.setParent(value, state);
tester
.onAction(() => state.prop1.set(key, value))
.trigger(2, (id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for map property`, () => {
expect(change).toMatchObject({ path: "/prop1/" + key, op: "add", value: c2(id, obj) });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Set private property to map", () => {
tester
.onAction(() => state.pprop1 = new Map())
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for array property`, () => {
expect(change).toEqual({ path: "/pprop1", op: "replace", value: {}, oldValue: [] });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Add to private map", () => {
const key = "12345";
const value = "test value";
tester
.onAction(() => state.pprop1.set(key, value))
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for map property`, () => {
expect(change).toEqual({ path: "/pprop1/" + key, op: "add", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Replace observable property to trigger computed property", () => {
const value = "test value";
tester
.onAction(() => state.mobx = value)
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for computed property`, () => {
expect(id).toBe("client2");
expect(change).toEqual({ path: "/pcomp", op: "replace", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
const view1 = index_1.Mosx.getSnapshot(state, "1");
describe("Snapshot of state for client1", () => {
test(`should not have private/observable properties`, () => {
expect(view1).toMatchObject({ comp: "test value", prop1: { 12345: "test value 2" } });
expect(view1).not.toHaveProperty("pprop");
expect(view1).not.toHaveProperty("pcomp");
expect(view1).not.toHaveProperty("mobx");
});
test(`should have undefined value for private object`, () => {
expect(view1.prop1.private).toBe(undefined);
});
});
const view2 = index_1.Mosx.getSnapshot(state, "123");
describe("Snapshot of state for client2", () => {
test(`should have private properties and not have observable properties`, () => {
expect(view2).toMatchObject({ comp: "test value", prop1: { 12345: "test value 2" } });
expect(view2).toHaveProperty("pprop");
expect(view2).toHaveProperty("pcomp");
expect(view2).not.toHaveProperty("mobx");
});
test(`should have value for private object`, () => {
expect(view2.prop1.private).toMatchObject({ prop: "test", pprop: "test2", ext: "ext" });
});
});
describe("Add tag of client1 to state", () => {
tester
.onAction(() => index_1.Mosx.addTag(state, "1"))
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for private propery`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/pprop", op: "add", value: view2.pprop });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for private computed property`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/pcomp", op: "add", value: view2.pcomp });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for private property`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/pprop1", op: "add", value: view2.pprop1 });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private object`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/prop", op: "replace", value: view2.prop });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private object of public map propery`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/prop1/private", op: "replace", value: view2.prop1.private });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Remove tag of client1 to state", () => {
tester
.onAction(() => index_1.Mosx.deleteTag(state, "1"))
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for private propery`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/pprop", op: "remove", oldValue: view2.pprop });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for private computed property`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/pcomp", op: "remove", oldValue: view2.pcomp });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get add change for private property`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/pprop1", op: "remove", oldValue: view2.pprop1 });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private object`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/prop", op: "replace", oldValue: view2.prop });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private object of public map propery`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/prop1/private", op: "replace", oldValue: view2.prop1.private });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
})
.run(unhandledTest);
});
// // TODO: add/remove tag for private object
const p = state.prop1.get("private");
describe("Add tag of client1 to private object in map", () => {
tester
.onAction(() => index_1.Mosx.addTag(p, "1"))
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for private object of public map propery`, () => {
expect(id).toBe("client1");
expect(change).toMatchObject({ path: "/prop1/private", op: "replace", value: view2.prop1.private });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
describe("Stop tracking change", () => {
const value = "test";
tester.disposers.client1();
tester
.onAction(() => state.prop = value)
.trigger((id, _a) => {
var { encoded } = _a, change = __rest(_a, ["encoded"]);
test(`${id} should get replace change for property`, () => {
expect(change).toMatchObject({ path: "/prop", op: "replace", value });
expect(change).toEqual(decoder[id].decodePatch(encoded));
});
}).run(unhandledTest);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9zeC5zY2hlbWEudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3RzL21vc3guc2NoZW1hLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFxQztBQUVyQyxvQ0FBd0U7QUFDeEUsMENBQTBDO0FBRzFDLElBQU0sTUFBTSxHQUFaLE1BQU0sTUFBTTtJQVNWLFlBQVksU0FBYyxFQUFFO1FBRnJCLFNBQUksR0FBVyxFQUFFLENBQUE7UUFHdEIsTUFBTSxJQUFJLEdBQUcsSUFBVyxDQUFBO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBWFksSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQztJQUN4QixJQUFJLEtBQUssS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDO0NBV3RELENBQUE7QUFkSztJQUFILFVBQUU7b0NBQWlCO0FBQ1I7SUFBWCxVQUFFLENBQUMsT0FBTztxQ0FBa0I7QUFDaEI7SUFBWixVQUFFLENBQUMsUUFBUTtrQ0FBaUM7QUFDeEI7SUFBcEIsVUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPO21DQUFpQztBQUN0QztJQUFkLFVBQUUsQ0FBQyxVQUFVO29DQUFpQjtBQUwzQixNQUFNO0lBRFgsVUFBRSxDQUFDLE1BQU07R0FDSixNQUFNLENBZVg7QUFHRCxJQUFNLE9BQU8sR0FBYixNQUFNLE9BQVEsU0FBUSxNQUFNO0NBRTNCLENBQUE7QUFESztJQUFILFVBQUU7b0NBQWdCO0FBRGYsT0FBTztJQURaLFVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztHQUNaLE9BQU8s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