@livetemplate/client 0.8.23 → 0.8.26
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/dist/dom/link-interceptor.d.ts +10 -2
- package/dist/dom/link-interceptor.d.ts.map +1 -1
- package/dist/dom/link-interceptor.js +61 -2
- package/dist/dom/link-interceptor.js.map +1 -1
- package/dist/livetemplate-client.browser.js +4 -4
- package/dist/livetemplate-client.browser.js.map +3 -3
- package/dist/livetemplate-client.d.ts +21 -0
- package/dist/livetemplate-client.d.ts.map +1 -1
- package/dist/livetemplate-client.js +282 -49
- package/dist/livetemplate-client.js.map +1 -1
- package/dist/tests/conditional-slot-transition.test.d.ts +15 -0
- package/dist/tests/conditional-slot-transition.test.d.ts.map +1 -0
- package/dist/tests/conditional-slot-transition.test.js +98 -0
- package/dist/tests/conditional-slot-transition.test.js.map +1 -0
- package/dist/tests/navigate.test.d.ts +18 -0
- package/dist/tests/navigate.test.d.ts.map +1 -0
- package/dist/tests/navigate.test.js +211 -0
- package/dist/tests/navigate.test.js.map +1 -0
- package/dist/tests/navigation.test.js +31 -5
- package/dist/tests/navigation.test.js.map +1 -1
- package/dist/tests/preserve.test.d.ts +17 -0
- package/dist/tests/preserve.test.d.ts.map +1 -0
- package/dist/tests/preserve.test.js +193 -0
- package/dist/tests/preserve.test.js.map +1 -0
- package/dist/tests/script-duplication.test.d.ts +15 -0
- package/dist/tests/script-duplication.test.d.ts.map +1 -0
- package/dist/tests/script-duplication.test.js +87 -0
- package/dist/tests/script-duplication.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -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,211 @@
|
|
|
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 (same pathname + same search) does not trigger sendNavigate or fetch", async () => {
|
|
192
|
+
// Regression: the popstate listener calls navigate() directly, bypassing
|
|
193
|
+
// shouldSkip(). Without an explicit sameSearch guard in navigate(), a
|
|
194
|
+
// popstate to the same pathname+search with a different hash (e.g.
|
|
195
|
+
// /claude?s=initial → /claude?s=initial#section) would fire sendNavigate
|
|
196
|
+
// with data={} — a spurious server-side Mount re-run with no query change.
|
|
197
|
+
//
|
|
198
|
+
// Push a hash anchor so window.location changes to the hash URL.
|
|
199
|
+
history.pushState(null, "", "/claude?s=initial#section");
|
|
200
|
+
expect(window.location.search).toBe("?s=initial"); // search unchanged
|
|
201
|
+
// Dispatch popstate as the browser would on back/forward navigation.
|
|
202
|
+
window.dispatchEvent(new PopStateEvent("popstate", { state: null }));
|
|
203
|
+
await Promise.resolve();
|
|
204
|
+
// No sendNavigate (hash-only, no search change) and no fetch.
|
|
205
|
+
expect(sendNavigateSpy).not.toHaveBeenCalled();
|
|
206
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
207
|
+
// Restore location for other tests.
|
|
208
|
+
history.replaceState(null, "", "/claude?s=initial");
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
//# 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
|
-
|
|
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><
|
|
45
|
+
"<html><body>",
|
|
27
46
|
'<div data-lvt-id="lvt-handler-a">',
|
|
28
|
-
"<p>
|
|
47
|
+
"<p>Content from /route-b</p>",
|
|
29
48
|
"</div>",
|
|
30
49
|
"</body></html>",
|
|
31
50
|
].join("");
|
|
32
51
|
callHandleNavigationResponse(html);
|
|
33
|
-
|
|
34
|
-
expect(
|
|
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"}
|