@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.
- package/CHANGELOG.md +46 -0
- package/dist/component/component.d.ts +1 -1
- package/dist/component/component.d.ts.map +1 -1
- package/dist/component/component.js +8 -15
- package/dist/component/component.js.map +1 -1
- package/dist/component/lazy.d.ts +1 -1
- package/dist/component/lazy.d.ts.map +1 -1
- package/dist/component/lazy.js +44 -36
- package/dist/component/lazy.js.map +1 -1
- package/dist/create-class-decorator.d.ts +27 -5
- package/dist/create-class-decorator.d.ts.map +1 -1
- package/dist/create-class-decorator.js +53 -18
- package/dist/create-class-decorator.js.map +1 -1
- package/dist/create-field-decorator.d.ts +42 -3
- package/dist/create-field-decorator.d.ts.map +1 -1
- package/dist/create-field-decorator.js +63 -27
- package/dist/create-field-decorator.js.map +1 -1
- package/dist/create-getter-decorator.d.ts +81 -16
- package/dist/create-getter-decorator.d.ts.map +1 -1
- package/dist/create-getter-decorator.js +127 -15
- package/dist/create-getter-decorator.js.map +1 -1
- package/dist/create-lifecycle-method-decorator.d.ts +21 -3
- package/dist/create-lifecycle-method-decorator.d.ts.map +1 -1
- package/dist/create-lifecycle-method-decorator.js +25 -18
- package/dist/create-lifecycle-method-decorator.js.map +1 -1
- package/dist/create-method-decorator.d.ts +43 -3
- package/dist/create-method-decorator.d.ts.map +1 -1
- package/dist/create-method-decorator.js +49 -8
- package/dist/create-method-decorator.js.map +1 -1
- package/dist/events/command.d.ts +2 -1
- package/dist/events/command.d.ts.map +1 -1
- package/dist/events/command.js +10 -8
- package/dist/events/command.js.map +1 -1
- package/dist/events/emit.d.ts +2 -2
- package/dist/events/emit.d.ts.map +1 -1
- package/dist/events/emit.js +18 -24
- package/dist/events/emit.js.map +1 -1
- package/dist/events/on-command.d.ts +2 -1
- package/dist/events/on-command.d.ts.map +1 -1
- package/dist/events/on-command.js +12 -14
- package/dist/events/on-command.js.map +1 -1
- package/dist/field.d.ts +51 -0
- package/dist/field.d.ts.map +1 -0
- package/dist/field.js +82 -0
- package/dist/field.js.map +1 -0
- package/dist/functions/bind.d.ts +2 -1
- package/dist/functions/bind.d.ts.map +1 -1
- package/dist/functions/bind.js +4 -4
- package/dist/functions/bind.js.map +1 -1
- package/dist/functions/debounce.d.ts +2 -2
- package/dist/functions/debounce.d.ts.map +1 -1
- package/dist/functions/debounce.js +25 -23
- package/dist/functions/debounce.js.map +1 -1
- package/dist/functions/index.d.ts +1 -1
- package/dist/functions/index.d.ts.map +1 -1
- package/dist/functions/index.js.map +1 -1
- package/dist/functions/log.d.ts +2 -1
- package/dist/functions/log.d.ts.map +1 -1
- package/dist/functions/log.js +38 -40
- package/dist/functions/log.js.map +1 -1
- package/dist/functions/memo.d.ts +9 -1
- package/dist/functions/memo.d.ts.map +1 -1
- package/dist/functions/memo.js +44 -30
- package/dist/functions/memo.js.map +1 -1
- package/dist/functions/once.d.ts +2 -1
- package/dist/functions/once.d.ts.map +1 -1
- package/dist/functions/once.js +10 -14
- package/dist/functions/once.js.map +1 -1
- package/dist/functions/retry.d.ts +2 -1
- package/dist/functions/retry.d.ts.map +1 -1
- package/dist/functions/retry.js +21 -23
- package/dist/functions/retry.js.map +1 -1
- package/dist/functions/throttle.d.ts +2 -1
- package/dist/functions/throttle.d.ts.map +1 -1
- package/dist/functions/throttle.js +12 -14
- package/dist/functions/throttle.js.map +1 -1
- package/dist/functions/until.d.ts +2 -1
- package/dist/functions/until.d.ts.map +1 -1
- package/dist/functions/until.js +13 -14
- package/dist/functions/until.js.map +1 -1
- package/dist/functions/watch.d.ts +1 -1
- package/dist/functions/watch.d.ts.map +1 -1
- package/dist/functions/watch.js +36 -34
- package/dist/functions/watch.js.map +1 -1
- package/dist/functions/when.d.ts +1 -1
- package/dist/functions/when.d.ts.map +1 -1
- package/dist/functions/when.js +19 -21
- package/dist/functions/when.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +24 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +55 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/properties/compose.d.ts +3 -2
- package/dist/properties/compose.d.ts.map +1 -1
- package/dist/properties/compose.js +33 -19
- package/dist/properties/compose.js.map +1 -1
- package/dist/properties/computed.d.ts +12 -10
- package/dist/properties/computed.d.ts.map +1 -1
- package/dist/properties/computed.js +26 -21
- package/dist/properties/computed.js.map +1 -1
- package/dist/properties/deep-state.d.ts +2 -1
- package/dist/properties/deep-state.d.ts.map +1 -1
- package/dist/properties/deep-state.js +66 -49
- package/dist/properties/deep-state.js.map +1 -1
- package/dist/properties/function-prop.d.ts +2 -1
- package/dist/properties/function-prop.d.ts.map +1 -1
- package/dist/properties/function-prop.js +20 -22
- package/dist/properties/function-prop.js.map +1 -1
- package/dist/properties/history.d.ts +2 -2
- package/dist/properties/history.d.ts.map +1 -1
- package/dist/properties/history.js +34 -31
- package/dist/properties/history.js.map +1 -1
- package/dist/properties/index.d.ts +1 -0
- package/dist/properties/index.d.ts.map +1 -1
- package/dist/properties/index.js +1 -0
- package/dist/properties/index.js.map +1 -1
- package/dist/properties/persisted.d.ts +2 -1
- package/dist/properties/persisted.d.ts.map +1 -1
- package/dist/properties/persisted.js +30 -19
- package/dist/properties/persisted.js.map +1 -1
- package/dist/properties/prop.d.ts +2 -1
- package/dist/properties/prop.d.ts.map +1 -1
- package/dist/properties/prop.js +26 -22
- package/dist/properties/prop.js.map +1 -1
- package/dist/properties/ref.d.ts +2 -1
- package/dist/properties/ref.d.ts.map +1 -1
- package/dist/properties/ref.js +11 -8
- package/dist/properties/ref.js.map +1 -1
- package/dist/properties/resource.d.ts.map +1 -1
- package/dist/properties/resource.js +21 -16
- package/dist/properties/resource.js.map +1 -1
- package/dist/properties/selector.d.ts +12 -0
- package/dist/properties/selector.d.ts.map +1 -0
- package/dist/properties/selector.js +25 -0
- package/dist/properties/selector.js.map +1 -0
- package/dist/properties/slot.d.ts +2 -1
- package/dist/properties/slot.d.ts.map +1 -1
- package/dist/properties/slot.js +22 -20
- package/dist/properties/slot.js.map +1 -1
- package/dist/properties/state.d.ts.map +1 -1
- package/dist/properties/state.js +27 -16
- package/dist/properties/state.js.map +1 -1
- package/dist/properties/synced.d.ts +2 -1
- package/dist/properties/synced.d.ts.map +1 -1
- package/dist/properties/synced.js +27 -19
- package/dist/properties/synced.js.map +1 -1
- package/dist/shared-method.d.ts +14 -0
- package/dist/shared-method.d.ts.map +1 -0
- package/dist/shared-method.js +87 -0
- package/dist/shared-method.js.map +1 -0
- package/package.json +14 -5
- package/src/component/component.ts +8 -27
- package/src/component/lazy.ts +51 -41
- package/src/create-class-decorator.ts +90 -31
- package/src/create-field-decorator.ts +120 -43
- package/src/create-getter-decorator.ts +263 -66
- package/src/create-lifecycle-method-decorator.ts +50 -28
- package/src/create-method-decorator.ts +119 -13
- package/src/events/command.ts +11 -9
- package/src/events/emit.ts +16 -22
- package/src/events/on-command.ts +17 -18
- package/src/field.ts +116 -0
- package/src/functions/bind.ts +4 -4
- package/src/functions/debounce.ts +25 -23
- package/src/functions/index.ts +1 -1
- package/src/functions/log.ts +44 -46
- package/src/functions/memo.ts +54 -28
- package/src/functions/once.ts +10 -13
- package/src/functions/retry.ts +19 -21
- package/src/functions/throttle.ts +12 -13
- package/src/functions/until.ts +14 -14
- package/src/functions/watch.ts +37 -36
- package/src/functions/when.ts +18 -20
- package/src/index.ts +13 -5
- package/src/lifecycle.ts +74 -0
- package/src/properties/compose.ts +33 -20
- package/src/properties/computed.ts +35 -45
- package/src/properties/deep-state.ts +68 -53
- package/src/properties/function-prop.ts +25 -27
- package/src/properties/history.ts +34 -33
- package/src/properties/index.ts +1 -0
- package/src/properties/persisted.ts +41 -27
- package/src/properties/prop.ts +30 -22
- package/src/properties/ref.ts +12 -10
- package/src/properties/resource.ts +22 -17
- package/src/properties/selector.ts +45 -0
- package/src/properties/slot.ts +28 -22
- package/src/properties/state.ts +32 -16
- package/src/properties/synced.ts +31 -19
- package/src/shared-method.ts +101 -0
- package/dist/__tests__/component.test.d.ts +0 -2
- package/dist/__tests__/component.test.d.ts.map +0 -1
- package/dist/__tests__/component.test.js +0 -147
- package/dist/__tests__/component.test.js.map +0 -1
- package/dist/__tests__/compose.test.d.ts +0 -2
- package/dist/__tests__/compose.test.d.ts.map +0 -1
- package/dist/__tests__/compose.test.js +0 -164
- package/dist/__tests__/compose.test.js.map +0 -1
- package/dist/__tests__/deep-state.test.d.ts +0 -2
- package/dist/__tests__/deep-state.test.d.ts.map +0 -1
- package/dist/__tests__/deep-state.test.js +0 -150
- package/dist/__tests__/deep-state.test.js.map +0 -1
- package/dist/__tests__/events.test.d.ts +0 -2
- package/dist/__tests__/events.test.d.ts.map +0 -1
- package/dist/__tests__/events.test.js +0 -295
- package/dist/__tests__/events.test.js.map +0 -1
- package/dist/__tests__/functions.test.d.ts +0 -2
- package/dist/__tests__/functions.test.d.ts.map +0 -1
- package/dist/__tests__/functions.test.js +0 -618
- package/dist/__tests__/functions.test.js.map +0 -1
- package/dist/__tests__/lazy.test.d.ts +0 -2
- package/dist/__tests__/lazy.test.d.ts.map +0 -1
- package/dist/__tests__/lazy.test.js +0 -227
- package/dist/__tests__/lazy.test.js.map +0 -1
- package/dist/__tests__/memo.test.d.ts +0 -2
- package/dist/__tests__/memo.test.d.ts.map +0 -1
- package/dist/__tests__/memo.test.js +0 -168
- package/dist/__tests__/memo.test.js.map +0 -1
- package/dist/__tests__/properties-browser.test.d.ts +0 -2
- package/dist/__tests__/properties-browser.test.d.ts.map +0 -1
- package/dist/__tests__/properties-browser.test.js +0 -178
- package/dist/__tests__/properties-browser.test.js.map +0 -1
- package/dist/__tests__/properties.test.d.ts +0 -2
- package/dist/__tests__/properties.test.d.ts.map +0 -1
- package/dist/__tests__/properties.test.js +0 -1226
- package/dist/__tests__/properties.test.js.map +0 -1
- package/dist/__tests__/ref.test.d.ts +0 -2
- package/dist/__tests__/ref.test.d.ts.map +0 -1
- package/dist/__tests__/ref.test.js +0 -106
- package/dist/__tests__/ref.test.js.map +0 -1
- package/dist/__tests__/resource.test.d.ts +0 -2
- package/dist/__tests__/resource.test.d.ts.map +0 -1
- package/dist/__tests__/resource.test.js +0 -217
- package/dist/__tests__/resource.test.js.map +0 -1
- package/dist/__tests__/slot.test.d.ts +0 -2
- package/dist/__tests__/slot.test.d.ts.map +0 -1
- package/dist/__tests__/slot.test.js +0 -147
- package/dist/__tests__/slot.test.js.map +0 -1
- package/dist/__tests__/synced.test.d.ts +0 -2
- package/dist/__tests__/synced.test.d.ts.map +0 -1
- package/dist/__tests__/synced.test.js +0 -161
- package/dist/__tests__/synced.test.js.map +0 -1
- package/dist/__tests__/until.test.d.ts +0 -2
- package/dist/__tests__/until.test.d.ts.map +0 -1
- package/dist/__tests__/until.test.js +0 -88
- package/dist/__tests__/until.test.js.map +0 -1
- package/dist/create-accessor-decorator.d.ts +0 -14
- package/dist/create-accessor-decorator.d.ts.map +0 -1
- package/dist/create-accessor-decorator.js +0 -27
- package/dist/create-accessor-decorator.js.map +0 -1
- package/src/__tests__/component.test.ts +0 -167
- package/src/__tests__/compose.test.ts +0 -202
- package/src/__tests__/deep-state.test.ts +0 -185
- package/src/__tests__/events.test.ts +0 -366
- package/src/__tests__/functions.test.ts +0 -803
- package/src/__tests__/lazy.test.ts +0 -296
- package/src/__tests__/memo.test.ts +0 -208
- package/src/__tests__/properties-browser.test.ts +0 -234
- package/src/__tests__/properties.test.ts +0 -1526
- package/src/__tests__/ref.test.ts +0 -131
- package/src/__tests__/resource.test.ts +0 -246
- package/src/__tests__/slot.test.ts +0 -179
- package/src/__tests__/synced.test.ts +0 -193
- package/src/__tests__/until.test.ts +0 -113
- package/src/create-accessor-decorator.ts +0 -45
- 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 +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 +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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,0DAA0D;AAC1D,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,YAAY,GAAkC,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG;QACV,IAAI;QACJ,IAAI,EAAE,QAAiB;QACvB,cAAc,CAAC,EAA0B;YACvC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,eAAe,CAAC,QAAgB;YAC9B,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,GAAG,GAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAElD,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAA6C,CAAC,CAAC;QACxE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAO,GAAG,CAAC,IAA8B,EAAE,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,CAAC,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAElD,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAA6C,CAAC,CAAC;QACxE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,OAAO,GAAI,GAAG,CAAC,IAA8B,EAAE,CAAC;QACtD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACT,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,CAAC;QAEjD,MAAM,GAAG,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAA6C,CAAC,CAAC;QAC1E,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,OAAO,GAAI,GAAG,CAAC,WAAqC,EAAE,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B;QACvC,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;QAC7B,MAAM,GAAG,GAA4B,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAEjD,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAA6C,CAAC,CAAC;QACvE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,IAAI,GAAG,GAAG,CAAC,QAAiC,CAAC;QAEnD,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACf,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,CAAC,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAElD,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAA6C,CAAC,CAAC;QACxE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,IAA8B,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,MAAM,GAAG,GAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAElD,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAA6C,CAAC,CAAC;QACxE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAO,GAAG,CAAC,IAA8B,EAAE,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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
|
-
});
|