@praxisjs/decorators 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/__tests__/component.test.d.ts +2 -0
  3. package/dist/__tests__/component.test.d.ts.map +1 -0
  4. package/dist/__tests__/component.test.js +137 -0
  5. package/dist/__tests__/component.test.js.map +1 -0
  6. package/dist/__tests__/events.test.d.ts +2 -0
  7. package/dist/__tests__/events.test.d.ts.map +1 -0
  8. package/dist/__tests__/events.test.js +190 -0
  9. package/dist/__tests__/events.test.js.map +1 -0
  10. package/dist/__tests__/functions.test.d.ts +2 -0
  11. package/dist/__tests__/functions.test.d.ts.map +1 -0
  12. package/dist/__tests__/functions.test.js +427 -0
  13. package/dist/__tests__/functions.test.js.map +1 -0
  14. package/dist/__tests__/lazy.test.d.ts +2 -0
  15. package/dist/__tests__/lazy.test.d.ts.map +1 -0
  16. package/dist/__tests__/lazy.test.js +165 -0
  17. package/dist/__tests__/lazy.test.js.map +1 -0
  18. package/dist/__tests__/memo.test.d.ts +2 -0
  19. package/dist/__tests__/memo.test.d.ts.map +1 -0
  20. package/dist/__tests__/memo.test.js +79 -0
  21. package/dist/__tests__/memo.test.js.map +1 -0
  22. package/dist/__tests__/properties-browser.test.d.ts +2 -0
  23. package/dist/__tests__/properties-browser.test.d.ts.map +1 -0
  24. package/dist/__tests__/properties-browser.test.js +178 -0
  25. package/dist/__tests__/properties-browser.test.js.map +1 -0
  26. package/dist/__tests__/properties.test.d.ts +2 -0
  27. package/dist/__tests__/properties.test.d.ts.map +1 -0
  28. package/dist/__tests__/properties.test.js +571 -0
  29. package/dist/__tests__/properties.test.js.map +1 -0
  30. package/dist/__tests__/slot.test.d.ts +2 -0
  31. package/dist/__tests__/slot.test.d.ts.map +1 -0
  32. package/dist/__tests__/slot.test.js +115 -0
  33. package/dist/__tests__/slot.test.js.map +1 -0
  34. package/dist/__tests__/virtual.test.d.ts +2 -0
  35. package/dist/__tests__/virtual.test.d.ts.map +1 -0
  36. package/dist/__tests__/virtual.test.js +201 -0
  37. package/dist/__tests__/virtual.test.js.map +1 -0
  38. package/dist/component/lazy.d.ts +1 -1
  39. package/dist/component/lazy.d.ts.map +1 -1
  40. package/dist/component/lazy.js +4 -1
  41. package/dist/component/lazy.js.map +1 -1
  42. package/dist/component/virtual.d.ts +1 -1
  43. package/dist/component/virtual.d.ts.map +1 -1
  44. package/dist/functions/watch.d.ts.map +1 -1
  45. package/dist/functions/watch.js +10 -2
  46. package/dist/functions/watch.js.map +1 -1
  47. package/dist/properties/history.d.ts.map +1 -1
  48. package/dist/properties/history.js +4 -8
  49. package/dist/properties/history.js.map +1 -1
  50. package/package.json +2 -2
  51. package/src/__tests__/component.test.ts +156 -0
  52. package/src/__tests__/events.test.ts +236 -0
  53. package/src/__tests__/functions.test.ts +549 -0
  54. package/src/__tests__/lazy.test.ts +220 -0
  55. package/src/__tests__/memo.test.ts +90 -0
  56. package/src/__tests__/properties-browser.test.ts +234 -0
  57. package/src/__tests__/properties.test.ts +725 -0
  58. package/src/__tests__/slot.test.ts +141 -0
  59. package/src/__tests__/virtual.test.ts +241 -0
  60. package/src/component/lazy.ts +4 -2
  61. package/src/component/virtual.tsx +1 -1
  62. package/src/functions/watch.ts +11 -2
  63. package/src/properties/history.ts +4 -8
