@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
@@ -0,0 +1,101 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ export type AnyMethod = (this: any, ...args: any[]) => any;
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ export type MethodContext = ClassMethodDecoratorContext<any, any>;
5
+
6
+ // Replacements installed through sharedMethod, and the ones an outer decorator wrapped again. Only
7
+ // read while decorating and while building the first instance of a class.
8
+ const shared = new WeakSet<AnyMethod>();
9
+ const superseded = new WeakSet<AnyMethod>();
10
+
11
+ function isPrototype(object: object): boolean {
12
+ // Class prototypes own their `constructor`; instances inherit it.
13
+ return Object.hasOwn(object, "constructor");
14
+ }
15
+
16
+ function ownerOf(object: object, name: PropertyKey): object | null {
17
+ let owner: object | null = object;
18
+ while (owner !== null && !Object.hasOwn(owner, name)) owner = Object.getPrototypeOf(owner) as object | null;
19
+ return owner;
20
+ }
21
+
22
+ function defineOwnMethod(object: object, name: PropertyKey, value: unknown): void {
23
+ Object.defineProperty(object, name, { value, configurable: true, writable: true });
24
+ }
25
+
26
+ /**
27
+ * Returns `method`, the decorator's replacement for `value`, set up so that reading it from an
28
+ * instance returns it bound to that instance, the same function on every read: detached calls
29
+ * (`onClick={this.save}`) keep working. `method` is shared by every instance and keeps any
30
+ * per-instance state in symbol slots.
31
+ *
32
+ * Rather than defining a bound wrapper on each instance as it is built, the first instance turns
33
+ * the method's prototype entry into an accessor: an instance pays for its bound copy only when the
34
+ * method is first read from it, and nothing if it never is.
35
+ */
36
+ export function sharedMethod<F extends AnyMethod>(
37
+ context: MethodContext,
38
+ value: AnyMethod,
39
+ method: F = value as F,
40
+ ): F {
41
+ if (value === method) {
42
+ // @Bind over a decorator that already binds: nothing left to do.
43
+ if (shared.has(method)) return method;
44
+ } else {
45
+ // The inner decorator's replacement now only runs through this one, which does the binding.
46
+ superseded.add(value);
47
+ }
48
+ shared.add(method);
49
+ // `this.#method` can't be read detached through a property, so there is nothing to bind.
50
+ if (context.private) return method;
51
+
52
+ const name = context.name;
53
+ let installed = false;
54
+ let home: object | undefined;
55
+
56
+ const accessor: PropertyDescriptor = {
57
+ configurable: true,
58
+ enumerable: false,
59
+ get(this: object | undefined) {
60
+ // Read from a prototype, or through `super.method()` from a subclass override: caching a
61
+ // bound copy on the instance would then shadow the override. Read with no receiver at all,
62
+ // as `vi.spyOn(instance, name)` does with a getter it finds on the prototype: the spy then
63
+ // wraps the method itself, which takes `this` from each call.
64
+ if (this == null || isPrototype(this) || ownerOf(this, name) !== home) return method;
65
+ const bound = method.bind(this);
66
+ defineOwnMethod(this, name, bound);
67
+ return bound;
68
+ },
69
+ set(this: object, next: unknown) {
70
+ defineOwnMethod(this, name, next);
71
+ },
72
+ };
73
+
74
+ context.addInitializer(function (this: unknown) {
75
+ if (installed) return;
76
+ const target = this as object;
77
+ if (superseded.has(method)) {
78
+ installed = true;
79
+ return;
80
+ }
81
+ if (!context.static) {
82
+ for (
83
+ let proto = Object.getPrototypeOf(target) as object | null;
84
+ proto !== null;
85
+ proto = Object.getPrototypeOf(proto) as object | null
86
+ ) {
87
+ if (Object.getOwnPropertyDescriptor(proto, name)?.value === method) {
88
+ installed = true;
89
+ home = proto;
90
+ Object.defineProperty(proto, name, accessor);
91
+ return;
92
+ }
93
+ }
94
+ }
95
+ // A static method (bound to its class, as before), or a decorator applied by hand whose
96
+ // replacement never reached a prototype: bind it on the object itself.
97
+ defineOwnMethod(target, name, method.bind(target));
98
+ });
99
+
100
+ return method;
101
+ }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=component.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/component.test.ts"],"names":[],"mappings":""}
@@ -1,147 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { StatefulComponent, StatelessComponent } from "@praxisjs/core";
3
- import { getComponentProps } from "@praxisjs/core/internal";
4
- import { Component } from "../component/component";
5
- // ── Component decorator ───────────────────────────────────────────────────────
6
- describe("Component decorator", () => {
7
- it("sets __isComponent = true on the enhanced class", () => {
8
- class MyComp extends StatefulComponent {
9
- render() { return null; }
10
- }
11
- const Enhanced = Component()(MyComp, {});
12
- expect(Enhanced.__isComponent).toBe(true);
13
- });
14
- it("preserves the original class name", () => {
15
- class MyButton extends StatefulComponent {
16
- render() { return null; }
17
- }
18
- const Enhanced = Component()(MyButton, {});
19
- expect(Enhanced.name).toBe("MyButton");
20
- });
21
- it("marks __isStateless = false for StatefulComponent subclasses", () => {
22
- class MyStateful extends StatefulComponent {
23
- render() { return null; }
24
- }
25
- const Enhanced = Component()(MyStateful, {});
26
- expect(Enhanced.__isStateless).toBe(false);
27
- });
28
- it("marks __isStateless = true for StatelessComponent subclasses", () => {
29
- class MyStateless extends StatelessComponent {
30
- render() { return null; }
31
- }
32
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
- const Enhanced = Component()(MyStateless, {});
34
- expect(Enhanced.__isStateless).toBe(true);
35
- });
36
- it("enhanced class can still be instantiated", () => {
37
- class Counter extends StatefulComponent {
38
- render() { return null; }
39
- }
40
- const Enhanced = Component()(Counter, {});
41
- const instance = new Enhanced();
42
- expect(instance).toBeInstanceOf(Counter);
43
- });
44
- it("returns a subclass of the original constructor", () => {
45
- class Base extends StatefulComponent {
46
- render() { return null; }
47
- }
48
- const Enhanced = Component()(Base, {});
49
- expect(Enhanced.prototype).toBeInstanceOf(Base);
50
- });
51
- // ── Happy paths ──────────────────────────────────────────────────────────────
52
- it("forwards constructor args — props reach the base constructor", () => {
53
- class WithProps extends StatefulComponent {
54
- render() { return null; }
55
- }
56
- const Enhanced = Component()(WithProps, {});
57
- const instance = new Enhanced({ greeting: "hello" });
58
- expect(getComponentProps(instance).greeting).toBe("hello");
59
- });
60
- it("instance methods from the original class remain accessible", () => {
61
- class Greeter extends StatefulComponent {
62
- greet() { return "hello"; }
63
- render() { return null; }
64
- }
65
- const Enhanced = Component()(Greeter, {});
66
- const instance = new Enhanced();
67
- expect(instance.greet()).toBe("hello");
68
- });
69
- it("static properties of the original class are preserved on Enhanced", () => {
70
- class WithStatic extends StatefulComponent {
71
- static version = "1.0";
72
- render() { return null; }
73
- }
74
- const Enhanced = Component()(WithStatic, {});
75
- expect(Enhanced.version).toBe("1.0");
76
- });
77
- // ── Edge cases ───────────────────────────────────────────────────────────────
78
- it("applying Component() twice preserves name and flags", () => {
79
- class MyComp extends StatefulComponent {
80
- render() { return null; }
81
- }
82
- const E1 = Component()(MyComp, {});
83
- const E2 = Component()(E1, {});
84
- expect(E2.__isComponent).toBe(true);
85
- expect(E2.__isStateless).toBe(false);
86
- expect(E2.name).toBe("MyComp"); // name survives double-wrap
87
- });
88
- it("deep StatelessComponent inheritance — __isStateless is still true", () => {
89
- class BaseStateless extends StatelessComponent {
90
- render() { return null; }
91
- }
92
- class DeepChild extends BaseStateless {
93
- render() { return null; }
94
- }
95
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
- const Enhanced = Component()(DeepChild, {});
97
- expect(Enhanced.__isStateless).toBe(true);
98
- });
99
- it("anonymous class gets an empty name", () => {
100
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
- const Enhanced = Component()(
102
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
- class extends StatefulComponent {
104
- render() { return null; }
105
- }, {});
106
- expect(Enhanced.name).toBe("");
107
- });
108
- it("__isComponent and __isStateless are static — not own properties of instances", () => {
109
- class MyComp extends StatefulComponent {
110
- render() { return null; }
111
- }
112
- const Enhanced = Component()(MyComp, {});
113
- const instance = new Enhanced();
114
- // Static fields live on the class, not on instances
115
- expect(Object.prototype.hasOwnProperty.call(instance, "__isComponent")).toBe(false);
116
- expect(Object.prototype.hasOwnProperty.call(instance, "__isStateless")).toBe(false);
117
- });
118
- it("subclassing Enhanced inherits __isComponent and __isStateless", () => {
119
- class MyComp extends StatefulComponent {
120
- render() { return null; }
121
- }
122
- const Enhanced = Component()(MyComp, {});
123
- // `class Sub extends Enhanced` sets Object.getPrototypeOf(Sub) === Enhanced,
124
- // making static fields visible through the chain. Simulate that here to
125
- // avoid TS2510 (conflicting constructor return types in the intersection type).
126
- const Sub = Object.create(Enhanced);
127
- expect(Sub.__isComponent).toBe(true);
128
- expect(Sub.__isStateless).toBe(false);
129
- });
130
- it("Enhanced is a different reference from the original constructor", () => {
131
- class MyComp extends StatefulComponent {
132
- render() { return null; }
133
- }
134
- const Enhanced = Component()(MyComp, {});
135
- expect(Enhanced).not.toBe(MyComp);
136
- });
137
- it("render() falls through to originalRender when enhancement has no render override", () => {
138
- class MyComp extends StatefulComponent {
139
- render() { return null; }
140
- }
141
- const Enhanced = Component()(MyComp, {});
142
- const instance = new Enhanced();
143
- // ComponentBehavior.create() returns {} (no render), so line 48 is hit
144
- expect(instance.render()).toBeNull();
145
- });
146
- });
147
- //# sourceMappingURL=component.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component.test.js","sourceRoot":"","sources":["../../src/__tests__/component.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=compose.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compose.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/compose.test.ts"],"names":[],"mappings":""}
@@ -1,164 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { StatefulComponent } from "@praxisjs/core";
3
- import { signal } from "@praxisjs/core/internal";
4
- import { Compose } from "../properties/compose";
5
- function fieldCtx(name) {
6
- const initializers = [];
7
- return {
8
- ctx: {
9
- name,
10
- kind: "field",
11
- addInitializer(fn) {
12
- initializers.push(fn);
13
- },
14
- },
15
- run(instance) {
16
- initializers.forEach((fn) => { fn.call(instance); });
17
- },
18
- };
19
- }
20
- class TestComponent extends StatefulComponent {
21
- render() { return null; }
22
- }
23
- // Simple composable returning plain values
24
- class CounterComposable {
25
- count = 0;
26
- setup() {
27
- return { count: this.count, label: "counter" };
28
- }
29
- }
30
- // Composable returning a signal (reactive property)
31
- class ReactiveComposable {
32
- _count = signal(0);
33
- setup() {
34
- return { count: this._count };
35
- }
36
- }
37
- // Composable with lifecycle hooks
38
- class LifecycleComposable {
39
- onMount = vi.fn();
40
- onUnmount = vi.fn();
41
- setup() {
42
- return { active: true };
43
- }
44
- }
45
- // Composable that uses constructor args
46
- class ArgsComposable {
47
- multiplier;
48
- constructor(multiplier) {
49
- this.multiplier = multiplier;
50
- }
51
- setup() {
52
- return { multiplier: this.multiplier };
53
- }
54
- }
55
- // Composable returning a plain function (non-reactive) in its view
56
- class PlainFnComposable {
57
- setup() {
58
- return { handler: () => 42 };
59
- }
60
- }
61
- describe("@Compose decorator", () => {
62
- it("creates a view getter on the field", () => {
63
- const { ctx, run } = fieldCtx("counter");
64
- Compose(CounterComposable)(undefined, ctx);
65
- const instance = new TestComponent();
66
- run(instance);
67
- const view = instance.counter;
68
- expect(view).toBeDefined();
69
- expect(view.count).toBe(0);
70
- expect(view.label).toBe("counter");
71
- });
72
- it("reactive signal values are resolved via getter", () => {
73
- const { ctx, run } = fieldCtx("reactive");
74
- Compose(ReactiveComposable)(undefined, ctx);
75
- const instance = new TestComponent();
76
- run(instance);
77
- const view = instance.reactive;
78
- expect(view.count).toBe(0);
79
- });
80
- it("calls onMount when component mounts", () => {
81
- const { ctx, run } = fieldCtx("lc");
82
- Compose(LifecycleComposable)(undefined, ctx);
83
- const instance = new TestComponent();
84
- run(instance);
85
- const view = instance.lc;
86
- expect(view).toBeDefined();
87
- // Trigger onMount
88
- instance.onMount();
89
- const lc = new LifecycleComposable();
90
- // The composable's onMount would have been called
91
- // We verify the instance has an onMount wiring
92
- expect(typeof instance.onMount).toBe("function");
93
- });
94
- it("calls onUnmount when component unmounts", () => {
95
- const { ctx, run } = fieldCtx("lc2");
96
- Compose(LifecycleComposable)(undefined, ctx);
97
- const instance = new TestComponent();
98
- run(instance);
99
- expect(typeof instance.onUnmount).toBe("function");
100
- });
101
- it("invoking instance.onUnmount() executes the composable's onUnmount", () => {
102
- const unmountSpy = vi.fn();
103
- class SpyComposable {
104
- onUnmount = unmountSpy;
105
- setup() { return {}; }
106
- }
107
- const { ctx, run } = fieldCtx("spyComp");
108
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
- Compose(SpyComposable)(undefined, ctx);
110
- const instance = new TestComponent();
111
- run(instance);
112
- instance.onUnmount();
113
- expect(unmountSpy).toHaveBeenCalled();
114
- });
115
- it("passes constructor args to the composable", () => {
116
- const { ctx, run } = fieldCtx("args");
117
- Compose(ArgsComposable, 5)(undefined, ctx);
118
- const instance = new TestComponent();
119
- run(instance);
120
- const view = instance.args;
121
- expect(view.multiplier).toBe(5);
122
- });
123
- it("resolves string constructor args from instance properties", () => {
124
- const { ctx, run } = fieldCtx("resolved");
125
- Compose(ArgsComposable, "myMultiplier")(undefined, ctx);
126
- const instance = new TestComponent();
127
- instance.myMultiplier = 10;
128
- run(instance);
129
- const view = instance.resolved;
130
- expect(view.multiplier).toBe(10);
131
- });
132
- it("each instance gets its own composable view", () => {
133
- const { ctx, run } = fieldCtx("c");
134
- Compose(CounterComposable)(undefined, ctx);
135
- const a = new TestComponent();
136
- const b = new TestComponent();
137
- run(a);
138
- run(b);
139
- const viewA = a.c;
140
- const viewB = b.c;
141
- expect(viewA).not.toBe(viewB);
142
- });
143
- it("plain function value in view is stored as-is (not treated as reactive)", () => {
144
- const { ctx, run } = fieldCtx("pfn");
145
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
- Compose(PlainFnComposable)(undefined, ctx);
147
- const instance = new TestComponent();
148
- run(instance);
149
- const view = instance.pfn;
150
- // handler is a plain function — isReactive returns false, stored directly
151
- expect(typeof view.handler).toBe("function");
152
- expect(view.handler()).toBe(42);
153
- });
154
- it("view getter always returns same view object", () => {
155
- const { ctx, run } = fieldCtx("stable");
156
- Compose(CounterComposable)(undefined, ctx);
157
- const instance = new TestComponent();
158
- run(instance);
159
- const v1 = instance.stable;
160
- const v2 = instance.stable;
161
- expect(v1).toBe(v2);
162
- });
163
- });
164
- //# sourceMappingURL=compose.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compose.test.js","sourceRoot":"","sources":["../../src/__tests__/compose.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=deep-state.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deep-state.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/deep-state.test.ts"],"names":[],"mappings":""}
@@ -1,150 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { StatefulComponent } from "@praxisjs/core";
3
- import { effect } from "@praxisjs/core/internal";
4
- import { DeepState } from "../properties/deep-state";
5
- class TestComponent extends StatefulComponent {
6
- render() { return null; }
7
- }
8
- function fieldCtx(name) {
9
- const initializers = [];
10
- return {
11
- ctx: {
12
- name,
13
- kind: "field",
14
- addInitializer(fn) { initializers.push(fn); },
15
- },
16
- run(instance) {
17
- initializers.forEach((fn) => { fn.call(instance); });
18
- },
19
- };
20
- }
21
- describe("@DeepState decorator", () => {
22
- it("reads initial value", () => {
23
- const { ctx, run } = fieldCtx("config");
24
- DeepState()(undefined, ctx);
25
- const instance = new TestComponent();
26
- instance.config = { theme: "light" };
27
- run(instance);
28
- const inst = instance;
29
- expect(inst.config.theme).toBe("light");
30
- });
31
- it("nested object mutation triggers reactive effect", () => {
32
- const { ctx, run } = fieldCtx("config");
33
- DeepState()(undefined, ctx);
34
- const instance = new TestComponent();
35
- instance.config = { theme: { mode: "light" } };
36
- run(instance);
37
- const inst = instance;
38
- const log = [];
39
- effect(() => { log.push(inst.config.theme.mode); });
40
- inst.config.theme.mode = "dark";
41
- expect(log).toEqual(["light", "dark"]);
42
- });
43
- it("array push triggers reactive effect", () => {
44
- const { ctx, run } = fieldCtx("items");
45
- DeepState()(undefined, ctx);
46
- const instance = new TestComponent();
47
- instance.items = [1, 2];
48
- run(instance);
49
- const inst = instance;
50
- const log = [];
51
- effect(() => { log.push([...inst.items]); });
52
- inst.items.push(3);
53
- expect(log[log.length - 1]).toEqual([1, 2, 3]);
54
- });
55
- it("array index assignment triggers reactive effect", () => {
56
- const { ctx, run } = fieldCtx("list");
57
- DeepState()(undefined, ctx);
58
- const instance = new TestComponent();
59
- instance.list = ["a", "b"];
60
- run(instance);
61
- const inst = instance;
62
- const log = [];
63
- effect(() => { log.push([...inst.list]); });
64
- inst.list[0] = "z";
65
- expect(log[log.length - 1]).toEqual(["z", "b"]);
66
- });
67
- it("property deletion triggers reactive effect", () => {
68
- const { ctx, run } = fieldCtx("obj");
69
- DeepState()(undefined, ctx);
70
- const instance = new TestComponent();
71
- instance.obj = { a: 1, b: 2 };
72
- run(instance);
73
- const inst = instance;
74
- const log = [];
75
- effect(() => { log.push(Object.keys(inst.obj)); });
76
- delete inst.obj.a;
77
- expect(log[log.length - 1]).not.toContain("a");
78
- });
79
- it("direct assignment replaces root and triggers effect", () => {
80
- const { ctx, run } = fieldCtx("data");
81
- DeepState()(undefined, ctx);
82
- const instance = new TestComponent();
83
- instance.data = { x: 1 };
84
- run(instance);
85
- const inst = instance;
86
- const log = [];
87
- effect(() => { log.push(inst.data.x); });
88
- inst.data = { x: 99 };
89
- expect(log).toEqual([1, 99]);
90
- });
91
- it("mutations on new root after reassignment are reactive", () => {
92
- const { ctx, run } = fieldCtx("cfg");
93
- DeepState()(undefined, ctx);
94
- const instance = new TestComponent();
95
- instance.cfg = { v: 0 };
96
- run(instance);
97
- const inst = instance;
98
- inst.cfg = { v: 10 };
99
- const log = [];
100
- effect(() => { log.push(inst.cfg.v); });
101
- inst.cfg.v = 20;
102
- expect(log).toEqual([10, 20]);
103
- });
104
- it("null initial value is handled gracefully", () => {
105
- const { ctx, run } = fieldCtx("maybe");
106
- DeepState()(undefined, ctx);
107
- const instance = new TestComponent();
108
- instance.maybe = null;
109
- run(instance);
110
- const inst = instance;
111
- expect(inst.maybe).toBeNull();
112
- const log = [];
113
- effect(() => { log.push(inst.maybe); });
114
- inst.maybe = { x: 5 };
115
- expect(log).toEqual([null, { x: 5 }]);
116
- });
117
- it("setter with null value — proxy not created, value is null", () => {
118
- const { ctx, run } = fieldCtx("nullable");
119
- DeepState()(undefined, ctx);
120
- const instance = new TestComponent();
121
- instance.nullable = { x: 1 };
122
- run(instance);
123
- const inst = instance;
124
- inst.nullable = null;
125
- expect(inst.nullable).toBeNull();
126
- });
127
- it("setter with primitive value — value stored directly without proxy", () => {
128
- const { ctx, run } = fieldCtx("num");
129
- DeepState()(undefined, ctx);
130
- const instance = new TestComponent();
131
- instance.num = { v: 0 };
132
- run(instance);
133
- const inst = instance;
134
- inst.num = 99;
135
- expect(inst.num).toBe(99);
136
- });
137
- it("deeply nested mutation triggers effect", () => {
138
- const { ctx, run } = fieldCtx("deep");
139
- DeepState()(undefined, ctx);
140
- const instance = new TestComponent();
141
- instance.deep = { a: { b: { c: 0 } } };
142
- run(instance);
143
- const inst = instance;
144
- const log = [];
145
- effect(() => { log.push(inst.deep.a.b.c); });
146
- inst.deep.a.b.c = 42;
147
- expect(log).toEqual([0, 42]);
148
- });
149
- });
150
- //# sourceMappingURL=deep-state.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deep-state.test.js","sourceRoot":"","sources":["../../src/__tests__/deep-state.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=events.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/events.test.ts"],"names":[],"mappings":""}