@livetemplate/client 0.8.25 → 0.8.27

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.
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ /**
3
+ * Regression test for the conditional-slot structural transition bug.
4
+ *
5
+ * When a template slot transitions from an empty string ("") to a
6
+ * sub-tree with its own statics ({"0":"text","s":["<mark>","</mark>"]}),
7
+ * the rendered HTML must include the statics. Before the fix, the
8
+ * client's tree renderer silently dropped the transition and the DOM
9
+ * never showed the <mark> tag.
10
+ *
11
+ * This test operates at the TreeRenderer level (no morphdom, no
12
+ * WebSocket) to isolate the reconstruction bug from the DOM-patching
13
+ * layer.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const livetemplate_client_1 = require("../livetemplate-client");
17
+ describe("conditional slot structural transition", () => {
18
+ let client;
19
+ beforeEach(() => {
20
+ client = new livetemplate_client_1.LiveTemplateClient();
21
+ });
22
+ it("slot transitioning from empty string to sub-tree with statics renders the statics", () => {
23
+ // Initial tree: slot 1 is a simple empty string (the {{if .Error}}
24
+ // block evaluated to false on the first render).
25
+ const initialTree = {
26
+ s: ["<p>status: ", " error: ", "</p>"],
27
+ 0: "ok",
28
+ 1: "",
29
+ };
30
+ const r1 = client.applyUpdate(initialTree);
31
+ expect(r1.html).toContain("status: ok");
32
+ expect(r1.html).not.toContain("<mark>");
33
+ // Update: slot 1 transitions from "" to a sub-tree with statics
34
+ // (the {{if .Error}} block now evaluates to true, emitting a
35
+ // <mark> wrapper around the error text).
36
+ const update = {
37
+ 1: {
38
+ s: [" — <mark>", "</mark>"],
39
+ 0: "something broke",
40
+ },
41
+ };
42
+ const r2 = client.applyUpdate(update);
43
+ // The rendered HTML MUST include the <mark> tag from the sub-tree's
44
+ // statics. Before the fix, r2.html was "<p>status: ok error: </p>"
45
+ // — the sub-tree was silently dropped.
46
+ expect(r2.html).toContain("<mark>");
47
+ expect(r2.html).toContain("something broke");
48
+ expect(r2.html).toContain("</mark>");
49
+ // Full expected: "<p>status: ok error: — <mark>something broke</mark></p>"
50
+ expect(r2.html).toContain(" — <mark>something broke</mark>");
51
+ });
52
+ it("slot transitioning from sub-tree back to empty string removes the statics", () => {
53
+ // Start with the sub-tree present.
54
+ const initialTree = {
55
+ s: ["<p>status: ", " error: ", "</p>"],
56
+ 0: "ok",
57
+ 1: {
58
+ s: [" — <mark>", "</mark>"],
59
+ 0: "something broke",
60
+ },
61
+ };
62
+ const r1 = client.applyUpdate(initialTree);
63
+ expect(r1.html).toContain("<mark>something broke</mark>");
64
+ // Update: error clears, slot 1 goes back to empty string.
65
+ const update = { 1: "" };
66
+ const r2 = client.applyUpdate(update);
67
+ expect(r2.html).not.toContain("<mark>");
68
+ expect(r2.html).not.toContain("something broke");
69
+ });
70
+ it("multiple transitions back and forth work correctly", () => {
71
+ const initialTree = {
72
+ s: ["<div>", "</div>"],
73
+ 0: "",
74
+ };
75
+ client.applyUpdate(initialTree);
76
+ // Empty → sub-tree
77
+ const r1 = client.applyUpdate({
78
+ 0: { s: ["<b>", "</b>"], 0: "bold" },
79
+ });
80
+ expect(r1.html).toContain("<b>bold</b>");
81
+ // Sub-tree → different sub-tree
82
+ const r2 = client.applyUpdate({
83
+ 0: { s: ["<em>", "</em>"], 0: "italic" },
84
+ });
85
+ expect(r2.html).toContain("<em>italic</em>");
86
+ expect(r2.html).not.toContain("<b>");
87
+ // Sub-tree → empty
88
+ const r3 = client.applyUpdate({ 0: "" });
89
+ expect(r3.html).not.toContain("<em>");
90
+ expect(r3.html).not.toContain("<b>");
91
+ // Empty → sub-tree again
92
+ const r4 = client.applyUpdate({
93
+ 0: { s: ["<b>", "</b>"], 0: "back" },
94
+ });
95
+ expect(r4.html).toContain("<b>back</b>");
96
+ });
97
+ });
98
+ //# sourceMappingURL=conditional-slot-transition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional-slot-transition.test.js","sourceRoot":"","sources":["../../tests/conditional-slot-transition.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Tests for in-band navigate message (same-handler SPA navigation).
3
+ *
4
+ * Same-pathname link clicks must bypass fetch() entirely and send a
5
+ * {action: "__navigate__", data: <query params>} message over the
6
+ * existing WebSocket. The server's event loop special-cases this
7
+ * action name to re-run Mount with the new query data without
8
+ * tearing down the connection — the in-band equivalent of Phoenix
9
+ * LiveView's live_patch / handle_params.
10
+ *
11
+ * The regression these tests guard against is the devbox-dash bug
12
+ * where clicking between same-handler variants (/claude?s=A vs
13
+ * /claude?s=B) would swap DOM but leave the server's per-connection
14
+ * state pinned to the original query params, so the next server-driven
15
+ * refresh clobbered the DOM with stale content.
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=navigate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.test.d.ts","sourceRoot":"","sources":["../../tests/navigate.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for in-band navigate message (same-handler SPA navigation).
4
+ *
5
+ * Same-pathname link clicks must bypass fetch() entirely and send a
6
+ * {action: "__navigate__", data: <query params>} message over the
7
+ * existing WebSocket. The server's event loop special-cases this
8
+ * action name to re-run Mount with the new query data without
9
+ * tearing down the connection — the in-band equivalent of Phoenix
10
+ * LiveView's live_patch / handle_params.
11
+ *
12
+ * The regression these tests guard against is the devbox-dash bug
13
+ * where clicking between same-handler variants (/claude?s=A vs
14
+ * /claude?s=B) would swap DOM but leave the server's per-connection
15
+ * state pinned to the original query params, so the next server-driven
16
+ * refresh clobbered the DOM with stale content.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ const link_interceptor_1 = require("../dom/link-interceptor");
20
+ // Minimal logger stub — LinkInterceptor uses it only for debug/error logging.
21
+ const silentLogger = {
22
+ isDebugEnabled: () => false,
23
+ isInfoEnabled: () => false,
24
+ isWarnEnabled: () => true,
25
+ isErrorEnabled: () => true,
26
+ child: () => silentLogger,
27
+ setLevel: () => { },
28
+ debug: () => { },
29
+ info: () => { },
30
+ warn: () => { },
31
+ error: () => { },
32
+ trace: () => { },
33
+ };
34
+ describe("LinkInterceptor same-pathname navigate bypass", () => {
35
+ let wrapper;
36
+ let sendNavigateSpy;
37
+ let handleNavigationResponseSpy;
38
+ let fetchMock;
39
+ let interceptor;
40
+ beforeEach(() => {
41
+ document.body.replaceChildren();
42
+ wrapper = document.createElement("div");
43
+ wrapper.setAttribute("data-lvt-id", "nav-test-wrapper");
44
+ document.body.appendChild(wrapper);
45
+ sendNavigateSpy = jest.fn().mockReturnValue(true);
46
+ handleNavigationResponseSpy = jest.fn();
47
+ // jsdom doesn't ship a global fetch; define a no-op stub so jest.spyOn
48
+ // has something to wrap. jest.restoreAllMocks() in afterEach then cleans
49
+ // up the spy automatically, even if beforeEach throws after this point.
50
+ if (typeof globalThis.fetch !== "function") {
51
+ globalThis.fetch = () => { };
52
+ }
53
+ fetchMock = jest
54
+ .spyOn(globalThis, "fetch")
55
+ .mockImplementation(() => Promise.resolve(new Response("<html></html>", { status: 200 })));
56
+ const ctx = {
57
+ getWrapperElement: () => wrapper,
58
+ handleNavigationResponse: handleNavigationResponseSpy,
59
+ sendNavigate: sendNavigateSpy,
60
+ canSendNavigate: () => true,
61
+ };
62
+ interceptor = new link_interceptor_1.LinkInterceptor(ctx, silentLogger);
63
+ interceptor.setup(wrapper);
64
+ // Pin the current location so test navigations have something to
65
+ // compare their pathname against. jsdom defaults to about:blank,
66
+ // which has no useful pathname.
67
+ history.replaceState(null, "", "/claude?s=initial");
68
+ });
69
+ afterEach(() => {
70
+ jest.restoreAllMocks();
71
+ // Tear down any listeners the interceptor added to document.
72
+ interceptor.teardownForWrapper(wrapper.getAttribute("data-lvt-id"));
73
+ });
74
+ it("same-pathname link click sends navigate message, no fetch", async () => {
75
+ // Build a link whose href shares the current pathname but has
76
+ // a different query string.
77
+ const link = document.createElement("a");
78
+ link.href = "/claude?s=new-session";
79
+ link.textContent = "switch";
80
+ wrapper.appendChild(link);
81
+ // Simulate a real user click.
82
+ link.click();
83
+ // Give the async navigate path a microtask to run.
84
+ await Promise.resolve();
85
+ expect(sendNavigateSpy).toHaveBeenCalledTimes(1);
86
+ expect(sendNavigateSpy.mock.calls[0][0]).toContain("s=new-session");
87
+ expect(fetchMock).not.toHaveBeenCalled();
88
+ expect(handleNavigationResponseSpy).not.toHaveBeenCalled();
89
+ // History state should have been updated so a subsequent
90
+ // reload picks up the new URL.
91
+ expect(window.location.search).toBe("?s=new-session");
92
+ });
93
+ it("different-pathname link click goes through fetch, not navigate", async () => {
94
+ const link = document.createElement("a");
95
+ link.href = "/other-page";
96
+ link.textContent = "other";
97
+ wrapper.appendChild(link);
98
+ link.click();
99
+ // Give the sync portion of LinkInterceptor.navigate a microtask.
100
+ // We're only asserting that fetch() was invoked (the key branch
101
+ // point) and sendNavigate was NOT — not that the post-fetch chain
102
+ // completed.
103
+ await Promise.resolve();
104
+ expect(fetchMock).toHaveBeenCalledTimes(1);
105
+ expect(sendNavigateSpy).not.toHaveBeenCalled();
106
+ });
107
+ it("external-origin link click is not intercepted at all", async () => {
108
+ const link = document.createElement("a");
109
+ link.href = "https://example.com/claude?s=foo";
110
+ link.textContent = "external";
111
+ wrapper.appendChild(link);
112
+ link.click();
113
+ await Promise.resolve();
114
+ expect(sendNavigateSpy).not.toHaveBeenCalled();
115
+ expect(fetchMock).not.toHaveBeenCalled();
116
+ expect(handleNavigationResponseSpy).not.toHaveBeenCalled();
117
+ });
118
+ it("same-pathname click aborts any in-flight cross-path fetch", async () => {
119
+ // Regression: if a cross-path fetch is in flight and the user then
120
+ // clicks a same-pathname link, the earlier fetch must be aborted so
121
+ // it cannot later call handleNavigationResponse and race with the
122
+ // in-band __navigate__ update.
123
+ // First, initiate a cross-path fetch that never resolves until aborted.
124
+ let capturedSignal = null;
125
+ fetchMock.mockImplementation((_url, opts) => {
126
+ capturedSignal = opts.signal;
127
+ // Never resolve — the test controls when this settles via the signal.
128
+ return new Promise((_resolve, _reject) => {
129
+ opts.signal?.addEventListener("abort", () => {
130
+ _reject(new DOMException("AbortError", "AbortError"));
131
+ });
132
+ });
133
+ });
134
+ const crossPathLink = document.createElement("a");
135
+ crossPathLink.href = "/other-page?x=1";
136
+ wrapper.appendChild(crossPathLink);
137
+ crossPathLink.click();
138
+ await Promise.resolve();
139
+ // Cross-path click should have started a fetch and captured the signal.
140
+ expect(fetchMock).toHaveBeenCalledTimes(1);
141
+ expect(capturedSignal).not.toBeNull();
142
+ expect(capturedSignal.aborted).toBe(false);
143
+ // Now click a same-pathname link — this must abort the in-flight fetch.
144
+ const samePathLink = document.createElement("a");
145
+ samePathLink.href = "/claude?s=fast-nav";
146
+ wrapper.appendChild(samePathLink);
147
+ samePathLink.click();
148
+ await Promise.resolve();
149
+ expect(sendNavigateSpy).toHaveBeenCalledTimes(1);
150
+ expect(capturedSignal.aborted).toBe(true);
151
+ });
152
+ it("same-pathname with no query string still sends navigate (empty data)", async () => {
153
+ // User clicks a link that drops all query params ("back to list").
154
+ const link = document.createElement("a");
155
+ link.href = "/claude";
156
+ link.textContent = "all sessions";
157
+ wrapper.appendChild(link);
158
+ link.click();
159
+ await Promise.resolve();
160
+ expect(sendNavigateSpy).toHaveBeenCalledTimes(1);
161
+ expect(fetchMock).not.toHaveBeenCalled();
162
+ // The sendNavigate URL should be /claude (no query).
163
+ const arg = sendNavigateSpy.mock.calls[0][0];
164
+ expect(arg).not.toContain("s=");
165
+ });
166
+ it("HTTP mode: same-pathname click uses fetch, not navigate (canSendNavigate=false)", async () => {
167
+ // When canSendNavigate() returns false (HTTP mode), the interceptor
168
+ // must NOT enter the same-pathname fast path, because pushState would
169
+ // fire before sendNavigate is called and sendNavigate would bail early
170
+ // — leaving the URL permanently ahead of server state with no WS
171
+ // reconnect to recover it. The fix: fall through to a normal fetch.
172
+ interceptor.teardownForWrapper(wrapper.getAttribute("data-lvt-id"));
173
+ const httpCtx = {
174
+ getWrapperElement: () => wrapper,
175
+ handleNavigationResponse: handleNavigationResponseSpy,
176
+ sendNavigate: sendNavigateSpy,
177
+ canSendNavigate: () => false, // HTTP mode
178
+ };
179
+ const httpInterceptor = new link_interceptor_1.LinkInterceptor(httpCtx, silentLogger);
180
+ httpInterceptor.setup(wrapper);
181
+ const link = document.createElement("a");
182
+ link.href = "/claude?s=new-session";
183
+ wrapper.appendChild(link);
184
+ link.click();
185
+ await Promise.resolve();
186
+ // Must use fetch (not sendNavigate) even though pathname matches.
187
+ expect(sendNavigateSpy).not.toHaveBeenCalled();
188
+ expect(fetchMock).toHaveBeenCalledTimes(1);
189
+ httpInterceptor.teardownForWrapper(wrapper.getAttribute("data-lvt-id"));
190
+ });
191
+ it("hash-only popstate does not trigger sendNavigate (regression: spurious Mount re-run)", async () => {
192
+ // Regression guard: the popstate listener calls navigate() directly,
193
+ // bypassing shouldSkip(). Without the pushState=true guard on the
194
+ // __navigate__ fast path, a popstate (pushState=false) to the same
195
+ // pathname+search with a different hash would fire sendNavigate({}) —
196
+ // a spurious server-side Mount re-run with no query change.
197
+ //
198
+ // The critical assertion is that sendNavigate is NOT called. A fetch
199
+ // may occur (popstate restoring prior page state via a full round-trip
200
+ // is correct behaviour). We cannot guarantee fetch is skipped here
201
+ // because LinkInterceptor tracks currentHref as a live field: the
202
+ // beforeEach replaceState runs *after* setup(), so on the popstate
203
+ // currentHref may reflect the previous test entry rather than
204
+ // "?s=initial". The same-search optimisation therefore cannot fire
205
+ // reliably in unit-test sequence, but that is a test-ordering
206
+ // artefact — the production invariant (no spurious sendNavigate on
207
+ // hash-only popstate) is what matters.
208
+ history.pushState(null, "", "/claude?s=initial#section");
209
+ expect(window.location.search).toBe("?s=initial"); // search unchanged
210
+ // Dispatch popstate as the browser would on back/forward navigation.
211
+ window.dispatchEvent(new PopStateEvent("popstate", { state: null }));
212
+ await Promise.resolve();
213
+ // sendNavigate must NOT be called — this is the actual regression.
214
+ expect(sendNavigateSpy).not.toHaveBeenCalled();
215
+ // Restore location for other tests.
216
+ history.replaceState(null, "", "/claude?s=initial");
217
+ });
218
+ });
219
+ //# sourceMappingURL=navigate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.test.js","sourceRoot":"","sources":["../../tests/navigate.test.ts"],"names":[],"mappings":"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"}
@@ -21,20 +21,45 @@ describe("handleNavigationResponse", () => {
21
21
  client.handleNavigationResponse(html);
22
22
  };
23
23
  describe("same-handler navigation", () => {
24
- it("replaces wrapper children when response has same data-lvt-id", () => {
24
+ // handleNavigationResponse is only reachable via LinkInterceptor for
25
+ // cross-pathname fetches. Same-pathname navigations (query-param change
26
+ // on the same route) are caught by the fast path in link-interceptor.ts
27
+ // and handled via sendNavigate() directly — no fetch, no call here.
28
+ //
29
+ // When handleNavigationResponse receives a same-handler-ID response
30
+ // from a cross-pathname fetch, it falls through to the reconnect path
31
+ // (same as a genuine handler switch). The in-band __navigate__ path for
32
+ // same-pathname navigation is covered in navigate.test.ts.
33
+ it("same-handler ID match from cross-path fetch triggers reconnect (not sendNavigate)", () => {
34
+ // Regression guard: two different routes sharing the same data-lvt-id
35
+ // must NOT call sendNavigate (which only ships query params, silently
36
+ // dropping the path change). The correct behaviour is a full reconnect.
37
+ const disconnectSpy = jest
38
+ .spyOn(client, "disconnect")
39
+ .mockImplementation(() => { });
40
+ const connectSpy = jest
41
+ .spyOn(client, "connect")
42
+ .mockResolvedValue(undefined);
43
+ const sendSpy = jest.spyOn(client, "send").mockImplementation(() => { });
25
44
  const html = [
26
- "<html><head><title>Same Page</title></head><body>",
45
+ "<html><body>",
27
46
  '<div data-lvt-id="lvt-handler-a">',
28
- "<p>Updated content from same handler</p>",
47
+ "<p>Content from /route-b</p>",
29
48
  "</div>",
30
49
  "</body></html>",
31
50
  ].join("");
32
51
  callHandleNavigationResponse(html);
33
- expect(wrapper.textContent).toContain("Updated content from same handler");
34
- expect(wrapper.getAttribute("data-lvt-id")).toBe("lvt-handler-a");
52
+ // sendNavigate must NOT have been called — that would drop the path.
53
+ expect(sendSpy).not.toHaveBeenCalled();
54
+ // Reconnect path must have fired instead.
55
+ expect(disconnectSpy).toHaveBeenCalled();
56
+ disconnectSpy.mockRestore();
57
+ connectSpy.mockRestore();
58
+ sendSpy.mockRestore();
35
59
  });
36
60
  it("preserves wrapper element identity", () => {
37
61
  const originalWrapper = wrapper;
62
+ const sendSpy = jest.spyOn(client, "send").mockImplementation(() => { });
38
63
  const html = [
39
64
  "<html><body>",
40
65
  '<div data-lvt-id="lvt-handler-a">',
@@ -44,6 +69,7 @@ describe("handleNavigationResponse", () => {
44
69
  ].join("");
45
70
  callHandleNavigationResponse(html);
46
71
  expect(client.wrapperElement).toBe(originalWrapper);
72
+ sendSpy.mockRestore();
47
73
  });
48
74
  });
49
75
  describe("cross-handler navigation", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.test.js","sourceRoot":"","sources":["../../tests/navigation.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navigation.test.js","sourceRoot":"","sources":["../../tests/navigation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * lvt-preserve attribute tests.
3
+ *
4
+ * lvt-preserve tells the morphdom diff engine "don't touch this element".
5
+ * It's the generic escape hatch for interactive elements whose state
6
+ * lives on the client side — <details open>, <dialog open>, checkbox
7
+ * state, scroll positions, third-party widgets, etc. Without it, any
8
+ * server-driven update that doesn't include the client-managed state
9
+ * clobbers it on the next diff cycle.
10
+ *
11
+ * Equivalent attributes in other frameworks:
12
+ * - Phoenix LiveView: phx-update="ignore"
13
+ * - Hotwire Turbo: data-turbo-permanent
14
+ * - HTMX: hx-preserve="true"
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=preserve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserve.test.d.ts","sourceRoot":"","sources":["../../tests/preserve.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}