@@ -0,0 +1,79 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { signal } from "@praxisjs/core/internal";
3
+ import { Memo } from "../functions/memo";
4
+ function mockCtx(name) {
5
+ return { name, kind: "method" };
6
+ }
7
+ describe("Memo", () => {
8
+ it("returns the computed value", () => {
9
+ const fn = vi.fn((x) => x * 2);
10
+ const wrapped = Memo()(fn, mockCtx("double"));
11
+ const obj = {};
12
+ expect(wrapped.call(obj, 5)).toBe(10);
13
+ });
14
+ it("caches result for same args — calls original only once", () => {
15
+ const fn = vi.fn((x) => x + 1);
16
+ const wrapped = Memo()(fn, mockCtx("inc"));
17
+ const obj = {};
18
+ wrapped.call(obj, 3);
19
+ wrapped.call(obj, 3);
20
+ wrapped.call(obj, 3);
21
+ expect(fn).toHaveBeenCalledTimes(1);
22
+ });
23
+ it("computes separately for different args", () => {
24
+ const fn = vi.fn((x) => x * 10);
25
+ const wrapped = Memo()(fn, mockCtx("mul"));
26
+ const obj = {};
27
+ expect(wrapped.call(obj, 2)).toBe(20);
28
+ expect(wrapped.call(obj, 3)).toBe(30);
29
+ expect(fn).toHaveBeenCalledTimes(2);
30
+ });
31
+ it("is per-instance — different instances have separate caches", () => {
32
+ const fn = vi.fn(() => Math.random());
33
+ const wrapped = Memo()(fn, mockCtx("rand"));
34
+ const a = {};
35
+ const b = {};
36
+ const v1 = wrapped.call(a);
37
+ const v2 = wrapped.call(b);
38
+ expect(fn).toHaveBeenCalledTimes(2);
39
+ expect(v1).not.toBe(v2); // different random values per instance
40
+ });
41
+ it("serializes no-args calls with __no_args__ key", () => {
42
+ const fn = vi.fn(() => 42);
43
+ const wrapped = Memo()(fn, mockCtx("noop"));
44
+ const obj = {};
45
+ wrapped.call(obj);
46
+ wrapped.call(obj);
47
+ expect(fn).toHaveBeenCalledTimes(1);
48
+ });
49
+ it("serializes object args via JSON.stringify", () => {
50
+ const fn = vi.fn((o) => JSON.stringify(o));
51
+ const wrapped = Memo()(fn, mockCtx("obj"));
52
+ const obj = {};
53
+ wrapped.call(obj, { a: 1 });
54
+ wrapped.call(obj, { a: 1 }); // same key
55
+ expect(fn).toHaveBeenCalledTimes(1);
56
+ });
57
+ it("re-evaluates when a reactive signal read inside the method changes", () => {
58
+ const s = signal(1);
59
+ const fn = vi.fn(() => s() * 10);
60
+ const wrapped = Memo()(fn, mockCtx("reactive"));
61
+ const obj = {};
62
+ expect(wrapped.call(obj)).toBe(10);
63
+ expect(fn).toHaveBeenCalledTimes(1);
64
+ s.set(5);
65
+ // The computed tracks s() — next read triggers recomputation
66
+ expect(wrapped.call(obj)).toBe(50);
67
+ expect(fn).toHaveBeenCalledTimes(2);
68
+ });
69
+ it("serializes symbol args via toString()", () => {
70
+ const fn = vi.fn((s) => String(s));
71
+ const wrapped = Memo()(fn, mockCtx("sym"));
72
+ const obj = {};
73
+ const sym = Symbol("test");
74
+ wrapped.call(obj, sym);
75
+ wrapped.call(obj, sym);
76
+ expect(fn).toHaveBeenCalledTimes(1);
77
+ });
78
+ });
79
+ //# sourceMappingURL=memo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.test.js","sourceRoot":"","sources":["../../src/__tests__/memo.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=properties-browser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-browser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/properties-browser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,178 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { StatefulComponent } from "@praxisjs/core";
4
+ import { Persisted } from "../properties/persisted";
5
+ import { Slot, initSlots, getSlot } from "../properties/slot";
6
+ beforeEach(() => {
7
+ localStorage.clear();
8
+ });
9
+ // Helper: creates a ClassFieldDecoratorContext mock
10
+ function fieldCtx(name) {
11
+ const initializers = [];
12
+ return {
13
+ ctx: {
14
+ name,
15
+ kind: "field",
16
+ addInitializer(fn) {
17
+ initializers.push(fn);
18
+ },
19
+ },
20
+ run(instance) {
21
+ initializers.forEach((fn) => { fn.call(instance); });
22
+ },
23
+ };
24
+ }
25
+ // Minimal concrete component
26
+ class TestComponent extends StatefulComponent {
27
+ render() { return null; }
28
+ }
29
+ // ── Persisted ─────────────────────────────────────────────────────────────────
30
+ describe("Persisted decorator", () => {
31
+ it("reads back the initial value when nothing is stored", () => {
32
+ const { ctx, run } = fieldCtx("theme");
33
+ Persisted("theme")(undefined, ctx);
34
+ const instance = new TestComponent();
35
+ instance.theme = "light";
36
+ run(instance);
37
+ expect(instance.theme).toBe("light");
38
+ });
39
+ it("persists set value to localStorage", () => {
40
+ const { ctx, run } = fieldCtx("lang");
41
+ Persisted("lang")(undefined, ctx);
42
+ const instance = new TestComponent();
43
+ instance.lang = "en";
44
+ run(instance);
45
+ instance.lang = "pt";
46
+ expect(localStorage.getItem("lang")).toBe('"pt"');
47
+ expect(instance.lang).toBe("pt");
48
+ });
49
+ it("reads existing localStorage value over the initialValue", () => {
50
+ localStorage.setItem("color", '"red"');
51
+ const { ctx, run } = fieldCtx("color");
52
+ Persisted("color")(undefined, ctx);
53
+ const instance = new TestComponent();
54
+ instance.color = "blue";
55
+ run(instance);
56
+ expect(instance.color).toBe("red");
57
+ });
58
+ it("uses the property name as storage key when no explicit key given", () => {
59
+ const { ctx, run } = fieldCtx("count");
60
+ Persisted()(undefined, ctx);
61
+ const instance = new TestComponent();
62
+ instance.count = 0;
63
+ run(instance);
64
+ instance.count = 7;
65
+ expect(localStorage.getItem("count")).toBe("7");
66
+ });
67
+ it("returns separate values per instance", () => {
68
+ const { ctx: ctxA, run: runA } = fieldCtx("val");
69
+ Persisted("valA")(undefined, ctxA);
70
+ const { ctx: ctxB, run: runB } = fieldCtx("val");
71
+ Persisted("valB")(undefined, ctxB);
72
+ const a = new TestComponent();
73
+ a.val = 1;
74
+ runA(a);
75
+ const b = new TestComponent();
76
+ b.val = 2;
77
+ runB(b);
78
+ a.val = 10;
79
+ b.val = 20;
80
+ expect(a.val).toBe(10);
81
+ expect(b.val).toBe(20);
82
+ });
83
+ });
84
+ // ── Slot ──────────────────────────────────────────────────────────────────────
85
+ describe("Slot decorator", () => {
86
+ it("returns an empty array before initSlots is called", () => {
87
+ const { ctx, run } = fieldCtx("default");
88
+ Slot()(undefined, ctx);
89
+ const instance = new TestComponent();
90
+ run(instance);
91
+ expect(instance.default).toEqual([]);
92
+ });
93
+ it("returns default slot children after initSlots", () => {
94
+ const { ctx, run } = fieldCtx("default");
95
+ Slot()(undefined, ctx);
96
+ const instance = new TestComponent();
97
+ run(instance);
98
+ const el = document.createElement("span");
99
+ initSlots(instance, [el]);
100
+ expect(instance.default).toContain(el);
101
+ });
102
+ it("resolves named slot children", () => {
103
+ const { ctx, run } = fieldCtx("header");
104
+ Slot("header")(undefined, ctx);
105
+ const instance = new TestComponent();
106
+ run(instance);
107
+ const el = document.createElement("div");
108
+ el.setAttribute("slot", "header");
109
+ initSlots(instance, [el]);
110
+ const result = instance.header;
111
+ expect(result).toHaveLength(1);
112
+ expect(result[0]).toBe(el);
113
+ });
114
+ it("named slot element has slot attribute removed", () => {
115
+ const { ctx, run } = fieldCtx("footer");
116
+ Slot("footer")(undefined, ctx);
117
+ const instance = new TestComponent();
118
+ run(instance);
119
+ const el = document.createElement("div");
120
+ el.setAttribute("slot", "footer");
121
+ initSlots(instance, [el]);
122
+ expect(el.getAttribute("slot")).toBeNull();
123
+ });
124
+ it("warns when attempting to set a slot directly (dev mode)", () => {
125
+ const originalEnv = process.env.NODE_ENV;
126
+ process.env.NODE_ENV = "development";
127
+ const { ctx, run } = fieldCtx("content");
128
+ Slot("content")(undefined, ctx);
129
+ const instance = new TestComponent();
130
+ run(instance);
131
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
132
+ instance.content = ["something"];
133
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("[Slot]"));
134
+ warn.mockRestore();
135
+ process.env.NODE_ENV = originalEnv;
136
+ });
137
+ it("uses property name as slot name when no name given and prop is not 'default'", () => {
138
+ const { ctx, run } = fieldCtx("sidebar");
139
+ Slot()(undefined, ctx);
140
+ const instance = new TestComponent();
141
+ run(instance);
142
+ const el = document.createElement("aside");
143
+ el.setAttribute("slot", "sidebar");
144
+ initSlots(instance, [el]);
145
+ const result = instance.sidebar;
146
+ expect(result).toHaveLength(1);
147
+ });
148
+ });
149
+ // ── initSlots / getSlot helpers ───────────────────────────────────────────────
150
+ describe("initSlots / getSlot", () => {
151
+ it("splits children into named and default slots", () => {
152
+ const named = document.createElement("div");
153
+ named.setAttribute("slot", "header");
154
+ const plain = document.createElement("p");
155
+ const instance = {};
156
+ initSlots(instance, [named, plain]);
157
+ expect(getSlot(instance, "header")).toContain(named);
158
+ expect(getSlot(instance, "default")).toContain(plain);
159
+ });
160
+ it("handles null children gracefully", () => {
161
+ const instance = {};
162
+ initSlots(instance, null);
163
+ expect(getSlot(instance, "default")).toEqual([]);
164
+ });
165
+ it("flattens nested arrays", () => {
166
+ const a = document.createElement("span");
167
+ const b = document.createElement("span");
168
+ const instance = {};
169
+ initSlots(instance, [[a, b]]);
170
+ expect(getSlot(instance, "default")).toHaveLength(2);
171
+ });
172
+ it("returns empty array for unknown slot", () => {
173
+ const instance = {};
174
+ initSlots(instance, []);
175
+ expect(getSlot(instance, "nonexistent")).toEqual([]);
176
+ });
177
+ });
178
+ //# sourceMappingURL=properties-browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-browser.test.js","sourceRoot":"","sources":["../../src/__tests__/properties-browser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=properties.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/properties.test.ts"],"names":[],"mappings":""}