@livetemplate/client 0.1.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 (100) hide show
  1. package/README.md +179 -0
  2. package/dist/constants.d.ts +2 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +19 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/dom/directives.d.ts +13 -0
  7. package/dist/dom/directives.d.ts.map +1 -0
  8. package/dist/dom/directives.js +137 -0
  9. package/dist/dom/directives.js.map +1 -0
  10. package/dist/dom/event-delegation.d.ts +24 -0
  11. package/dist/dom/event-delegation.d.ts.map +1 -0
  12. package/dist/dom/event-delegation.js +437 -0
  13. package/dist/dom/event-delegation.js.map +1 -0
  14. package/dist/dom/focus-manager.d.ts +19 -0
  15. package/dist/dom/focus-manager.d.ts.map +1 -0
  16. package/dist/dom/focus-manager.js +144 -0
  17. package/dist/dom/focus-manager.js.map +1 -0
  18. package/dist/dom/form-disabler.d.ts +8 -0
  19. package/dist/dom/form-disabler.d.ts.map +1 -0
  20. package/dist/dom/form-disabler.js +32 -0
  21. package/dist/dom/form-disabler.js.map +1 -0
  22. package/dist/dom/loading-indicator.d.ts +9 -0
  23. package/dist/dom/loading-indicator.d.ts.map +1 -0
  24. package/dist/dom/loading-indicator.js +50 -0
  25. package/dist/dom/loading-indicator.js.map +1 -0
  26. package/dist/dom/modal-manager.d.ts +11 -0
  27. package/dist/dom/modal-manager.d.ts.map +1 -0
  28. package/dist/dom/modal-manager.js +62 -0
  29. package/dist/dom/modal-manager.js.map +1 -0
  30. package/dist/dom/observer-manager.d.ts +19 -0
  31. package/dist/dom/observer-manager.d.ts.map +1 -0
  32. package/dist/dom/observer-manager.js +64 -0
  33. package/dist/dom/observer-manager.js.map +1 -0
  34. package/dist/livetemplate-client.browser.js +44 -0
  35. package/dist/livetemplate-client.browser.js.map +7 -0
  36. package/dist/livetemplate-client.d.ts +106 -0
  37. package/dist/livetemplate-client.d.ts.map +1 -0
  38. package/dist/livetemplate-client.js +507 -0
  39. package/dist/livetemplate-client.js.map +1 -0
  40. package/dist/state/form-lifecycle-manager.d.ts +19 -0
  41. package/dist/state/form-lifecycle-manager.d.ts.map +1 -0
  42. package/dist/state/form-lifecycle-manager.js +64 -0
  43. package/dist/state/form-lifecycle-manager.js.map +1 -0
  44. package/dist/state/tree-renderer.d.ts +27 -0
  45. package/dist/state/tree-renderer.d.ts.map +1 -0
  46. package/dist/state/tree-renderer.js +359 -0
  47. package/dist/state/tree-renderer.js.map +1 -0
  48. package/dist/tests/event-delegation.test.d.ts +2 -0
  49. package/dist/tests/event-delegation.test.d.ts.map +1 -0
  50. package/dist/tests/event-delegation.test.js +102 -0
  51. package/dist/tests/event-delegation.test.js.map +1 -0
  52. package/dist/tests/focus-manager.test.d.ts +2 -0
  53. package/dist/tests/focus-manager.test.d.ts.map +1 -0
  54. package/dist/tests/focus-manager.test.js +45 -0
  55. package/dist/tests/focus-manager.test.js.map +1 -0
  56. package/dist/tests/form-disabler.test.d.ts +2 -0
  57. package/dist/tests/form-disabler.test.d.ts.map +1 -0
  58. package/dist/tests/form-disabler.test.js +35 -0
  59. package/dist/tests/form-disabler.test.js.map +1 -0
  60. package/dist/tests/form-lifecycle-manager.test.d.ts +2 -0
  61. package/dist/tests/form-lifecycle-manager.test.d.ts.map +1 -0
  62. package/dist/tests/form-lifecycle-manager.test.js +90 -0
  63. package/dist/tests/form-lifecycle-manager.test.js.map +1 -0
  64. package/dist/tests/modal-manager.test.d.ts +2 -0
  65. package/dist/tests/modal-manager.test.d.ts.map +1 -0
  66. package/dist/tests/modal-manager.test.js +80 -0
  67. package/dist/tests/modal-manager.test.js.map +1 -0
  68. package/dist/tests/rate-limit.test.d.ts +2 -0
  69. package/dist/tests/rate-limit.test.d.ts.map +1 -0
  70. package/dist/tests/rate-limit.test.js +38 -0
  71. package/dist/tests/rate-limit.test.js.map +1 -0
  72. package/dist/tests/test-conditional-debug.test.d.ts +8 -0
  73. package/dist/tests/test-conditional-debug.test.d.ts.map +1 -0
  74. package/dist/tests/test-conditional-debug.test.js +187 -0
  75. package/dist/tests/test-conditional-debug.test.js.map +1 -0
  76. package/dist/tests/test-reconstruction.test.d.ts +8 -0
  77. package/dist/tests/test-reconstruction.test.d.ts.map +1 -0
  78. package/dist/tests/test-reconstruction.test.js +284 -0
  79. package/dist/tests/test-reconstruction.test.js.map +1 -0
  80. package/dist/transport/websocket.d.ts +62 -0
  81. package/dist/transport/websocket.d.ts.map +1 -0
  82. package/dist/transport/websocket.js +194 -0
  83. package/dist/transport/websocket.js.map +1 -0
  84. package/dist/types.d.ts +34 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +3 -0
  87. package/dist/types.js.map +1 -0
  88. package/dist/utils/logger.d.ts +32 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +77 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/dist/utils/rate-limit.d.ts +10 -0
  93. package/dist/utils/rate-limit.d.ts.map +1 -0
  94. package/dist/utils/rate-limit.js +37 -0
  95. package/dist/utils/rate-limit.js.map +1 -0
  96. package/dist/utils/testing.d.ts +14 -0
  97. package/dist/utils/testing.d.ts.map +1 -0
  98. package/dist/utils/testing.js +51 -0
  99. package/dist/utils/testing.js.map +1 -0
  100. package/package.json +57 -0
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ /**
3
+ * LiveTemplate TypeScript Client
4
+ *
5
+ * Reconstructs HTML from tree-based updates using cached static structure,
6
+ * following the Phoenix LiveView optimization approach.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LiveTemplateClient = exports.compareHTML = exports.loadAndApplyUpdate = void 0;
13
+ const morphdom_1 = __importDefault(require("morphdom"));
14
+ const focus_manager_1 = require("./dom/focus-manager");
15
+ const directives_1 = require("./dom/directives");
16
+ const event_delegation_1 = require("./dom/event-delegation");
17
+ const observer_manager_1 = require("./dom/observer-manager");
18
+ const modal_manager_1 = require("./dom/modal-manager");
19
+ const loading_indicator_1 = require("./dom/loading-indicator");
20
+ const form_disabler_1 = require("./dom/form-disabler");
21
+ const tree_renderer_1 = require("./state/tree-renderer");
22
+ const form_lifecycle_manager_1 = require("./state/form-lifecycle-manager");
23
+ const websocket_1 = require("./transport/websocket");
24
+ const logger_1 = require("./utils/logger");
25
+ var testing_1 = require("./utils/testing");
26
+ Object.defineProperty(exports, "loadAndApplyUpdate", { enumerable: true, get: function () { return testing_1.loadAndApplyUpdate; } });
27
+ Object.defineProperty(exports, "compareHTML", { enumerable: true, get: function () { return testing_1.compareHTML; } });
28
+ class LiveTemplateClient {
29
+ constructor(options = {}) {
30
+ this.lvtId = null;
31
+ this.ws = null;
32
+ this.wrapperElement = null;
33
+ this.useHTTP = false; // True when WebSocket is unavailable
34
+ this.sessionCookie = null; // For HTTP mode session tracking
35
+ // Rate limiting: cache of debounced/throttled handlers per element+eventType
36
+ this.rateLimitedHandlers = new WeakMap();
37
+ // Initialization tracking for loading indicator
38
+ this.isInitialized = false;
39
+ // Message tracking for deterministic E2E testing
40
+ this.messageCount = 0;
41
+ const { logger: providedLogger, logLevel, debug, ...restOptions } = options;
42
+ const resolvedLevel = logLevel ?? (debug ? "debug" : "info");
43
+ const baseLogger = providedLogger ?? (0, logger_1.createLogger)({ level: resolvedLevel });
44
+ if (providedLogger) {
45
+ if (logLevel) {
46
+ providedLogger.setLevel(logLevel);
47
+ }
48
+ else if (debug) {
49
+ providedLogger.setLevel("debug");
50
+ }
51
+ }
52
+ else {
53
+ baseLogger.setLevel(resolvedLevel);
54
+ }
55
+ this.logger = baseLogger.child("Client");
56
+ this.options = {
57
+ autoReconnect: false, // Disable autoReconnect by default to avoid connection loops
58
+ reconnectDelay: 1000,
59
+ liveUrl: window.location.pathname, // Connect to current page
60
+ ...restOptions,
61
+ };
62
+ this.treeRenderer = new tree_renderer_1.TreeRenderer(this.logger.child("TreeRenderer"));
63
+ this.focusManager = new focus_manager_1.FocusManager(this.logger.child("FocusManager"));
64
+ this.modalManager = new modal_manager_1.ModalManager(this.logger.child("ModalManager"));
65
+ this.formLifecycleManager = new form_lifecycle_manager_1.FormLifecycleManager(this.modalManager);
66
+ this.loadingIndicator = new loading_indicator_1.LoadingIndicator();
67
+ this.formDisabler = new form_disabler_1.FormDisabler();
68
+ this.eventDelegator = new event_delegation_1.EventDelegator({
69
+ getWrapperElement: () => this.wrapperElement,
70
+ getRateLimitedHandlers: () => this.rateLimitedHandlers,
71
+ parseValue: (value) => this.parseValue(value),
72
+ send: (message) => this.send(message),
73
+ setActiveSubmission: (form, button, originalButtonText) => this.formLifecycleManager.setActiveSubmission(form, button, originalButtonText),
74
+ openModal: (modalId) => this.modalManager.open(modalId),
75
+ closeModal: (modalId) => this.modalManager.close(modalId),
76
+ getWebSocketReadyState: () => this.webSocketManager.getReadyState(),
77
+ }, this.logger.child("EventDelegator"));
78
+ this.observerManager = new observer_manager_1.ObserverManager({
79
+ getWrapperElement: () => this.wrapperElement,
80
+ send: (message) => this.send(message),
81
+ }, this.logger.child("ObserverManager"));
82
+ this.webSocketManager = new websocket_1.WebSocketManager({
83
+ options: this.options,
84
+ logger: this.logger.child("Transport"),
85
+ onConnected: () => {
86
+ this.ws = this.webSocketManager.getSocket();
87
+ this.logger.info("WebSocket connected");
88
+ this.options.onConnect?.();
89
+ this.wrapperElement?.dispatchEvent(new Event("lvt:connected"));
90
+ },
91
+ onDisconnected: () => {
92
+ this.ws = null;
93
+ this.logger.info("WebSocket disconnected");
94
+ this.options.onDisconnect?.();
95
+ this.wrapperElement?.dispatchEvent(new Event("lvt:disconnected"));
96
+ },
97
+ onMessage: (response, event) => {
98
+ this.handleWebSocketPayload(response, event);
99
+ },
100
+ onReconnectAttempt: () => {
101
+ this.logger.info("Attempting to reconnect...");
102
+ },
103
+ onError: (error) => {
104
+ this.logger.error("WebSocket error:", error);
105
+ this.options.onError?.(error);
106
+ },
107
+ });
108
+ }
109
+ /**
110
+ * Auto-initialize when DOM is ready
111
+ * Called automatically when script loads
112
+ */
113
+ static autoInit() {
114
+ const autoInitLogger = (0, logger_1.createLogger)({ scope: "Client:autoInit" });
115
+ const init = () => {
116
+ const wrapper = document.querySelector("[data-lvt-id]");
117
+ if (wrapper) {
118
+ const client = new LiveTemplateClient();
119
+ client.wrapperElement = wrapper;
120
+ // Check if loading indicator should be shown
121
+ const shouldShowLoading = wrapper.getAttribute("data-lvt-loading") === "true";
122
+ if (shouldShowLoading) {
123
+ client.loadingIndicator.show();
124
+ client.formDisabler.disable(client.wrapperElement);
125
+ }
126
+ client.connect().catch((error) => {
127
+ autoInitLogger.error("Auto-initialization connect failed:", error);
128
+ });
129
+ // Expose as global for programmatic access
130
+ window.liveTemplateClient = client;
131
+ }
132
+ };
133
+ // Initialize when DOM is ready
134
+ if (document.readyState === "loading") {
135
+ document.addEventListener("DOMContentLoaded", init);
136
+ }
137
+ else {
138
+ init();
139
+ }
140
+ }
141
+ /**
142
+ * Handle server-sent updates delivered via WebSocket or HTTP fallback.
143
+ */
144
+ handleWebSocketPayload(response, event) {
145
+ if (event) {
146
+ window.__lastWSMessage = event.data;
147
+ if (!window.__wsMessages) {
148
+ window.__wsMessages = [];
149
+ }
150
+ window.__wsMessages.push(response);
151
+ }
152
+ if (!this.isInitialized) {
153
+ this.loadingIndicator.hide();
154
+ this.formDisabler.enable(this.wrapperElement);
155
+ if (this.wrapperElement &&
156
+ this.wrapperElement.hasAttribute("data-lvt-loading")) {
157
+ this.wrapperElement.removeAttribute("data-lvt-loading");
158
+ }
159
+ this.isInitialized = true;
160
+ }
161
+ if (this.wrapperElement) {
162
+ this.updateDOM(this.wrapperElement, response.tree, response.meta);
163
+ this.messageCount++;
164
+ window.__wsMessageCount = this.messageCount;
165
+ this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated", {
166
+ detail: {
167
+ messageCount: this.messageCount,
168
+ action: response.meta?.action,
169
+ success: response.meta?.success,
170
+ },
171
+ }));
172
+ }
173
+ }
174
+ /**
175
+ * Connect to WebSocket and start receiving updates
176
+ * @param wrapperSelector - CSS selector for the LiveTemplate wrapper (defaults to '[data-lvt-id]')
177
+ */
178
+ async connect(wrapperSelector = "[data-lvt-id]") {
179
+ // Find the wrapper element
180
+ this.wrapperElement = document.querySelector(wrapperSelector);
181
+ if (!this.wrapperElement) {
182
+ throw new Error(`LiveTemplate wrapper not found with selector: ${wrapperSelector}`);
183
+ }
184
+ this.webSocketManager.disconnect();
185
+ const connectionResult = await this.webSocketManager.connect();
186
+ this.useHTTP = !connectionResult.usingWebSocket;
187
+ if (this.useHTTP) {
188
+ this.ws = null;
189
+ this.logger.info("WebSocket not available, using HTTP mode");
190
+ this.options.onConnect?.();
191
+ if (connectionResult.initialState && this.wrapperElement) {
192
+ this.handleWebSocketPayload(connectionResult.initialState);
193
+ }
194
+ }
195
+ // Set up event delegation for lvt-* attributes
196
+ this.eventDelegator.setupEventDelegation();
197
+ // Set up window-* event delegation
198
+ this.eventDelegator.setupWindowEventDelegation();
199
+ // Set up click-away delegation
200
+ this.eventDelegator.setupClickAwayDelegation();
201
+ // Set up modal delegation
202
+ this.eventDelegator.setupModalDelegation();
203
+ // Initialize focus tracking
204
+ this.focusManager.attach(this.wrapperElement);
205
+ // Set up infinite scroll observers
206
+ this.observerManager.setupInfiniteScrollObserver();
207
+ this.observerManager.setupInfiniteScrollMutationObserver();
208
+ }
209
+ /**
210
+ * Disconnect from WebSocket
211
+ */
212
+ disconnect() {
213
+ this.webSocketManager.disconnect();
214
+ this.ws = null;
215
+ this.useHTTP = false;
216
+ this.observerManager.teardown();
217
+ this.formLifecycleManager.reset();
218
+ this.loadingIndicator.hide();
219
+ this.formDisabler.enable(this.wrapperElement);
220
+ }
221
+ /**
222
+ * Determine whether the client finished its initial load and has an active transport.
223
+ */
224
+ isReady() {
225
+ const wrapper = this.wrapperElement;
226
+ if (!wrapper || wrapper.hasAttribute("data-lvt-loading")) {
227
+ return false;
228
+ }
229
+ if (this.useHTTP) {
230
+ return true;
231
+ }
232
+ const readyState = this.webSocketManager.getReadyState();
233
+ return readyState === WebSocket.OPEN;
234
+ }
235
+ /**
236
+ * Send a message to the server via WebSocket or HTTP
237
+ * @param message - Message to send (will be JSON stringified)
238
+ */
239
+ send(message) {
240
+ // Debug flag for testing
241
+ window.__lvtSendCalled = true;
242
+ window.__lvtMessageAction = message?.action;
243
+ const readyState = this.webSocketManager.getReadyState();
244
+ if (this.logger.isDebugEnabled()) {
245
+ this.logger.debug("send() invoked", {
246
+ message,
247
+ useHTTP: this.useHTTP,
248
+ hasWebSocket: readyState !== undefined,
249
+ readyState,
250
+ });
251
+ }
252
+ if (this.useHTTP) {
253
+ // HTTP mode: send via POST and handle response
254
+ this.logger.debug("Using HTTP mode for send");
255
+ window.__lvtSendPath = "http";
256
+ this.sendHTTP(message);
257
+ }
258
+ else if (readyState === WebSocket.OPEN) {
259
+ // WebSocket mode
260
+ this.logger.debug("Sending via WebSocket");
261
+ window.__lvtSendPath = "websocket";
262
+ window.__lvtWSMessage = JSON.stringify(message);
263
+ this.webSocketManager.send(JSON.stringify(message));
264
+ this.logger.debug("WebSocket send complete");
265
+ window.__lvtWSSendComplete = true;
266
+ }
267
+ else if (readyState !== undefined) {
268
+ // WebSocket is connecting or closing, fall back to HTTP temporarily
269
+ this.logger.warn(`WebSocket not ready (state: ${readyState}), using HTTP fallback`);
270
+ window.__lvtSendPath = "http-fallback";
271
+ this.sendHTTP(message);
272
+ }
273
+ else {
274
+ this.logger.error("No transport available");
275
+ window.__lvtSendPath = "no-transport";
276
+ }
277
+ }
278
+ /**
279
+ * Send action via HTTP POST
280
+ */
281
+ async sendHTTP(message) {
282
+ try {
283
+ const liveUrl = this.options.liveUrl || "/live";
284
+ const response = await fetch(liveUrl, {
285
+ method: "POST",
286
+ credentials: "include", // Include cookies for session
287
+ headers: {
288
+ "Content-Type": "application/json",
289
+ Accept: "application/json",
290
+ },
291
+ body: JSON.stringify(message),
292
+ });
293
+ if (!response.ok) {
294
+ throw new Error(`HTTP request failed: ${response.status}`);
295
+ }
296
+ // Handle the update response
297
+ const updateResponse = await response.json();
298
+ if (this.wrapperElement) {
299
+ this.updateDOM(this.wrapperElement, updateResponse.tree, updateResponse.meta);
300
+ }
301
+ }
302
+ catch (error) {
303
+ this.logger.error("Failed to send HTTP request:", error);
304
+ }
305
+ }
306
+ /**
307
+ * Parse a string value into appropriate type (number, boolean, or string)
308
+ * @param value - String value to parse
309
+ * @returns Parsed value with correct type
310
+ */
311
+ parseValue(value) {
312
+ // Try to parse as number
313
+ const num = parseFloat(value);
314
+ if (!isNaN(num) && value.trim() === num.toString()) {
315
+ return num;
316
+ }
317
+ // Try to parse as boolean
318
+ if (value === "true")
319
+ return true;
320
+ if (value === "false")
321
+ return false;
322
+ // Return as string
323
+ return value;
324
+ }
325
+ /**
326
+ * Apply an update to the current state and reconstruct HTML
327
+ * @param update - Tree update object from LiveTemplate server
328
+ * @returns Reconstructed HTML and whether anything changed
329
+ */
330
+ applyUpdate(update) {
331
+ return this.treeRenderer.applyUpdate(update);
332
+ }
333
+ /**
334
+ * Apply updates to existing HTML using morphdom for efficient DOM updates
335
+ * @param existingHTML - Current full HTML document
336
+ * @param update - Tree update object from LiveTemplate server
337
+ * @returns Updated HTML content
338
+ */
339
+ applyUpdateToHTML(existingHTML, update) {
340
+ // Apply the update to our internal state
341
+ const result = this.applyUpdate(update);
342
+ // Extract lvt-id from existing HTML if we don't have it
343
+ if (!this.lvtId) {
344
+ const match = existingHTML.match(/data-lvt-id="([^"]+)"/);
345
+ if (match) {
346
+ this.lvtId = match[1];
347
+ }
348
+ }
349
+ // The new tree includes complete HTML structure, so we can reconstruct properly
350
+ const innerContent = result.html;
351
+ // Find where to insert the reconstructed content
352
+ const bodyMatch = existingHTML.match(/<body>([\s\S]*?)<\/body>/);
353
+ if (!bodyMatch) {
354
+ return existingHTML;
355
+ }
356
+ // Replace the body content with our reconstructed HTML
357
+ // We need to preserve the wrapper div with data-lvt-id
358
+ const wrapperStart = `<div data-lvt-id="${this.lvtId || "lvt-unknown"}">`;
359
+ const wrapperEnd = "</div>";
360
+ const newBodyContent = wrapperStart + innerContent + wrapperEnd;
361
+ return existingHTML.replace(/<body>[\s\S]*?<\/body>/, `<body>${newBodyContent}</body>`);
362
+ }
363
+ /**
364
+ * Update a live DOM element with new tree data
365
+ * @param element - DOM element containing the LiveTemplate content (the wrapper div)
366
+ * @param update - Tree update object from LiveTemplate server
367
+ * @param meta - Optional metadata about the update (action, success, errors)
368
+ */
369
+ updateDOM(element, update, meta) {
370
+ // Apply update to internal state and get reconstructed HTML
371
+ const result = this.applyUpdate(update);
372
+ // Helper to recursively check if there are any statics in the tree
373
+ const hasStaticsInTree = (node) => {
374
+ if (!node || typeof node !== "object")
375
+ return false;
376
+ if (node.s && Array.isArray(node.s))
377
+ return true;
378
+ return Object.values(node).some((v) => hasStaticsInTree(v));
379
+ };
380
+ if (!result.changed && !hasStaticsInTree(update)) {
381
+ // No changes detected and no statics in update, skip morphdom
382
+ return;
383
+ }
384
+ // Create a temporary wrapper to hold the new content
385
+ // We need to create a DOM element of the same type as 'element' to avoid browser HTML corrections
386
+ // For example, if we put <tr> elements in a <div>, the browser strips them out
387
+ const tempWrapper = document.createElement(element.tagName);
388
+ if (this.logger.isDebugEnabled()) {
389
+ this.logger.debug("[updateDOM] element.tagName:", element.tagName);
390
+ this.logger.debug("[updateDOM] result.html (first 500 chars):", result.html.substring(0, 500));
391
+ this.logger.debug("[updateDOM] Has <table> tag:", result.html.includes("<table>"));
392
+ this.logger.debug("[updateDOM] Has <tbody> tag:", result.html.includes("<tbody>"));
393
+ this.logger.debug("[updateDOM] Has <tr> tag:", result.html.includes("<tr"));
394
+ }
395
+ tempWrapper.innerHTML = result.html;
396
+ if (this.logger.isDebugEnabled()) {
397
+ this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):", tempWrapper.innerHTML.substring(0, 500));
398
+ this.logger.debug("[updateDOM] tempWrapper has <table>:", tempWrapper.innerHTML.includes("<table>"));
399
+ this.logger.debug("[updateDOM] tempWrapper has <tbody>:", tempWrapper.innerHTML.includes("<tbody>"));
400
+ this.logger.debug("[updateDOM] tempWrapper has <tr>:", tempWrapper.innerHTML.includes("<tr"));
401
+ }
402
+ // Use morphdom to efficiently update the element
403
+ (0, morphdom_1.default)(element, tempWrapper, {
404
+ childrenOnly: true, // Only update children, preserve the wrapper element itself
405
+ getNodeKey: (node) => {
406
+ // Use data-key or data-lvt-key for efficient reconciliation
407
+ if (node.nodeType === 1) {
408
+ return (node.getAttribute("data-key") ||
409
+ node.getAttribute("data-lvt-key") ||
410
+ undefined);
411
+ }
412
+ },
413
+ onBeforeElUpdated: (fromEl, toEl) => {
414
+ // Preserve value for the last focused textual input
415
+ const lastFocused = this.focusManager.getLastFocusedElement();
416
+ if (lastFocused && this.focusManager.isTextualInput(fromEl)) {
417
+ if (fromEl === lastFocused) {
418
+ // Preserve the current value being typed
419
+ toEl.value = fromEl.value;
420
+ }
421
+ }
422
+ // Only update if content actually changed
423
+ if (fromEl.isEqualNode(toEl)) {
424
+ return false;
425
+ }
426
+ // Execute lvt-updated lifecycle hook
427
+ this.executeLifecycleHook(fromEl, "lvt-updated");
428
+ return true;
429
+ },
430
+ onNodeAdded: (node) => {
431
+ // Execute lvt-mounted lifecycle hook
432
+ if (node.nodeType === Node.ELEMENT_NODE) {
433
+ this.executeLifecycleHook(node, "lvt-mounted");
434
+ }
435
+ },
436
+ onBeforeNodeDiscarded: (node) => {
437
+ // Execute lvt-destroyed lifecycle hook
438
+ if (node.nodeType === Node.ELEMENT_NODE) {
439
+ this.executeLifecycleHook(node, "lvt-destroyed");
440
+ }
441
+ return true;
442
+ },
443
+ });
444
+ // Restore focus to previously focused element
445
+ this.focusManager.restoreFocusedElement();
446
+ // Handle scroll directives
447
+ (0, directives_1.handleScrollDirectives)(element);
448
+ // Handle highlight directives
449
+ (0, directives_1.handleHighlightDirectives)(element);
450
+ // Handle animate directives
451
+ (0, directives_1.handleAnimateDirectives)(element);
452
+ // Handle form lifecycle if metadata is present
453
+ if (meta) {
454
+ this.formLifecycleManager.handleResponse(meta);
455
+ }
456
+ }
457
+ /**
458
+ * Execute lifecycle hook on an element
459
+ * @param element - Element with lifecycle hook attribute
460
+ * @param hookName - Name of the lifecycle hook attribute (e.g., 'lvt-mounted')
461
+ */
462
+ executeLifecycleHook(element, hookName) {
463
+ const hookValue = element.getAttribute(hookName);
464
+ if (!hookValue) {
465
+ return;
466
+ }
467
+ try {
468
+ // Create a function from the hook value and execute it
469
+ // The function has access to 'this' (the element) and 'event'
470
+ const hookFunction = new Function("element", hookValue);
471
+ hookFunction.call(element, element);
472
+ }
473
+ catch (error) {
474
+ this.logger.error(`Error executing ${hookName} hook:`, error);
475
+ }
476
+ }
477
+ /**
478
+ * Reset client state (useful for testing)
479
+ */
480
+ reset() {
481
+ this.treeRenderer.reset();
482
+ this.focusManager.reset();
483
+ this.observerManager.teardown();
484
+ this.formLifecycleManager.reset();
485
+ this.loadingIndicator.hide();
486
+ this.formDisabler.enable(this.wrapperElement);
487
+ this.lvtId = null;
488
+ }
489
+ /**
490
+ * Get current tree state (for debugging)
491
+ */
492
+ getTreeState() {
493
+ return this.treeRenderer.getTreeState();
494
+ }
495
+ /**
496
+ * Get the static structure if available
497
+ */
498
+ getStaticStructure() {
499
+ return this.treeRenderer.getStaticStructure();
500
+ }
501
+ }
502
+ exports.LiveTemplateClient = LiveTemplateClient;
503
+ // Auto-initialize when script loads (for browser use)
504
+ if (typeof window !== "undefined") {
505
+ LiveTemplateClient.autoInit();
506
+ }
507
+ //# sourceMappingURL=livetemplate-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livetemplate-client.js","sourceRoot":"","sources":["../livetemplate-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ResponseMetadata } from "../types";
2
+ import { ModalManager } from "../dom/modal-manager";
3
+ /**
4
+ * Tracks form submission lifecycle for LiveTemplate actions.
5
+ */
6
+ export declare class FormLifecycleManager {
7
+ private readonly modalManager;
8
+ private activeForm;
9
+ private activeButton;
10
+ private originalButtonText;
11
+ constructor(modalManager: ModalManager);
12
+ setActiveSubmission(form: HTMLFormElement | null, button: HTMLButtonElement | null, originalButtonText: string | null): void;
13
+ handleResponse(meta: ResponseMetadata): void;
14
+ reset(): void;
15
+ private handleSuccess;
16
+ private handleError;
17
+ private restoreFormState;
18
+ }
19
+ //# sourceMappingURL=form-lifecycle-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-lifecycle-manager.d.ts","sourceRoot":"","sources":["../../state/form-lifecycle-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;GAEG;AACH,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJzC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,kBAAkB,CAAuB;gBAEpB,YAAY,EAAE,YAAY;IAEvD,mBAAmB,CACjB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAChC,IAAI;IAMP,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAgB5C,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormLifecycleManager = void 0;
4
+ /**
5
+ * Tracks form submission lifecycle for LiveTemplate actions.
6
+ */
7
+ class FormLifecycleManager {
8
+ constructor(modalManager) {
9
+ this.modalManager = modalManager;
10
+ this.activeForm = null;
11
+ this.activeButton = null;
12
+ this.originalButtonText = null;
13
+ }
14
+ setActiveSubmission(form, button, originalButtonText) {
15
+ this.activeForm = form;
16
+ this.activeButton = button;
17
+ this.originalButtonText = originalButtonText;
18
+ }
19
+ handleResponse(meta) {
20
+ if (this.activeForm) {
21
+ this.activeForm.dispatchEvent(new CustomEvent("lvt:done", { detail: meta }));
22
+ }
23
+ if (meta.success) {
24
+ this.handleSuccess(meta);
25
+ }
26
+ else {
27
+ this.handleError(meta);
28
+ }
29
+ this.restoreFormState();
30
+ }
31
+ reset() {
32
+ this.restoreFormState();
33
+ }
34
+ handleSuccess(meta) {
35
+ if (!this.activeForm) {
36
+ return;
37
+ }
38
+ this.activeForm.dispatchEvent(new CustomEvent("lvt:success", { detail: meta }));
39
+ const modalParent = this.activeForm.closest('[role="dialog"]');
40
+ if (modalParent && modalParent.id) {
41
+ this.modalManager.close(modalParent.id);
42
+ }
43
+ if (!this.activeForm.hasAttribute("lvt-preserve")) {
44
+ this.activeForm.reset();
45
+ }
46
+ }
47
+ handleError(meta) {
48
+ if (!this.activeForm) {
49
+ return;
50
+ }
51
+ this.activeForm.dispatchEvent(new CustomEvent("lvt:error", { detail: meta }));
52
+ }
53
+ restoreFormState() {
54
+ if (this.activeButton && this.originalButtonText !== null) {
55
+ this.activeButton.disabled = false;
56
+ this.activeButton.textContent = this.originalButtonText;
57
+ }
58
+ this.activeForm = null;
59
+ this.activeButton = null;
60
+ this.originalButtonText = null;
61
+ }
62
+ }
63
+ exports.FormLifecycleManager = FormLifecycleManager;
64
+ //# sourceMappingURL=form-lifecycle-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-lifecycle-manager.js","sourceRoot":"","sources":["../../state/form-lifecycle-manager.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,oBAAoB;IAK/B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;QAJ/C,eAAU,GAA2B,IAAI,CAAC;QAC1C,iBAAY,GAA6B,IAAI,CAAC;QAC9C,uBAAkB,GAAkB,IAAI,CAAC;IAES,CAAC;IAE3D,mBAAmB,CACjB,IAA4B,EAC5B,MAAgC,EAChC,kBAAiC;QAEjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,cAAc,CAAC,IAAsB;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAC3B,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC9C,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,aAAa,CAAC,IAAsB;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAC3B,IAAI,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC/D,IAAI,WAAW,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAsB;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAC3B,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,KAAK,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;CACF;AA5ED,oDA4EC"}
@@ -0,0 +1,27 @@
1
+ import type { TreeNode, UpdateResult } from "../types";
2
+ import type { Logger } from "../utils/logger";
3
+ /**
4
+ * Handles tree state management and HTML reconstruction logic for LiveTemplate.
5
+ */
6
+ export declare class TreeRenderer {
7
+ private readonly logger;
8
+ private treeState;
9
+ private rangeState;
10
+ private rangeIdKeys;
11
+ constructor(logger: Logger);
12
+ applyUpdate(update: TreeNode): UpdateResult;
13
+ reset(): void;
14
+ getTreeState(): TreeNode;
15
+ getStaticStructure(): string[] | null;
16
+ private deepMergeTreeNodes;
17
+ private reconstructFromTree;
18
+ private renderValue;
19
+ private renderRangeStructure;
20
+ private applyDifferentialOperations;
21
+ private getCurrentRangeStructure;
22
+ private renderItemsWithStatics;
23
+ private addItemsToRange;
24
+ private getItemKey;
25
+ private findItemIndexByKey;
26
+ }
27
+ //# sourceMappingURL=tree-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-renderer.d.ts","sourceRoot":"","sources":["../../state/tree-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAO9C;;GAEG;AACH,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,WAAW,CAA8B;gBAEpB,MAAM,EAAE,MAAM;IAE3C,WAAW,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY;IA+B3C,KAAK,IAAI,IAAI;IAMb,YAAY,IAAI,QAAQ;IAIxB,kBAAkB,IAAI,MAAM,EAAE,GAAG,IAAI;IAIrC,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,WAAW;IAuFnB,OAAO,CAAC,oBAAoB;IAyD5B,OAAO,CAAC,2BAA2B;IAwInC,OAAO,CAAC,wBAAwB;IAoBhC,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,kBAAkB;CAU3B"}