@livetemplate/client 0.4.1 → 0.7.2

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 (31) hide show
  1. package/dist/dom/event-delegation.d.ts +12 -0
  2. package/dist/dom/event-delegation.d.ts.map +1 -1
  3. package/dist/dom/event-delegation.js +204 -8
  4. package/dist/dom/event-delegation.js.map +1 -1
  5. package/dist/dom/reactive-attributes.d.ts +67 -0
  6. package/dist/dom/reactive-attributes.d.ts.map +1 -0
  7. package/dist/dom/reactive-attributes.js +201 -0
  8. package/dist/dom/reactive-attributes.js.map +1 -0
  9. package/dist/livetemplate-client.browser.js +4 -4
  10. package/dist/livetemplate-client.browser.js.map +4 -4
  11. package/dist/livetemplate-client.d.ts +2 -0
  12. package/dist/livetemplate-client.d.ts.map +1 -1
  13. package/dist/livetemplate-client.js +13 -1
  14. package/dist/livetemplate-client.js.map +1 -1
  15. package/dist/state/tree-renderer.d.ts +6 -0
  16. package/dist/state/tree-renderer.d.ts.map +1 -1
  17. package/dist/state/tree-renderer.js +193 -16
  18. package/dist/state/tree-renderer.js.map +1 -1
  19. package/dist/tests/event-delegation.test.js +142 -0
  20. package/dist/tests/event-delegation.test.js.map +1 -1
  21. package/dist/tests/reactive-attributes.test.d.ts +2 -0
  22. package/dist/tests/reactive-attributes.test.d.ts.map +1 -0
  23. package/dist/tests/reactive-attributes.test.js +393 -0
  24. package/dist/tests/reactive-attributes.test.js.map +1 -0
  25. package/dist/tests/test-conditional-debug.test.js +13 -1
  26. package/dist/tests/test-conditional-debug.test.js.map +1 -1
  27. package/dist/utils/confirm.d.ts +12 -0
  28. package/dist/utils/confirm.d.ts.map +1 -0
  29. package/dist/utils/confirm.js +35 -0
  30. package/dist/utils/confirm.js.map +1 -0
  31. package/package.json +1 -1
@@ -99,5 +99,147 @@ describe("EventDelegator", () => {
99
99
  }),
100
100
  }));
101
101
  });
