@praxisjs/decorators 1.6.1 → 2.0.0

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 (270) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/component/component.d.ts +1 -1
  3. package/dist/component/component.d.ts.map +1 -1
  4. package/dist/component/component.js +8 -15
  5. package/dist/component/component.js.map +1 -1
  6. package/dist/component/lazy.d.ts +1 -1
  7. package/dist/component/lazy.d.ts.map +1 -1
  8. package/dist/component/lazy.js +44 -36
  9. package/dist/component/lazy.js.map +1 -1
  10. package/dist/create-class-decorator.d.ts +27 -5
  11. package/dist/create-class-decorator.d.ts.map +1 -1
  12. package/dist/create-class-decorator.js +53 -18
  13. package/dist/create-class-decorator.js.map +1 -1
  14. package/dist/create-field-decorator.d.ts +42 -3
  15. package/dist/create-field-decorator.d.ts.map +1 -1
  16. package/dist/create-field-decorator.js +63 -27
  17. package/dist/create-field-decorator.js.map +1 -1
  18. package/dist/create-getter-decorator.d.ts +81 -16
  19. package/dist/create-getter-decorator.d.ts.map +1 -1
  20. package/dist/create-getter-decorator.js +127 -15
  21. package/dist/create-getter-decorator.js.map +1 -1
  22. package/dist/create-lifecycle-method-decorator.d.ts +21 -3
  23. package/dist/create-lifecycle-method-decorator.d.ts.map +1 -1
  24. package/dist/create-lifecycle-method-decorator.js +25 -18
  25. package/dist/create-lifecycle-method-decorator.js.map +1 -1
  26. package/dist/create-method-decorator.d.ts +43 -3
  27. package/dist/create-method-decorator.d.ts.map +1 -1
  28. package/dist/create-method-decorator.js +49 -8
  29. package/dist/create-method-decorator.js.map +1 -1
  30. package/dist/events/command.d.ts +2 -1
  31. package/dist/events/command.d.ts.map +1 -1
  32. package/dist/events/command.js +10 -8
  33. package/dist/events/command.js.map +1 -1
  34. package/dist/events/emit.d.ts +2 -2
  35. package/dist/events/emit.d.ts.map +1 -1
  36. package/dist/events/emit.js +18 -24
  37. package/dist/events/emit.js.map +1 -1
  38. package/dist/events/on-command.d.ts +2 -1
  39. package/dist/events/on-command.d.ts.map +1 -1
  40. package/dist/events/on-command.js +12 -14
  41. package/dist/events/on-command.js.map +1 -1
  42. package/dist/field.d.ts +51 -0
  43. package/dist/field.d.ts.map +1 -0
  44. package/dist/field.js +82 -0
  45. package/dist/field.js.map +1 -0
  46. package/dist/functions/bind.d.ts +2 -1
  47. package/dist/functions/bind.d.ts.map +1 -1
  48. package/dist/functions/bind.js +4 -4
  49. package/dist/functions/bind.js.map +1 -1
  50. package/dist/functions/debounce.d.ts +2 -2
  51. package/dist/functions/debounce.d.ts.map +1 -1
  52. package/dist/functions/debounce.js +25 -23
  53. package/dist/functions/debounce.js.map +1 -1
  54. package/dist/functions/index.d.ts +1 -1
  55. package/dist/functions/index.d.ts.map +1 -1
  56. package/dist/functions/index.js.map +1 -1
  57. package/dist/functions/log.d.ts +2 -1
  58. package/dist/functions/log.d.ts.map +1 -1
  59. package/dist/functions/log.js +38 -40
  60. package/dist/functions/log.js.map +1 -1
  61. package/dist/functions/memo.d.ts +9 -1
  62. package/dist/functions/memo.d.ts.map +1 -1
  63. package/dist/functions/memo.js +44 -30
  64. package/dist/functions/memo.js.map +1 -1
  65. package/dist/functions/once.d.ts +2 -1
  66. package/dist/functions/once.d.ts.map +1 -1
  67. package/dist/functions/once.js +10 -14
  68. package/dist/functions/once.js.map +1 -1
  69. package/dist/functions/retry.d.ts +2 -1
  70. package/dist/functions/retry.d.ts.map +1 -1
  71. package/dist/functions/retry.js +21 -23
  72. package/dist/functions/retry.js.map +1 -1
  73. package/dist/functions/throttle.d.ts +2 -1
  74. package/dist/functions/throttle.d.ts.map +1 -1
  75. package/dist/functions/throttle.js +12 -14
  76. package/dist/functions/throttle.js.map +1 -1
  77. package/dist/functions/until.d.ts +2 -1
  78. package/dist/functions/until.d.ts.map +1 -1
  79. package/dist/functions/until.js +13 -14
  80. package/dist/functions/until.js.map +1 -1
  81. package/dist/functions/watch.d.ts +1 -1
  82. package/dist/functions/watch.d.ts.map +1 -1
  83. package/dist/functions/watch.js +36 -34
  84. package/dist/functions/watch.js.map +1 -1
  85. package/dist/functions/when.d.ts +1 -1
  86. package/dist/functions/when.d.ts.map +1 -1
  87. package/dist/functions/when.js +19 -21
  88. package/dist/functions/when.js.map +1 -1
  89. package/dist/index.d.ts +6 -6
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +2 -2
  92. package/dist/index.js.map +1 -1
  93. package/dist/lifecycle.d.ts +24 -0
  94. package/dist/lifecycle.d.ts.map +1 -0
  95. package/dist/lifecycle.js +55 -0
  96. package/dist/lifecycle.js.map +1 -0
  97. package/dist/properties/compose.d.ts +3 -2
  98. package/dist/properties/compose.d.ts.map +1 -1
  99. package/dist/properties/compose.js +33 -19
  100. package/dist/properties/compose.js.map +1 -1
  101. package/dist/properties/computed.d.ts +12 -10
  102. package/dist/properties/computed.d.ts.map +1 -1
  103. package/dist/properties/computed.js +26 -21
  104. package/dist/properties/computed.js.map +1 -1
  105. package/dist/properties/deep-state.d.ts +2 -1
  106. package/dist/properties/deep-state.d.ts.map +1 -1
  107. package/dist/properties/deep-state.js +66 -49
  108. package/dist/properties/deep-state.js.map +1 -1
  109. package/dist/properties/function-prop.d.ts +2 -1
  110. package/dist/properties/function-prop.d.ts.map +1 -1
  111. package/dist/properties/function-prop.js +20 -22
  112. package/dist/properties/function-prop.js.map +1 -1
  113. package/dist/properties/history.d.ts +2 -2
  114. package/dist/properties/history.d.ts.map +1 -1
  115. package/dist/properties/history.js +34 -31
  116. package/dist/properties/history.js.map +1 -1
  117. package/dist/properties/index.d.ts +1 -0
  118. package/dist/properties/index.d.ts.map +1 -1
  119. package/dist/properties/index.js +1 -0
  120. package/dist/properties/index.js.map +1 -1
  121. package/dist/properties/persisted.d.ts +2 -1
  122. package/dist/properties/persisted.d.ts.map +1 -1
  123. package/dist/properties/persisted.js +30 -19
  124. package/dist/properties/persisted.js.map +1 -1
  125. package/dist/properties/prop.d.ts +2 -1
  126. package/dist/properties/prop.d.ts.map +1 -1
  127. package/dist/properties/prop.js +26 -22
  128. package/dist/properties/prop.js.map +1 -1
  129. package/dist/properties/ref.d.ts +2 -1
  130. package/dist/properties/ref.d.ts.map +1 -1
  131. package/dist/properties/ref.js +11 -8
  132. package/dist/properties/ref.js.map +1 -1
  133. package/dist/properties/resource.d.ts.map +1 -1
  134. package/dist/properties/resource.js +21 -16
  135. package/dist/properties/resource.js.map +1 -1
  136. package/dist/properties/selector.d.ts +12 -0
  137. package/dist/properties/selector.d.ts.map +1 -0
  138. package/dist/properties/selector.js +25 -0
  139. package/dist/properties/selector.js.map +1 -0
  140. package/dist/properties/slot.d.ts +2 -1
  141. package/dist/properties/slot.d.ts.map +1 -1
  142. package/dist/properties/slot.js +22 -20
  143. package/dist/properties/slot.js.map +1 -1
  144. package/dist/properties/state.d.ts.map +1 -1
  145. package/dist/properties/state.js +27 -16
  146. package/dist/properties/state.js.map +1 -1
  147. package/dist/properties/synced.d.ts +2 -1
  148. package/dist/properties/synced.d.ts.map +1 -1
  149. package/dist/properties/synced.js +27 -19
  150. package/dist/properties/synced.js.map +1 -1
  151. package/dist/shared-method.d.ts +14 -0
  152. package/dist/shared-method.d.ts.map +1 -0
  153. package/dist/shared-method.js +87 -0
  154. package/dist/shared-method.js.map +1 -0
  155. package/package.json +14 -5
  156. package/src/component/component.ts +8 -27
  157. package/src/component/lazy.ts +51 -41
  158. package/src/create-class-decorator.ts +90 -31
  159. package/src/create-field-decorator.ts +120 -43
  160. package/src/create-getter-decorator.ts +263 -66
  161. package/src/create-lifecycle-method-decorator.ts +50 -28
  162. package/src/create-method-decorator.ts +119 -13
  163. package/src/events/command.ts +11 -9
  164. package/src/events/emit.ts +16 -22
  165. package/src/events/on-command.ts +17 -18
  166. package/src/field.ts +116 -0
  167. package/src/functions/bind.ts +4 -4
  168. package/src/functions/debounce.ts +25 -23
  169. package/src/functions/index.ts +1 -1
  170. package/src/functions/log.ts +44 -46
  171. package/src/functions/memo.ts +54 -28
  172. package/src/functions/once.ts +10 -13
  173. package/src/functions/retry.ts +19 -21
  174. package/src/functions/throttle.ts +12 -13
  175. package/src/functions/until.ts +14 -14
  176. package/src/functions/watch.ts +37 -36
  177. package/src/functions/when.ts +18 -20
  178. package/src/index.ts +13 -5
  179. package/src/lifecycle.ts +74 -0
  180. package/src/properties/compose.ts +33 -20
  181. package/src/properties/computed.ts +35 -45
  182. package/src/properties/deep-state.ts +68 -53
  183. package/src/properties/function-prop.ts +25 -27
  184. package/src/properties/history.ts +34 -33
  185. package/src/properties/index.ts +1 -0
  186. package/src/properties/persisted.ts +41 -27
  187. package/src/properties/prop.ts +30 -22
  188. package/src/properties/ref.ts +12 -10
  189. package/src/properties/resource.ts +22 -17
  190. package/src/properties/selector.ts +45 -0
  191. package/src/properties/slot.ts +28 -22
  192. package/src/properties/state.ts +32 -16
  193. package/src/properties/synced.ts +31 -19
  194. package/src/shared-method.ts +101 -0
  195. package/dist/__tests__/component.test.d.ts +0 -2
  196. package/dist/__tests__/component.test.d.ts.map +0 -1
  197. package/dist/__tests__/component.test.js +0 -147
  198. package/dist/__tests__/component.test.js.map +0 -1
  199. package/dist/__tests__/compose.test.d.ts +0 -2
  200. package/dist/__tests__/compose.test.d.ts.map +0 -1
  201. package/dist/__tests__/compose.test.js +0 -164
  202. package/dist/__tests__/compose.test.js.map +0 -1
  203. package/dist/__tests__/deep-state.test.d.ts +0 -2
  204. package/dist/__tests__/deep-state.test.d.ts.map +0 -1
  205. package/dist/__tests__/deep-state.test.js +0 -150
  206. package/dist/__tests__/deep-state.test.js.map +0 -1
  207. package/dist/__tests__/events.test.d.ts +0 -2
  208. package/dist/__tests__/events.test.d.ts.map +0 -1
  209. package/dist/__tests__/events.test.js +0 -295
  210. package/dist/__tests__/events.test.js.map +0 -1
  211. package/dist/__tests__/functions.test.d.ts +0 -2
  212. package/dist/__tests__/functions.test.d.ts.map +0 -1
  213. package/dist/__tests__/functions.test.js +0 -618
  214. package/dist/__tests__/functions.test.js.map +0 -1
  215. package/dist/__tests__/lazy.test.d.ts +0 -2
  216. package/dist/__tests__/lazy.test.d.ts.map +0 -1
  217. package/dist/__tests__/lazy.test.js +0 -227
  218. package/dist/__tests__/lazy.test.js.map +0 -1
  219. package/dist/__tests__/memo.test.d.ts +0 -2
  220. package/dist/__tests__/memo.test.d.ts.map +0 -1
  221. package/dist/__tests__/memo.test.js +0 -168
  222. package/dist/__tests__/memo.test.js.map +0 -1
  223. package/dist/__tests__/properties-browser.test.d.ts +0 -2
  224. package/dist/__tests__/properties-browser.test.d.ts.map +0 -1
  225. package/dist/__tests__/properties-browser.test.js +0 -178
  226. package/dist/__tests__/properties-browser.test.js.map +0 -1
  227. package/dist/__tests__/properties.test.d.ts +0 -2
  228. package/dist/__tests__/properties.test.d.ts.map +0 -1
  229. package/dist/__tests__/properties.test.js +0 -1226
  230. package/dist/__tests__/properties.test.js.map +0 -1
  231. package/dist/__tests__/ref.test.d.ts +0 -2
  232. package/dist/__tests__/ref.test.d.ts.map +0 -1
  233. package/dist/__tests__/ref.test.js +0 -106
  234. package/dist/__tests__/ref.test.js.map +0 -1
  235. package/dist/__tests__/resource.test.d.ts +0 -2
  236. package/dist/__tests__/resource.test.d.ts.map +0 -1
  237. package/dist/__tests__/resource.test.js +0 -217
  238. package/dist/__tests__/resource.test.js.map +0 -1
  239. package/dist/__tests__/slot.test.d.ts +0 -2
  240. package/dist/__tests__/slot.test.d.ts.map +0 -1
  241. package/dist/__tests__/slot.test.js +0 -147
  242. package/dist/__tests__/slot.test.js.map +0 -1
  243. package/dist/__tests__/synced.test.d.ts +0 -2
  244. package/dist/__tests__/synced.test.d.ts.map +0 -1
  245. package/dist/__tests__/synced.test.js +0 -161
  246. package/dist/__tests__/synced.test.js.map +0 -1
  247. package/dist/__tests__/until.test.d.ts +0 -2
  248. package/dist/__tests__/until.test.d.ts.map +0 -1
  249. package/dist/__tests__/until.test.js +0 -88
  250. package/dist/__tests__/until.test.js.map +0 -1
  251. package/dist/create-accessor-decorator.d.ts +0 -14
  252. package/dist/create-accessor-decorator.d.ts.map +0 -1
  253. package/dist/create-accessor-decorator.js +0 -27
  254. package/dist/create-accessor-decorator.js.map +0 -1
  255. package/src/__tests__/component.test.ts +0 -167
  256. package/src/__tests__/compose.test.ts +0 -202
  257. package/src/__tests__/deep-state.test.ts +0 -185
  258. package/src/__tests__/events.test.ts +0 -366
  259. package/src/__tests__/functions.test.ts +0 -803
  260. package/src/__tests__/lazy.test.ts +0 -296
  261. package/src/__tests__/memo.test.ts +0 -208
  262. package/src/__tests__/properties-browser.test.ts +0 -234
  263. package/src/__tests__/properties.test.ts +0 -1526
  264. package/src/__tests__/ref.test.ts +0 -131
  265. package/src/__tests__/resource.test.ts +0 -246
  266. package/src/__tests__/slot.test.ts +0 -179
  267. package/src/__tests__/synced.test.ts +0 -193
  268. package/src/__tests__/until.test.ts +0 -113
  269. package/src/create-accessor-decorator.ts +0 -45
  270. package/tsconfig.json +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"file":"slot.test.js","sourceRoot":"","sources":["../../src/__tests__/slot.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=synced.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"synced.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/synced.test.ts"],"names":[],"mappings":""}
@@ -1,161 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect, vi, beforeEach } from "vitest";
3
- import { StatefulComponent } from "@praxisjs/core";
4
- import { effect } from "@praxisjs/core/internal";
5
- import { Synced } from "../properties/synced";
6
- // BroadcastChannel mock (same as core test)
7
- class MockBroadcastChannel {
8
- static instances = [];
9
- static byChannel = new Map();
10
- onmessage = null;
11
- name;
12
- closed = false;
13
- constructor(name) {
14
- this.name = name;
15
- MockBroadcastChannel.instances.push(this);
16
- if (!MockBroadcastChannel.byChannel.has(name)) {
17
- MockBroadcastChannel.byChannel.set(name, []);
18
- }
19
- MockBroadcastChannel.byChannel.get(name).push(this);
20
- }
21
- postMessage(data) {
22
- MockBroadcastChannel.byChannel.get(this.name)?.forEach((ch) => {
23
- if (ch !== this && ch.onmessage) {
24
- ch.onmessage(new MessageEvent("message", { data }));
25
- }
26
- });
27
- }
28
- close() {
29
- this.closed = true;
30
- const list = MockBroadcastChannel.byChannel.get(this.name);
31
- if (list) {
32
- const idx = list.indexOf(this);
33
- if (idx !== -1)
34
- list.splice(idx, 1);
35
- }
36
- MockBroadcastChannel.instances.splice(MockBroadcastChannel.instances.indexOf(this), 1);
37
- }
38
- }
39
- beforeEach(() => {
40
- MockBroadcastChannel.instances = [];
41
- MockBroadcastChannel.byChannel = new Map();
42
- vi.stubGlobal("BroadcastChannel", MockBroadcastChannel);
43
- });
44
- class TestComponent extends StatefulComponent {
45
- render() { return null; }
46
- }
47
- function fieldCtx(name) {
48
- const initializers = [];
49
- return {
50
- ctx: {
51
- name,
52
- kind: "field",
53
- addInitializer(fn) { initializers.push(fn); },
54
- },
55
- run(instance) {
56
- initializers.forEach((fn) => { fn.call(instance); });
57
- },
58
- };
59
- }
60
- describe("@Synced decorator", () => {
61
- it("reads and writes the field reactively", () => {
62
- const { ctx, run } = fieldCtx("count");
63
- Synced()(undefined, ctx);
64
- const instance = new TestComponent();
65
- instance.count = 0;
66
- run(instance);
67
- const inst = instance;
68
- expect(inst.count).toBe(0);
69
- inst.count = 5;
70
- expect(inst.count).toBe(5);
71
- });
72
- it("uses field name as channel name by default", () => {
73
- const { ctx, run } = fieldCtx("cart");
74
- Synced()(undefined, ctx);
75
- const instance = new TestComponent();
76
- instance.cart = [];
77
- run(instance);
78
- expect(MockBroadcastChannel.instances[0].name).toBe("cart");
79
- });
80
- it("uses custom channel name when provided", () => {
81
- const { ctx, run } = fieldCtx("items");
82
- Synced("my-channel")(undefined, ctx);
83
- const instance = new TestComponent();
84
- instance.items = [];
85
- run(instance);
86
- expect(MockBroadcastChannel.instances[0].name).toBe("my-channel");
87
- });
88
- it("triggers reactive effects on write", () => {
89
- const { ctx, run } = fieldCtx("value");
90
- Synced()(undefined, ctx);
91
- const instance = new TestComponent();
92
- instance.value = 0;
93
- run(instance);
94
- const inst = instance;
95
- const log = [];
96
- effect(() => { log.push(inst.value); });
97
- inst.value = 10;
98
- expect(log).toEqual([0, 10]);
99
- });
100
- it("updates field when a remote message arrives", () => {
101
- const { ctx, run } = fieldCtx("score");
102
- Synced()(undefined, ctx);
103
- const instance = new TestComponent();
104
- instance.score = 0;
105
- run(instance);
106
- const inst = instance;
107
- const channel = MockBroadcastChannel.instances[0];
108
- channel.onmessage(new MessageEvent("message", { data: JSON.stringify(42) }));
109
- expect(inst.score).toBe(42);
110
- });
111
- it("two @Synced fields on the same instance share the signalMap entry", () => {
112
- const { ctx: ctx1, run: run1 } = fieldCtx("a");
113
- const { ctx: ctx2, run: run2 } = fieldCtx("b");
114
- Synced()(undefined, ctx1);
115
- Synced()(undefined, ctx2);
116
- const instance = new TestComponent();
117
- instance.a = 1;
118
- instance.b = 2;
119
- run1(instance);
120
- run2(instance);
121
- const inst = instance;
122
- inst.a = 10;
123
- inst.b = 20;
124
- expect(inst.a).toBe(10);
125
- expect(inst.b).toBe(20);
126
- // Both fields have their own BroadcastChannel
127
- expect(MockBroadcastChannel.instances.length).toBe(2);
128
- instance.onUnmount?.();
129
- expect(MockBroadcastChannel.instances.every((ch) => ch.closed)).toBe(true);
130
- });
131
- it("reuses the existing signal when the same channel key is registered again on the same instance", () => {
132
- // Two fields using an identical explicit channel name bind to the same SyncedSignal.
133
- const { ctx: ctx1, run: run1 } = fieldCtx("alpha");
134
- const { ctx: ctx2, run: run2 } = fieldCtx("beta");
135
- Synced("shared-chan")(undefined, ctx1);
136
- Synced("shared-chan")(undefined, ctx2);
137
- const instance = new TestComponent();
138
- instance.alpha = "initial";
139
- instance.beta = "initial";
140
- run1(instance);
141
- // second bind for "shared-chan" on the same instance hits the map.has(key) === true branch
142
- run2(instance);
143
- const inst = instance;
144
- inst.alpha = "changed";
145
- // both fields share the same underlying signal
146
- expect(inst.beta).toBe("changed");
147
- instance.onUnmount?.();
148
- });
149
- it("onUnmount closes the BroadcastChannel", () => {
150
- const { ctx, run } = fieldCtx("data");
151
- Synced()(undefined, ctx);
152
- const instance = new TestComponent();
153
- instance.data = null;
154
- run(instance);
155
- const channel = MockBroadcastChannel.instances[0];
156
- expect(channel.closed).toBe(false);
157
- instance.onUnmount?.();
158
- expect(channel.closed).toBe(true);
159
- });
160
- });
161
- //# sourceMappingURL=synced.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"synced.test.js","sourceRoot":"","sources":["../../src/__tests__/synced.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=until.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"until.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/until.test.ts"],"names":[],"mappings":""}
@@ -1,88 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { signal, computed } from "@praxisjs/core/internal";
3
- import { Until } from "../functions/until";
4
- // Simulates TC39 decorator context for a method decorator
5
- function mockMethodContext(name) {
6
- const initializers = [];
7
- const ctx = {
8
- name,
9
- kind: "method",
10
- addInitializer(fn) {
11
- initializers.push(fn);
12
- },
13
- runInitializers(instance) {
14
- initializers.forEach((fn) => { fn.call(instance); });
15
- },
16
- };
17
- return ctx;
18
- }
19
- // ── @Until ────────────────────────────────────────────────────────────────────
20
- describe("Until", () => {
21
- it("resolves immediately when the signal is already truthy", async () => {
22
- const s = signal(42);
23
- const obj = { count: s };
24
- const ctx = mockMethodContext("wait");
25
- Until("count")(() => { }, ctx);
26
- ctx.runInitializers(obj);
27
- const result = await obj.wait();
28
- expect(result).toBe(42);
29
- });
30
- it("resolves when the signal becomes truthy", async () => {
31
- const s = signal(0);
32
- const obj = { count: s };
33
- const ctx = mockMethodContext("wait");
34
- Until("count")(() => { }, ctx);
35
- ctx.runInitializers(obj);
36
- const promise = obj.wait();
37
- s.set(5);
38
- expect(await promise).toBe(5);
39
- });
40
- it("resolves with a computed signal", async () => {
41
- const s = signal(0);
42
- const doubled = computed(() => s() * 2);
43
- const obj = { doubled };
44
- const ctx = mockMethodContext("waitDoubled");
45
- Until("doubled")(() => { }, ctx);
46
- ctx.runInitializers(obj);
47
- const promise = obj.waitDoubled();
48
- s.set(3); // doubled becomes 6 (truthy)
49
- expect(await promise).toBe(6);
50
- });
51
- it("each call returns a new promise", async () => {
52
- const s = signal("");
53
- const obj = { name: s };
54
- const ctx = mockMethodContext("waitName");
55
- Until("name")(() => { }, ctx);
56
- ctx.runInitializers(obj);
57
- const wait = obj.waitName;
58
- const p1 = wait();
59
- const p2 = wait();
60
- expect(p1).not.toBe(p2);
61
- s.set("alice");
62
- expect(await p1).toBe("alice");
63
- expect(await p2).toBe("alice");
64
- });
65
- it("does not resolve when signal stays falsy", async () => {
66
- const s = signal(0);
67
- const obj = { count: s };
68
- const ctx = mockMethodContext("wait");
69
- Until("count")(() => { }, ctx);
70
- ctx.runInitializers(obj);
71
- let resolved = false;
72
- obj.wait().then(() => { resolved = true; });
73
- await new Promise((res) => { setTimeout(res, 10); });
74
- expect(resolved).toBe(false);
75
- });
76
- it("ignores the original method body", async () => {
77
- const s = signal("hello");
78
- const obj = { value: s };
79
- let bodyCalled = false;
80
- const original = () => { bodyCalled = true; };
81
- const ctx = mockMethodContext("wait");
82
- Until("value")(original, ctx);
83
- ctx.runInitializers(obj);
84
- await obj.wait();
85
- expect(bodyCalled).toBe(false);
86
- });
87
- });
88
- //# sourceMappingURL=until.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"until.test.js","sourceRoot":"","sources":["../../src/__tests__/until.test.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export interface AccessorBinding {
2
- get: () => unknown;
3
- set?: (value: unknown) => void;
4
- }
5
- export interface AccessorBehavior {
6
- /**
7
- * Called once per instance on first access. `initialValue` is the value
8
- * provided by the `accessor` field initializer (e.g. `accessor count = 0`).
9
- * Returns the get/set pair used by the accessor.
10
- */
11
- bind(instance: object, name: string | symbol, initialValue: unknown): AccessorBinding;
12
- }
13
- export declare function createAccessorDecorator(behavior: AccessorBehavior): <This extends object, V>(_target: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) => ClassAccessorDecoratorResult<This, V>;
14
- //# sourceMappingURL=create-accessor-decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-accessor-decorator.d.ts","sourceRoot":"","sources":["../src/create-accessor-decorator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,eAAe,CAAC;CACvF;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,IAC/C,IAAI,SAAS,MAAM,EAAE,CAAC,EACrC,SAAS,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9C,SAAS,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,KAC9C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CA0BzC"}
@@ -1,27 +0,0 @@
1
- export function createAccessorDecorator(behavior) {
2
- return function (_target, context) {
3
- const bindings = new WeakMap();
4
- const initValues = new WeakMap();
5
- function getBinding(instance) {
6
- let b = bindings.get(instance);
7
- if (!b) {
8
- b = behavior.bind(instance, context.name, initValues.get(instance));
9
- bindings.set(instance, b);
10
- }
11
- return b;
12
- }
13
- return {
14
- init(value) {
15
- initValues.set(this, value);
16
- return value;
17
- },
18
- get() {
19
- return getBinding(this).get();
20
- },
21
- set(value) {
22
- getBinding(this).set?.(value);
23
- },
24
- };
25
- };
26
- }
27
- //# sourceMappingURL=create-accessor-decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-accessor-decorator.js","sourceRoot":"","sources":["../src/create-accessor-decorator.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,uBAAuB,CAAC,QAA0B;IAChE,OAAO,UACL,OAA8C,EAC9C,OAA+C;QAE/C,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA2B,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAmB,CAAC;QAElD,SAAS,UAAU,CAAC,QAAgB;YAClC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACpE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO;YACL,IAAI,CAAa,KAAQ;gBACvB,UAAU,CAAC,GAAG,CAAC,IAAc,EAAE,KAAK,CAAC,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG;gBACD,OAAO,UAAU,CAAC,IAAc,CAAC,CAAC,GAAG,EAAO,CAAC;YAC/C,CAAC;YACD,GAAG,CAAa,KAAQ;gBACtB,UAAU,CAAC,IAAc,CAAC,CAAC,GAAG,EAAE,CAAC,KAAgB,CAAC,CAAC;YACrD,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1,167 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
-
3
- import { StatefulComponent, StatelessComponent } from "@praxisjs/core";
4
- import { getComponentProps } from "@praxisjs/core/internal";
5
-
6
- import { Component } from "../component/component";
7
-
8
- // ── Component decorator ───────────────────────────────────────────────────────
9
-
10
- describe("Component decorator", () => {
11
- it("sets __isComponent = true on the enhanced class", () => {
12
- class MyComp extends StatefulComponent {
13
- render() { return null; }
14
- }
15
- const Enhanced = Component()(MyComp, {} as ClassDecoratorContext);
16
- expect(Enhanced.__isComponent).toBe(true);
17
- });
18
-
19
- it("preserves the original class name", () => {
20
- class MyButton extends StatefulComponent {
21
- render() { return null; }
22
- }
23
- const Enhanced = Component()(MyButton, {} as ClassDecoratorContext);
24
- expect(Enhanced.name).toBe("MyButton");
25
- });
26
-
27
- it("marks __isStateless = false for StatefulComponent subclasses", () => {
28
- class MyStateful extends StatefulComponent {
29
- render() { return null; }
30
- }
31
- const Enhanced = Component()(MyStateful, {} as ClassDecoratorContext);
32
- expect(Enhanced.__isStateless).toBe(false);
33
- });
34
-
35
- it("marks __isStateless = true for StatelessComponent subclasses", () => {
36
- class MyStateless extends StatelessComponent {
37
- render() { return null; }
38
- }
39
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
- const Enhanced = Component()(MyStateless as any, {} as ClassDecoratorContext);
41
- expect(Enhanced.__isStateless).toBe(true);
42
- });
43
-
44
- it("enhanced class can still be instantiated", () => {
45
- class Counter extends StatefulComponent {
46
- render() { return null; }
47
- }
48
- const Enhanced = Component()(Counter, {} as ClassDecoratorContext);
49
- const instance = new Enhanced();
50
- expect(instance).toBeInstanceOf(Counter);
51
- });
52
-
53
- it("returns a subclass of the original constructor", () => {
54
- class Base extends StatefulComponent {
55
- render() { return null; }
56
- }
57
- const Enhanced = Component()(Base, {} as ClassDecoratorContext);
58
- expect(Enhanced.prototype).toBeInstanceOf(Base);
59
- });
60
-
61
- // ── Happy paths ──────────────────────────────────────────────────────────────
62
-
63
- it("forwards constructor args — props reach the base constructor", () => {
64
- class WithProps extends StatefulComponent {
65
- render() { return null; }
66
- }
67
- const Enhanced = Component()(WithProps, {} as ClassDecoratorContext);
68
- const instance = new Enhanced({ greeting: "hello" });
69
- expect((getComponentProps(instance) as { greeting: string }).greeting).toBe("hello");
70
- });
71
-
72
- it("instance methods from the original class remain accessible", () => {
73
- class Greeter extends StatefulComponent {
74
- greet() { return "hello"; }
75
- render() { return null; }
76
- }
77
- const Enhanced = Component()(Greeter, {} as ClassDecoratorContext);
78
- const instance = new Enhanced();
79
- expect((instance as Greeter).greet()).toBe("hello");
80
- });
81
-
82
- it("static properties of the original class are preserved on Enhanced", () => {
83
- class WithStatic extends StatefulComponent {
84
- static readonly version = "1.0";
85
- render() { return null; }
86
- }
87
- const Enhanced = Component()(WithStatic, {} as ClassDecoratorContext);
88
- expect((Enhanced as typeof WithStatic).version).toBe("1.0");
89
- });
90
-
91
- // ── Edge cases ───────────────────────────────────────────────────────────────
92
-
93
- it("applying Component() twice preserves name and flags", () => {
94
- class MyComp extends StatefulComponent {
95
- render() { return null; }
96
- }
97
- const E1 = Component()(MyComp, {} as ClassDecoratorContext);
98
- const E2 = Component()(E1, {} as ClassDecoratorContext);
99
- expect(E2.__isComponent).toBe(true);
100
- expect(E2.__isStateless).toBe(false);
101
- expect(E2.name).toBe("MyComp"); // name survives double-wrap
102
- });
103
-
104
- it("deep StatelessComponent inheritance — __isStateless is still true", () => {
105
- class BaseStateless extends StatelessComponent {
106
- render() { return null; }
107
- }
108
- class DeepChild extends BaseStateless {
109
- render() { return null; }
110
- }
111
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
112
- const Enhanced = Component()(DeepChild as any, {} as ClassDecoratorContext);
113
- expect(Enhanced.__isStateless).toBe(true);
114
- });
115
-
116
- it("anonymous class gets an empty name", () => {
117
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
- const Enhanced = Component()(
119
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
- class extends StatefulComponent { render() { return null; } } as any,
121
- {} as ClassDecoratorContext,
122
- );
123
- expect(Enhanced.name).toBe("");
124
- });
125
-
126
- it("__isComponent and __isStateless are static — not own properties of instances", () => {
127
- class MyComp extends StatefulComponent {
128
- render() { return null; }
129
- }
130
- const Enhanced = Component()(MyComp, {} as ClassDecoratorContext);
131
- const instance = new Enhanced();
132
- // Static fields live on the class, not on instances
133
- expect(Object.prototype.hasOwnProperty.call(instance, "__isComponent")).toBe(false);
134
- expect(Object.prototype.hasOwnProperty.call(instance, "__isStateless")).toBe(false);
135
- });
136
-
137
- it("subclassing Enhanced inherits __isComponent and __isStateless", () => {
138
- class MyComp extends StatefulComponent {
139
- render() { return null; }
140
- }
141
- const Enhanced = Component()(MyComp, {} as ClassDecoratorContext);
142
- // `class Sub extends Enhanced` sets Object.getPrototypeOf(Sub) === Enhanced,
143
- // making static fields visible through the chain. Simulate that here to
144
- // avoid TS2510 (conflicting constructor return types in the intersection type).
145
- const Sub = Object.create(Enhanced) as typeof Enhanced;
146
- expect(Sub.__isComponent).toBe(true);
147
- expect(Sub.__isStateless).toBe(false);
148
- });
149
-
150
- it("Enhanced is a different reference from the original constructor", () => {
151
- class MyComp extends StatefulComponent {
152
- render() { return null; }
153
- }
154
- const Enhanced = Component()(MyComp, {} as ClassDecoratorContext);
155
- expect(Enhanced).not.toBe(MyComp);
156
- });
157
-
158
- it("render() falls through to originalRender when enhancement has no render override", () => {
159
- class MyComp extends StatefulComponent {
160
- render() { return null; }
161
- }
162
- const Enhanced = Component()(MyComp, {} as ClassDecoratorContext);
163
- const instance = new Enhanced();
164
- // ComponentBehavior.create() returns {} (no render), so line 48 is hit
165
- expect((instance as StatefulComponent).render()).toBeNull();
166
- });
167
- });