102
+ describe("focus trap", () => {
103
+ it("sets up keydown listener for focus trap", () => {
104
+ const wrapper = document.createElement("div");
105
+ wrapper.setAttribute("data-lvt-id", "wrapper-focus-trap");
106
+ wrapper.innerHTML = `
107
+ <div id="modal" lvt-focus-trap>
108
+ <button id="first">First</button>
109
+ <button id="last">Last</button>
110
+ </div>
111
+ `;
112
+ document.body.appendChild(wrapper);
113
+ const context = createContext(wrapper);
114
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
115
+ delegator.setupFocusTrapDelegation();
116
+ // Verify listener was registered
117
+ const listenerKey = `__lvt_focus_trap_wrapper-focus-trap`;
118
+ expect(document[listenerKey]).toBeDefined();
119
+ });
120
+ it("prevents default on Tab at boundary and cycles focus", () => {
121
+ const wrapper = document.createElement("div");
122
+ wrapper.setAttribute("data-lvt-id", "wrapper-focus-trap-cycle");
123
+ wrapper.innerHTML = `
124
+ <div id="modal" lvt-focus-trap>
125
+ <button id="first">First</button>
126
+ <button id="last">Last</button>
127
+ </div>
128
+ `;
129
+ document.body.appendChild(wrapper);
130
+ const context = createContext(wrapper);
131
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
132
+ delegator.setupFocusTrapDelegation();
133
+ const firstButton = document.getElementById("first");
134
+ const lastButton = document.getElementById("last");
135
+ // Focus the last element
136
+ lastButton.focus();
137
+ // Create a Tab event that can be prevented
138
+ const tabEvent = new KeyboardEvent("keydown", {
139
+ key: "Tab",
140
+ bubbles: true,
141
+ cancelable: true,
142
+ });
143
+ // Spy on preventDefault
144
+ const preventDefaultSpy = jest.spyOn(tabEvent, "preventDefault");
145
+ document.dispatchEvent(tabEvent);
146
+ // In JSDOM, the event should trigger our handler which calls preventDefault and focus
147
+ expect(preventDefaultSpy).toHaveBeenCalled();
148
+ expect(document.activeElement).toBe(firstButton);
149
+ });
150
+ it("prevents default on Shift+Tab at boundary and cycles focus backwards", () => {
151
+ const wrapper = document.createElement("div");
152
+ wrapper.setAttribute("data-lvt-id", "wrapper-focus-trap-shift");
153
+ wrapper.innerHTML = `
154
+ <div id="modal" lvt-focus-trap>
155
+ <button id="first">First</button>
156
+ <button id="last">Last</button>
157
+ </div>
158
+ `;
159
+ document.body.appendChild(wrapper);
160
+ const context = createContext(wrapper);
161
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
162
+ delegator.setupFocusTrapDelegation();
163
+ const firstButton = document.getElementById("first");
164
+ const lastButton = document.getElementById("last");
165
+ // Focus the first element
166
+ firstButton.focus();
167
+ // Create a Shift+Tab event
168
+ const shiftTabEvent = new KeyboardEvent("keydown", {
169
+ key: "Tab",
170
+ shiftKey: true,
171
+ bubbles: true,
172
+ cancelable: true,
173
+ });
174
+ const preventDefaultSpy = jest.spyOn(shiftTabEvent, "preventDefault");
175
+ document.dispatchEvent(shiftTabEvent);
176
+ expect(preventDefaultSpy).toHaveBeenCalled();
177
+ expect(document.activeElement).toBe(lastButton);
178
+ });
179
+ });
180
+ describe("autofocus", () => {
181
+ it("marks element with lvt-autofocus for focusing", () => {
182
+ const wrapper = document.createElement("div");
183
+ wrapper.setAttribute("data-lvt-id", "wrapper-autofocus");
184
+ wrapper.innerHTML = `
185
+ <input id="search" type="text" lvt-autofocus />
186
+ `;
187
+ document.body.appendChild(wrapper);
188
+ const context = createContext(wrapper);
189
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
190
+ delegator.setupAutofocusDelegation();
191
+ // The element should be marked for autofocus (actual focus happens in RAF)
192
+ const input = document.getElementById("search");
193
+ expect(input.getAttribute("data-lvt-autofocused")).toBe("true");
194
+ });
195
+ it("sets up mutation observer for autofocus elements", () => {
196
+ const wrapper = document.createElement("div");
197
+ wrapper.setAttribute("data-lvt-id", "wrapper-autofocus-observer");
198
+ wrapper.innerHTML = `
199
+ <div id="container"></div>
200
+ `;
201
+ document.body.appendChild(wrapper);
202
+ const context = createContext(wrapper);
203
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
204
+ delegator.setupAutofocusDelegation();
205
+ // Verify observer is attached
206
+ const observerKey = `__lvt_autofocus_observer_wrapper-autofocus-observer`;
207
+ expect(wrapper[observerKey]).toBeDefined();
208
+ });
209
+ it("does not mark hidden elements for autofocus", () => {
210
+ const wrapper = document.createElement("div");
211
+ wrapper.setAttribute("data-lvt-id", "wrapper-autofocus-hidden");
212
+ wrapper.innerHTML = `
213
+ <input id="hidden-search" type="text" lvt-autofocus style="display: none" />
214
+ `;
215
+ document.body.appendChild(wrapper);
216
+ const context = createContext(wrapper);
217
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
218
+ delegator.setupAutofocusDelegation();
219
+ // Hidden element should not be marked for autofocus
220
+ const input = document.getElementById("hidden-search");
221
+ expect(input.getAttribute("data-lvt-autofocused")).toBeNull();
222
+ });
223
+ it("marks element for autofocus when it becomes visible", async () => {
224
+ const wrapper = document.createElement("div");
225
+ wrapper.setAttribute("data-lvt-id", "wrapper-autofocus-toggle");
226
+ wrapper.innerHTML = `
227
+ <input id="toggle-input" type="text" lvt-autofocus style="display: none" />
228
+ `;
229
+ document.body.appendChild(wrapper);
230
+ const context = createContext(wrapper);
231
+ const delegator = new event_delegation_1.EventDelegator(context, (0, logger_1.createLogger)({ scope: "EventDelegatorTest", level: "silent" }));
232
+ delegator.setupAutofocusDelegation();
233
+ const input = document.getElementById("toggle-input");
234
+ // Initially hidden, should not be marked
235
+ expect(input.getAttribute("data-lvt-autofocused")).toBeNull();
236
+ // Make visible
237
+ input.style.display = "block";
238
+ // Wait for MutationObserver to process
239
+ await new Promise((resolve) => setTimeout(resolve, 50));
240
+ // Should now be marked for autofocus
241
+ expect(input.getAttribute("data-lvt-autofocused")).toBe("true");
242
+ });
243
+ });
102
244
  });
103
245
  //# sourceMappingURL=event-delegation.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-delegation.test.js","sourceRoot":"","sources":["../../tests/event-delegation.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-delegation.test.js","sourceRoot":"","sources":["../../tests/event-delegation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reactive-attributes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive-attributes.test.d.ts","sourceRoot":"","sources":["../../tests/reactive-attributes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const reactive_attributes_1 = require("../dom/reactive-attributes");
4
+ describe("Reactive Attributes", () => {
5
+ beforeEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ afterEach(() => {
9
+ document.body.innerHTML = "";
10
+ });
11
+ describe("parseReactiveAttribute", () => {
12
+ describe("valid attribute parsing", () => {
13
+ it("parses global lifecycle event", () => {
14
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:success", "");
15
+ expect(result).toEqual({
16
+ action: "reset",
17
+ lifecycle: "success",
18
+ actionName: undefined,
19
+ param: undefined,
20
+ });
21
+ });
22
+ it("parses action-specific lifecycle event", () => {
23
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:create-todo:success", "");
24
+ expect(result).toEqual({
25
+ action: "reset",
26
+ lifecycle: "success",
27
+ actionName: "create-todo",
28
+ param: undefined,
29
+ });
30
+ });
31
+ it("parses parameterized action with value", () => {
32
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-addClass-on:pending", "loading opacity-50");
33
+ expect(result).toEqual({
34
+ action: "addClass",
35
+ lifecycle: "pending",
36
+ actionName: undefined,
37
+ param: "loading opacity-50",
38
+ });
39
+ });
40
+ it("parses action-specific parameterized action", () => {
41
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-addClass-on:save:pending", "loading");
42
+ expect(result).toEqual({
43
+ action: "addClass",
44
+ lifecycle: "pending",
45
+ actionName: "save",
46
+ param: "loading",
47
+ });
48
+ });
49
+ it("parses all lifecycle events", () => {
50
+ const lifecycles = ["pending", "success", "error", "done"];
51
+ lifecycles.forEach((lifecycle) => {
52
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)(`lvt-reset-on:${lifecycle}`, "");
53
+ expect(result?.lifecycle).toBe(lifecycle);
54
+ });
55
+ });
56
+ it("parses all action types", () => {
57
+ const actions = [
58
+ "reset",
59
+ "disable",
60
+ "enable",
61
+ "addClass",
62
+ "removeClass",
63
+ "toggleClass",
64
+ "setAttr",
65
+ "toggleAttr",
66
+ ];
67
+ actions.forEach((action) => {
68
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)(`lvt-${action}-on:success`, "value");
69
+ expect(result?.action).toBe(action);
70
+ });
71
+ });
72
+ it("handles action names with hyphens", () => {
73
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:create-new-todo:success", "");
74
+ expect(result).toEqual({
75
+ action: "reset",
76
+ lifecycle: "success",
77
+ actionName: "create-new-todo",
78
+ param: undefined,
79
+ });
80
+ });
81
+ it("handles action names with colons", () => {
82
+ const result = (0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:todos:create:success", "");
83
+ expect(result).toEqual({
84
+ action: "reset",
85
+ lifecycle: "success",
86
+ actionName: "todos:create",
87
+ param: undefined,
88
+ });
89
+ });
90
+ });
91
+ describe("invalid attribute parsing", () => {
92
+ it("returns null for non-reactive attributes", () => {
93
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-click", "action")).toBeNull();
94
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-submit", "save")).toBeNull();
95
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("class", "foo")).toBeNull();
96
+ });
97
+ it("returns null for unknown actions", () => {
98
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-foo-on:success", "")).toBeNull();
99
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-hide-on:pending", "")).toBeNull();
100
+ });
101
+ it("returns null for unknown lifecycle events", () => {
102
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:loading", "")).toBeNull();
103
+ expect((0, reactive_attributes_1.parseReactiveAttribute)("lvt-reset-on:complete", "")).toBeNull();
104
+ });
105
+ });
106
+ });
107
+ describe("executeAction", () => {
108
+ describe("reset", () => {
109
+ it("resets a form", () => {
110
+ const form = document.createElement("form");
111
+ const input = document.createElement("input");
112
+ input.name = "title";
113
+ input.value = "test value";
114
+ form.appendChild(input);
115
+ document.body.appendChild(form);
116
+ (0, reactive_attributes_1.executeAction)(form, "reset");
117
+ expect(input.value).toBe("");
118
+ });
119
+ it("does nothing for non-form elements", () => {
120
+ const div = document.createElement("div");
121
+ document.body.appendChild(div);
122
+ // Should not throw
123
+ (0, reactive_attributes_1.executeAction)(div, "reset");
124
+ });
125
+ });
126
+ describe("disable/enable", () => {
127
+ it("disables a button", () => {
128
+ const button = document.createElement("button");
129
+ document.body.appendChild(button);
130
+ (0, reactive_attributes_1.executeAction)(button, "disable");
131
+ expect(button.disabled).toBe(true);
132
+ });
133
+ it("enables a button", () => {
134
+ const button = document.createElement("button");
135
+ button.disabled = true;
136
+ document.body.appendChild(button);
137
+ (0, reactive_attributes_1.executeAction)(button, "enable");
138
+ expect(button.disabled).toBe(false);
139
+ });
140
+ it("disables an input", () => {
141
+ const input = document.createElement("input");
142
+ document.body.appendChild(input);
143
+ (0, reactive_attributes_1.executeAction)(input, "disable");
144
+ expect(input.disabled).toBe(true);
145
+ });
146
+ it("enables an input", () => {
147
+ const input = document.createElement("input");
148
+ input.disabled = true;
149
+ document.body.appendChild(input);
150
+ (0, reactive_attributes_1.executeAction)(input, "enable");
151
+ expect(input.disabled).toBe(false);
152
+ });
153
+ });
154
+ describe("addClass", () => {
155
+ it("adds a single class", () => {
156
+ const div = document.createElement("div");
157
+ document.body.appendChild(div);
158
+ (0, reactive_attributes_1.executeAction)(div, "addClass", "loading");
159
+ expect(div.classList.contains("loading")).toBe(true);
160
+ });
161
+ it("adds multiple classes", () => {
162
+ const div = document.createElement("div");
163
+ document.body.appendChild(div);
164
+ (0, reactive_attributes_1.executeAction)(div, "addClass", "loading opacity-50 cursor-wait");
165
+ expect(div.classList.contains("loading")).toBe(true);
166
+ expect(div.classList.contains("opacity-50")).toBe(true);
167
+ expect(div.classList.contains("cursor-wait")).toBe(true);
168
+ });
169
+ it("does nothing without param", () => {
170
+ const div = document.createElement("div");
171
+ document.body.appendChild(div);
172
+ (0, reactive_attributes_1.executeAction)(div, "addClass");
173
+ expect(div.className).toBe("");
174
+ });
175
+ });
176
+ describe("removeClass", () => {
177
+ it("removes a single class", () => {
178
+ const div = document.createElement("div");
179
+ div.className = "loading active";
180
+ document.body.appendChild(div);
181
+ (0, reactive_attributes_1.executeAction)(div, "removeClass", "loading");
182
+ expect(div.classList.contains("loading")).toBe(false);
183
+ expect(div.classList.contains("active")).toBe(true);
184
+ });
185
+ it("removes multiple classes", () => {
186
+ const div = document.createElement("div");
187
+ div.className = "loading opacity-50 active";
188
+ document.body.appendChild(div);
189
+ (0, reactive_attributes_1.executeAction)(div, "removeClass", "loading opacity-50");
190
+ expect(div.classList.contains("loading")).toBe(false);
191
+ expect(div.classList.contains("opacity-50")).toBe(false);
192
+ expect(div.classList.contains("active")).toBe(true);
193
+ });
194
+ });
195
+ describe("toggleClass", () => {
196
+ it("toggles class on", () => {
197
+ const div = document.createElement("div");
198
+ document.body.appendChild(div);
199
+ (0, reactive_attributes_1.executeAction)(div, "toggleClass", "active");
200
+ expect(div.classList.contains("active")).toBe(true);
201
+ });
202
+ it("toggles class off", () => {
203
+ const div = document.createElement("div");
204
+ div.className = "active";
205
+ document.body.appendChild(div);
206
+ (0, reactive_attributes_1.executeAction)(div, "toggleClass", "active");
207
+ expect(div.classList.contains("active")).toBe(false);
208
+ });
209
+ it("toggles multiple classes", () => {
210
+ const div = document.createElement("div");
211
+ div.className = "active";
212
+ document.body.appendChild(div);
213
+ (0, reactive_attributes_1.executeAction)(div, "toggleClass", "active hidden");
214
+ expect(div.classList.contains("active")).toBe(false);
215
+ expect(div.classList.contains("hidden")).toBe(true);
216
+ });
217
+ });
218
+ describe("setAttr", () => {
219
+ it("sets an attribute", () => {
220
+ const div = document.createElement("div");
221
+ document.body.appendChild(div);
222
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "aria-busy:true");
223
+ expect(div.getAttribute("aria-busy")).toBe("true");
224
+ });
225
+ it("sets attribute with empty value", () => {
226
+ const div = document.createElement("div");
227
+ document.body.appendChild(div);
228
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "data-loading:");
229
+ expect(div.getAttribute("data-loading")).toBe("");
230
+ });
231
+ it("handles value with colons", () => {
232
+ const div = document.createElement("div");
233
+ document.body.appendChild(div);
234
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "data-url:https://example.com");
235
+ expect(div.getAttribute("data-url")).toBe("https://example.com");
236
+ });
237
+ it("does nothing without colon separator", () => {
238
+ const div = document.createElement("div");
239
+ document.body.appendChild(div);
240
+ (0, reactive_attributes_1.executeAction)(div, "setAttr", "invalidformat");
241
+ expect(div.attributes.length).toBe(0);
242
+ });
243
+ });
244
+ describe("toggleAttr", () => {
245
+ it("adds boolean attribute", () => {
246
+ const input = document.createElement("input");
247
+ document.body.appendChild(input);
248
+ (0, reactive_attributes_1.executeAction)(input, "toggleAttr", "readonly");
249
+ expect(input.hasAttribute("readonly")).toBe(true);
250
+ });
251
+ it("removes boolean attribute", () => {
252
+ const input = document.createElement("input");
253
+ input.setAttribute("readonly", "");
254
+ document.body.appendChild(input);
255
+ (0, reactive_attributes_1.executeAction)(input, "toggleAttr", "readonly");
256
+ expect(input.hasAttribute("readonly")).toBe(false);
257
+ });
258
+ it("toggles hidden attribute", () => {
259
+ const div = document.createElement("div");
260
+ div.hidden = true;
261
+ document.body.appendChild(div);
262
+ (0, reactive_attributes_1.executeAction)(div, "toggleAttr", "hidden");
263
+ expect(div.hidden).toBe(false);
264
+ (0, reactive_attributes_1.executeAction)(div, "toggleAttr", "hidden");
265
+ expect(div.hidden).toBe(true);
266
+ });
267
+ });
268
+ });
269
+ describe("matchesEvent", () => {
270
+ it("matches global binding to any action", () => {
271
+ const binding = {
272
+ action: "reset",
273
+ lifecycle: "success",
274
+ };
275
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "create-todo")).toBe(true);
276
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "delete-todo")).toBe(true);
277
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success")).toBe(true);
278
+ });
279
+ it("matches action-specific binding only to that action", () => {
280
+ const binding = {
281
+ action: "reset",
282
+ lifecycle: "success",
283
+ actionName: "create-todo",
284
+ };
285
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "create-todo")).toBe(true);
286
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success", "delete-todo")).toBe(false);
287
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "success")).toBe(false);
288
+ });
289
+ it("does not match different lifecycle events", () => {
290
+ const binding = {
291
+ action: "reset",
292
+ lifecycle: "success",
293
+ };
294
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "pending", "create-todo")).toBe(false);
295
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "error", "create-todo")).toBe(false);
296
+ expect((0, reactive_attributes_1.matchesEvent)(binding, "done", "create-todo")).toBe(false);
297
+ });
298
+ });
299
+ describe("processReactiveAttributes", () => {
300
+ it("processes global success bindings", () => {
301
+ const form = document.createElement("form");
302
+ form.setAttribute("lvt-reset-on:success", "");
303
+ const input = document.createElement("input");
304
+ input.name = "title";
305
+ input.value = "test";
306
+ form.appendChild(input);
307
+ document.body.appendChild(form);
308
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "any-action");
309
+ expect(input.value).toBe("");
310
+ });
311
+ it("processes action-specific bindings", () => {
312
+ const form = document.createElement("form");
313
+ form.setAttribute("lvt-reset-on:create-todo:success", "");
314
+ const input = document.createElement("input");
315
+ input.name = "title";
316
+ input.value = "test";
317
+ form.appendChild(input);
318
+ document.body.appendChild(form);
319
+ // Should not reset for different action
320
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "delete-todo");
321
+ expect(input.value).toBe("test");
322
+ // Should reset for matching action
323
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "create-todo");
324
+ expect(input.value).toBe("");
325
+ });
326
+ it("processes multiple bindings on same element", () => {
327
+ const button = document.createElement("button");
328
+ button.setAttribute("lvt-disable-on:pending", "");
329
+ button.setAttribute("lvt-addClass-on:pending", "loading");
330
+ document.body.appendChild(button);
331
+ (0, reactive_attributes_1.processReactiveAttributes)("pending", "save");
332
+ expect(button.disabled).toBe(true);
333
+ expect(button.classList.contains("loading")).toBe(true);
334
+ });
335
+ it("processes bindings on multiple elements", () => {
336
+ const form = document.createElement("form");
337
+ form.setAttribute("lvt-reset-on:success", "");
338
+ const input = document.createElement("input");
339
+ input.value = "test";
340
+ form.appendChild(input);
341
+ const button = document.createElement("button");
342
+ button.disabled = true;
343
+ button.setAttribute("lvt-enable-on:success", "");
344
+ document.body.appendChild(form);
345
+ document.body.appendChild(button);
346
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "save");
347
+ expect(input.value).toBe("");
348
+ expect(button.disabled).toBe(false);
349
+ });
350
+ it("ignores bindings for different lifecycles", () => {
351
+ const button = document.createElement("button");
352
+ button.setAttribute("lvt-disable-on:pending", "");
353
+ document.body.appendChild(button);
354
+ (0, reactive_attributes_1.processReactiveAttributes)("success", "save");
355
+ expect(button.disabled).toBe(false);
356
+ });
357
+ });
358
+ describe("setupReactiveAttributeListeners", () => {
359
+ it("sets up listeners for all lifecycle events", () => {
360
+ (0, reactive_attributes_1.setupReactiveAttributeListeners)();
361
+ const button = document.createElement("button");
362
+ button.setAttribute("lvt-disable-on:pending", "");
363
+ button.setAttribute("lvt-enable-on:done", "");
364
+ document.body.appendChild(button);
365
+ // Simulate pending event
366
+ document.dispatchEvent(new CustomEvent("lvt:pending", {
367
+ detail: { action: "save" },
368
+ bubbles: true,
369
+ }));
370
+ expect(button.disabled).toBe(true);
371
+ // Simulate done event
372
+ document.dispatchEvent(new CustomEvent("lvt:done", {
373
+ detail: { action: "save" },
374
+ bubbles: true,
375
+ }));
376
+ expect(button.disabled).toBe(false);
377
+ });
378
+ it("handles events without action name", () => {
379
+ (0, reactive_attributes_1.setupReactiveAttributeListeners)();
380
+ const div = document.createElement("div");
381
+ div.setAttribute("lvt-addClass-on:success", "success-state");
382
+ document.body.appendChild(div);
383
+ // Event without action in detail
384
+ document.dispatchEvent(new CustomEvent("lvt:success", {
385
+ detail: {},
386
+ bubbles: true,
387
+ }));
388
+ // Global binding should still work
389
+ expect(div.classList.contains("success-state")).toBe(true);
390
+ });
391
+ });
392
+ });
393
+ //# sourceMappingURL=reactive-attributes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive-attributes.test.js","sourceRoot":"","sources":["../../tests/reactive-attributes.test.ts"],"names":[],"mappings":"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"}
@@ -169,7 +169,19 @@ describe('Conditional Rendering Debug Tests', () => {
169
169
  name: 'Empty object',
170
170
  value: {},
171
171
  shouldBeTree: false,
172
- expectedHTML: '[object Object]' // Will fail, but documents behavior
172
+ expectedHTML: '' // Empty object renders as empty string now
173
+ },
174
+ {
175
+ name: 'Object with only numeric keys (dynamics without statics)',
176
+ value: { "0": "dynamic value" },
177
+ shouldBeTree: false,
178
+ expectedHTML: 'dynamic value' // Should render the dynamic values directly
179
+ },
180
+ {
181
+ name: 'Object with multiple numeric keys',
182
+ value: { "0": "first", "1": "second" },
183
+ shouldBeTree: false,
184
+ expectedHTML: 'firstsecond' // Should concatenate values in order
173
185
  }
174
186
  ];
175
187
  testCases.forEach(testCase => {