@praxisjs/head 0.3.1 → 0.3.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.
@@ -1,544 +0,0 @@
1
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
- var _, done = false;
7
- for (var i = decorators.length - 1; i >= 0; i--) {
8
- var context = {};
9
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
- if (kind === "accessor") {
14
- if (result === void 0) continue;
15
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
- if (_ = accept(result.get)) descriptor.get = _;
17
- if (_ = accept(result.set)) descriptor.set = _;
18
- if (_ = accept(result.init)) initializers.unshift(_);
19
- }
20
- else if (_ = accept(result)) {
21
- if (kind === "field") initializers.unshift(_);
22
- else descriptor[key] = _;
23
- }
24
- }
25
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
- done = true;
27
- };
28
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
- var useValue = arguments.length > 2;
30
- for (var i = 0; i < initializers.length; i++) {
31
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
- }
33
- return useValue ? value : void 0;
34
- };
35
- // @vitest-environment jsdom
36
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
37
- import { signal } from "@praxisjs/core/internal";
38
- import { StatefulComponent } from "@praxisjs/core";
39
- import { Head } from "../index";
40
- import { pushHead, removeHead, resetHeadState, headVersion } from "../head-stack";
41
- beforeEach(() => {
42
- document.head.innerHTML = "";
43
- resetHeadState();
44
- document.title = "initial";
45
- });
46
- // ─── head-stack unit tests ────────────────────────────────────────────────────
47
- describe("pushHead / removeHead", () => {
48
- it("sets document.title", () => {
49
- const id = Symbol();
50
- pushHead(id, { title: "Hello" });
51
- expect(document.title).toBe("Hello");
52
- });
53
- it("adds meta name=description", () => {
54
- const id = Symbol();
55
- pushHead(id, { description: "My desc" });
56
- expect(document.querySelector('meta[name="description"]')?.content).toBe("My desc");
57
- });
58
- it("adds og: meta properties", () => {
59
- const id = Symbol();
60
- pushHead(id, { og: { title: "OG Title", image: "https://example.com/img.jpg" } });
61
- expect(document.querySelector('[property="og:title"]')?.getAttribute("content")).toBe("OG Title");
62
- expect(document.querySelector('[property="og:image"]')?.getAttribute("content")).toBe("https://example.com/img.jpg");
63
- });
64
- it("adds twitter: meta tags", () => {
65
- const id = Symbol();
66
- pushHead(id, { twitter: { card: "summary_large_image", title: "TW" } });
67
- expect(document.querySelector('[name="twitter:card"]')?.getAttribute("content")).toBe("summary_large_image");
68
- expect(document.querySelector('[name="twitter:title"]')?.getAttribute("content")).toBe("TW");
69
- });
70
- it("adds canonical link", () => {
71
- const id = Symbol();
72
- pushHead(id, { canonical: "https://example.com/page" });
73
- expect(document.querySelector('link[rel="canonical"]')?.getAttribute("href")).toBe("https://example.com/page");
74
- });
75
- it("adds arbitrary meta[] by name and property", () => {
76
- const id = Symbol();
77
- pushHead(id, {
78
- meta: [
79
- { name: "robots", content: "noindex" },
80
- { property: "fb:app_id", content: "12345" },
81
- ],
82
- });
83
- expect(document.querySelector('[name="robots"]')?.getAttribute("content")).toBe("noindex");
84
- expect(document.querySelector('[property="fb:app_id"]')?.getAttribute("content")).toBe("12345");
85
- });
86
- it("updates an existing entry (no duplicate push)", () => {
87
- const id = Symbol();
88
- pushHead(id, { title: "v1" });
89
- pushHead(id, { title: "v2" });
90
- expect(document.title).toBe("v2");
91
- });
92
- it("restores initial title and removes managed metas on removeHead", () => {
93
- const id = Symbol();
94
- pushHead(id, { title: "Page", description: "Desc" });
95
- removeHead(id);
96
- expect(document.title).toBe("initial");
97
- expect(document.querySelector('meta[name="description"]')).toBeNull();
98
- });
99
- it("stack: last entry wins; removing it restores the previous one", () => {
100
- const a = Symbol();
101
- const b = Symbol();
102
- pushHead(a, { title: "A", description: "desc-a" });
103
- pushHead(b, { title: "B", description: "desc-b" });
104
- expect(document.title).toBe("B");
105
- removeHead(b);
106
- expect(document.title).toBe("A");
107
- expect(document.querySelector('meta[name="description"]')?.content).toBe("desc-a");
108
- });
109
- it("removes all managed metas when stack is empty", () => {
110
- const id = Symbol();
111
- pushHead(id, { description: "x", og: { title: "y" } });
112
- removeHead(id);
113
- expect(document.querySelectorAll("[data-praxis-head]").length).toBe(0);
114
- });
115
- it("removeHead with a non-existent id is a no-op (idx < 0 branch)", () => {
116
- const id = Symbol("never-pushed");
117
- expect(() => removeHead(id)).not.toThrow();
118
- expect(document.querySelectorAll("[data-praxis-head]").length).toBe(0);
119
- });
120
- it("_apply restores title to '' when _initialTitle is undefined and stack is empty", () => {
121
- // resetHeadState leaves _initialTitle = undefined; calling removeHead on a missing id
122
- // triggers _apply with an empty stack and undefined _initialTitle → title = "" fallback.
123
- const id = Symbol("missing");
124
- document.title = "should-be-cleared";
125
- removeHead(id);
126
- expect(document.title).toBe("");
127
- });
128
- it("adds preload link with href and as", () => {
129
- const id = Symbol();
130
- pushHead(id, { preload: [{ href: "/fonts/inter.woff2", as: "font" }] });
131
- const el = document.querySelector('link[rel="preload"]');
132
- expect(el?.href).toContain("/fonts/inter.woff2");
133
- expect(el?.getAttribute("as")).toBe("font");
134
- });
135
- it("adds preload link with type and crossOrigin", () => {
136
- const id = Symbol();
137
- pushHead(id, {
138
- preload: [{ href: "/fonts/inter.woff2", as: "font", type: "font/woff2", crossOrigin: "anonymous" }],
139
- });
140
- const el = document.querySelector('link[rel="preload"]');
141
- expect(el?.type).toBe("font/woff2");
142
- expect(el?.crossOrigin).toBe("anonymous");
143
- });
144
- it("adds multiple preload links", () => {
145
- const id = Symbol();
146
- pushHead(id, {
147
- preload: [
148
- { href: "/style.css", as: "style" },
149
- { href: "/app.js", as: "script" },
150
- ],
151
- });
152
- const els = document.querySelectorAll('link[rel="preload"]');
153
- expect(els.length).toBe(2);
154
- expect(els[0].getAttribute("as")).toBe("style");
155
- expect(els[1].getAttribute("as")).toBe("script");
156
- });
157
- it("adds prefetch link with href", () => {
158
- const id = Symbol();
159
- pushHead(id, { prefetch: [{ href: "/about" }] });
160
- const el = document.querySelector('link[rel="prefetch"]');
161
- expect(el?.href).toContain("/about");
162
- });
163
- it("adds prefetch link with optional as", () => {
164
- const id = Symbol();
165
- pushHead(id, { prefetch: [{ href: "/chunk.js", as: "script" }] });
166
- const el = document.querySelector('link[rel="prefetch"]');
167
- expect(el?.getAttribute("as")).toBe("script");
168
- });
169
- it("adds multiple prefetch links", () => {
170
- const id = Symbol();
171
- pushHead(id, {
172
- prefetch: [
173
- { href: "/about" },
174
- { href: "/contact" },
175
- ],
176
- });
177
- const els = document.querySelectorAll('link[rel="prefetch"]');
178
- expect(els.length).toBe(2);
179
- });
180
- it("cleans up preload and prefetch on removeHead", () => {
181
- const id = Symbol();
182
- pushHead(id, {
183
- preload: [{ href: "/font.woff2", as: "font" }],
184
- prefetch: [{ href: "/next-page" }],
185
- });
186
- removeHead(id);
187
- expect(document.querySelector('link[rel="preload"]')).toBeNull();
188
- expect(document.querySelector('link[rel="prefetch"]')).toBeNull();
189
- });
190
- it("meta tag with neither name nor property is silently skipped", () => {
191
- const id = Symbol();
192
- pushHead(id, { meta: [{ content: "orphan-content" }] });
193
- const all = document.querySelectorAll("[data-praxis-head]");
194
- const hasOrphan = Array.from(all).some((el) => el.getAttribute("content") === "orphan-content");
195
- expect(hasOrphan).toBe(false);
196
- removeHead(id);
197
- });
198
- it("omits undefined og fields", () => {
199
- const id = Symbol();
200
- pushHead(id, { og: { title: "T" } });
201
- expect(document.querySelector('[property="og:image"]')).toBeNull();
202
- expect(document.querySelector('[property="og:title"]')?.getAttribute("content")).toBe("T");
203
- });
204
- });
205
- // ─── SSR guards ───────────────────────────────────────────────────────────────
206
- describe("SSR guards — no DOM operations when document is undefined", () => {
207
- afterEach(() => {
208
- vi.unstubAllGlobals();
209
- });
210
- it("pushHead is a no-op when document is undefined", () => {
211
- const versionBefore = headVersion();
212
- vi.stubGlobal("document", undefined);
213
- const id = Symbol();
214
- expect(() => pushHead(id, { title: "SSR" })).not.toThrow();
215
- // headVersion must NOT have changed (function returned early)
216
- expect(headVersion()).toBe(versionBefore);
217
- });
218
- it("removeHead is a no-op when document is undefined", () => {
219
- vi.stubGlobal("document", undefined);
220
- const id = Symbol();
221
- expect(() => removeHead(id)).not.toThrow();
222
- });
223
- it("resetHeadState skips DOM cleanup when document is undefined", () => {
224
- vi.stubGlobal("document", undefined);
225
- expect(() => resetHeadState()).not.toThrow();
226
- });
227
- });
228
- describe("resetHeadState — DOM cleanup", () => {
229
- it("removes managed elements from document.head when called with elements present", () => {
230
- const id = Symbol();
231
- pushHead(id, { title: "Before Reset", description: "desc" });
232
- expect(document.querySelectorAll("[data-praxis-head]").length).toBeGreaterThan(0);
233
- // Call resetHeadState WITHOUT clearing head.innerHTML first — exercises the forEach
234
- resetHeadState();
235
- expect(document.querySelectorAll("[data-praxis-head]").length).toBe(0);
236
- });
237
- });
238
- // ─── @Head decorator ──────────────────────────────────────────────────────────
239
- // All decorated classes at module scope for correct TypeScript inference.
240
- let StaticComp = (() => {
241
- let _classDecorators = [Head({ title: "Static Title", description: "Static desc" })];
242
- let _classDescriptor;
243
- let _classExtraInitializers = [];
244
- let _classThis;
245
- let _classSuper = StatefulComponent;
246
- var StaticComp = class extends _classSuper {
247
- static { _classThis = this; }
248
- static {
249
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
250
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
251
- StaticComp = _classThis = _classDescriptor.value;
252
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
253
- __runInitializers(_classThis, _classExtraInitializers);
254
- }
255
- render() { return null; }
256
- };
257
- return StaticComp = _classThis;
258
- })();
259
- Object.assign(StaticComp, { __isComponent: true, __isStateless: false });
260
- let BeforeComp = (() => {
261
- let _classDecorators = [Head({ title: "Before" })];
262
- let _classDescriptor;
263
- let _classExtraInitializers = [];
264
- let _classThis;
265
- let _classSuper = StatefulComponent;
266
- var BeforeComp = class extends _classSuper {
267
- static { _classThis = this; }
268
- static {
269
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
270
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
271
- BeforeComp = _classThis = _classDescriptor.value;
272
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
273
- __runInitializers(_classThis, _classExtraInitializers);
274
- }
275
- render() { return null; }
276
- };
277
- return BeforeComp = _classThis;
278
- })();
279
- Object.assign(BeforeComp, { __isComponent: true, __isStateless: false });
280
- describe("@Head decorator — static config", () => {
281
- it("applies head config on onMount", () => {
282
- const inst = new StaticComp({});
283
- inst.onMount?.();
284
- expect(document.title).toBe("Static Title");
285
- expect(document.querySelector('meta[name="description"]')?.content).toBe("Static desc");
286
- inst.onUnmount?.();
287
- });
288
- it("removes head config on onUnmount", () => {
289
- const inst = new BeforeComp({});
290
- inst.onMount?.();
291
- expect(document.title).toBe("Before");
292
- inst.onUnmount?.();
293
- expect(document.title).toBe("initial");
294
- });
295
- });
296
- describe("@Head decorator — reactive config", () => {
297
- it("updates document head when signal changes", async () => {
298
- const count = signal(0);
299
- let ReactiveComp = (() => {
300
- let _classDecorators = [Head((self) => ({ title: `Count: ${self.n()}` }))];
301
- let _classDescriptor;
302
- let _classExtraInitializers = [];
303
- let _classThis;
304
- let _classSuper = StatefulComponent;
305
- var ReactiveComp = class extends _classSuper {
306
- static { _classThis = this; }
307
- static {
308
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
309
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
310
- ReactiveComp = _classThis = _classDescriptor.value;
311
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
312
- __runInitializers(_classThis, _classExtraInitializers);
313
- }
314
- n = count;
315
- render() { return null; }
316
- };
317
- return ReactiveComp = _classThis;
318
- })();
319
- Object.assign(ReactiveComp, { __isComponent: true, __isStateless: false });
320
- const inst = new ReactiveComp({});
321
- inst.onMount?.();
322
- expect(document.title).toBe("Count: 0");
323
- count.set(5);
324
- await Promise.resolve();
325
- expect(document.title).toBe("Count: 5");
326
- inst.onUnmount?.();
327
- });
328
- it("stops tracking after onUnmount", async () => {
329
- const val = signal("a");
330
- let StopComp = (() => {
331
- let _classDecorators = [Head((self) => ({ title: self.v() }))];
332
- let _classDescriptor;
333
- let _classExtraInitializers = [];
334
- let _classThis;
335
- let _classSuper = StatefulComponent;
336
- var StopComp = class extends _classSuper {
337
- static { _classThis = this; }
338
- static {
339
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
340
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
341
- StopComp = _classThis = _classDescriptor.value;
342
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
343
- __runInitializers(_classThis, _classExtraInitializers);
344
- }
345
- v = val;
346
- render() { return null; }
347
- };
348
- return StopComp = _classThis;
349
- })();
350
- Object.assign(StopComp, { __isComponent: true, __isStateless: false });
351
- const inst = new StopComp({});
352
- inst.onMount?.();
353
- inst.onUnmount?.();
354
- val.set("b");
355
- await Promise.resolve();
356
- expect(document.title).not.toBe("b");
357
- });
358
- it("multiple instances — last mounted wins, cleanup restores previous", () => {
359
- const t1 = signal("Page A");
360
- const t2 = signal("Page B");
361
- let CompA = (() => {
362
- let _classDecorators = [Head((self) => ({ title: self.t() }))];
363
- let _classDescriptor;
364
- let _classExtraInitializers = [];
365
- let _classThis;
366
- let _classSuper = StatefulComponent;
367
- var CompA = class extends _classSuper {
368
- static { _classThis = this; }
369
- static {
370
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
371
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
372
- CompA = _classThis = _classDescriptor.value;
373
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
374
- __runInitializers(_classThis, _classExtraInitializers);
375
- }
376
- t = t1;
377
- render() { return null; }
378
- };
379
- return CompA = _classThis;
380
- })();
381
- Object.assign(CompA, { __isComponent: true, __isStateless: false });
382
- let CompB = (() => {
383
- let _classDecorators = [Head((self) => ({ title: self.t() }))];
384
- let _classDescriptor;
385
- let _classExtraInitializers = [];
386
- let _classThis;
387
- let _classSuper = StatefulComponent;
388
- var CompB = class extends _classSuper {
389
- static { _classThis = this; }
390
- static {
391
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
392
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
393
- CompB = _classThis = _classDescriptor.value;
394
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
395
- __runInitializers(_classThis, _classExtraInitializers);
396
- }
397
- t = t2;
398
- render() { return null; }
399
- };
400
- return CompB = _classThis;
401
- })();
402
- Object.assign(CompB, { __isComponent: true, __isStateless: false });
403
- const a = new CompA({});
404
- const b = new CompB({});
405
- a.onMount?.();
406
- expect(document.title).toBe("Page A");
407
- b.onMount?.();
408
- expect(document.title).toBe("Page B");
409
- b.onUnmount?.();
410
- expect(document.title).toBe("Page A");
411
- a.onUnmount?.();
412
- });
413
- it("full og: config is applied reactively", async () => {
414
- const slug = signal("hello");
415
- let OGComp = (() => {
416
- let _classDecorators = [Head((self) => ({
417
- og: { title: `Post: ${self.s()}`, url: `https://site.com/${self.s()}` },
418
- }))];
419
- let _classDescriptor;
420
- let _classExtraInitializers = [];
421
- let _classThis;
422
- let _classSuper = StatefulComponent;
423
- var OGComp = class extends _classSuper {
424
- static { _classThis = this; }
425
- static {
426
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
427
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
428
- OGComp = _classThis = _classDescriptor.value;
429
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
430
- __runInitializers(_classThis, _classExtraInitializers);
431
- }
432
- s = slug;
433
- render() { return null; }
434
- };
435
- return OGComp = _classThis;
436
- })();
437
- Object.assign(OGComp, { __isComponent: true, __isStateless: false });
438
- const inst = new OGComp({});
439
- inst.onMount?.();
440
- expect(document.querySelector('[property="og:title"]')?.getAttribute("content")).toBe("Post: hello");
441
- slug.set("world");
442
- await Promise.resolve();
443
- expect(document.querySelector('[property="og:title"]')?.getAttribute("content")).toBe("Post: world");
444
- inst.onUnmount?.();
445
- });
446
- it("getter is called only when deps change, not on every frame", async () => {
447
- const name = signal("Alice");
448
- const getter = vi.fn((self) => ({ title: self.n() }));
449
- let SpyComp = (() => {
450
- let _classDecorators = [Head(getter)];
451
- let _classDescriptor;
452
- let _classExtraInitializers = [];
453
- let _classThis;
454
- let _classSuper = StatefulComponent;
455
- var SpyComp = class extends _classSuper {
456
- static { _classThis = this; }
457
- static {
458
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
459
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
460
- SpyComp = _classThis = _classDescriptor.value;
461
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
462
- __runInitializers(_classThis, _classExtraInitializers);
463
- }
464
- n = name;
465
- render() { return null; }
466
- };
467
- return SpyComp = _classThis;
468
- })();
469
- Object.assign(SpyComp, { __isComponent: true, __isStateless: false });
470
- const inst = new SpyComp({});
471
- inst.onMount?.();
472
- expect(getter).toHaveBeenCalledTimes(1);
473
- name.set("Bob");
474
- await Promise.resolve();
475
- expect(getter).toHaveBeenCalledTimes(2);
476
- await Promise.resolve();
477
- expect(getter).toHaveBeenCalledTimes(2); // no extra calls
478
- inst.onUnmount?.();
479
- });
480
- });
481
- describe("head tag diffing", () => {
482
- const tags = () => [...document.head.querySelectorAll("[data-praxis-head]")];
483
- const byName = (name) => document.head.querySelector(`meta[name="${name}"]`);
484
- it("keeps tags that did not change and only replaces the ones that did", () => {
485
- const id = Symbol();
486
- pushHead(id, { description: "same", meta: [{ name: "robots", content: "index" }] });
487
- const description = byName("description");
488
- const robots = byName("robots");
489
- pushHead(id, { description: "same", meta: [{ name: "robots", content: "noindex" }] });
490
- expect(byName("description")).toBe(description);
491
- expect(byName("robots")).not.toBe(robots);
492
- expect(byName("robots")?.getAttribute("content")).toBe("noindex");
493
- expect(tags()).toHaveLength(2);
494
- });
495
- it("removes tags that are no longer in the config", () => {
496
- const id = Symbol();
497
- pushHead(id, { description: "d", canonical: "https://example.com/" });
498
- pushHead(id, { description: "d" });
499
- expect(document.head.querySelector('link[rel="canonical"]')).toBeNull();
500
- expect(byName("description")).not.toBeNull();
501
- });
502
- it("keeps identical repeated tags as separate elements", () => {
503
- const id = Symbol();
504
- pushHead(id, { meta: [{ name: "x", content: "1" }, { name: "x", content: "1" }] });
505
- expect(document.head.querySelectorAll('meta[name="x"]')).toHaveLength(2);
506
- pushHead(id, { meta: [{ name: "x", content: "1" }, { name: "x", content: "1" }] });
507
- expect(document.head.querySelectorAll('meta[name="x"]')).toHaveLength(2);
508
- });
509
- it("recreates a managed tag that was removed from the document", () => {
510
- const id = Symbol();
511
- pushHead(id, { description: "d" });
512
- byName("description")?.remove();
513
- pushHead(id, { description: "d" });
514
- expect(byName("description")?.getAttribute("content")).toBe("d");
515
- expect(tags()).toHaveLength(1);
516
- });
517
- it("sweeps managed-looking tags a prerender left behind", () => {
518
- const stale = document.createElement("meta");
519
- stale.setAttribute("name", "old");
520
- stale.setAttribute("data-praxis-head", "");
521
- document.head.appendChild(stale);
522
- pushHead(Symbol(), { description: "d" });
523
- expect(byName("old")).toBeNull();
524
- expect(byName("description")).not.toBeNull();
525
- });
526
- it("restores the title and removes every tag once the last entry is gone", () => {
527
- const id = Symbol();
528
- pushHead(id, { title: "Page", description: "d" });
529
- removeHead(id);
530
- expect(document.title).toBe("initial");
531
- expect(tags()).toHaveLength(0);
532
- });
533
- it("a nested entry's tags replace the outer ones and the outer ones come back on removal", () => {
534
- const outer = Symbol();
535
- const inner = Symbol();
536
- pushHead(outer, { description: "outer" });
537
- pushHead(inner, { description: "inner" });
538
- expect(byName("description")?.getAttribute("content")).toBe("inner");
539
- removeHead(inner);
540
- expect(byName("description")?.getAttribute("content")).toBe("outer");
541
- expect(tags()).toHaveLength(1);
542
- });
543
- });
544
- //# sourceMappingURL=head.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"head.test.js","sourceRoot":"","sources":["../../src/__tests__/head.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=internal.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/internal.test.ts"],"names":[],"mappings":""}
@@ -1,32 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect } from "vitest";
3
- import { pushHead, removeHead } from "../head-stack";
4
- import { resetHeadState } from "../internal";
5
- describe("@praxisjs/head/internal", () => {
6
- it("exports resetHeadState, which removes managed head elements", () => {
7
- document.head.innerHTML = "";
8
- pushHead(Symbol("page"), { title: "pushed", description: "desc" });
9
- expect(document.head.querySelectorAll("[data-praxis-head]").length).toBeGreaterThan(0);
10
- resetHeadState();
11
- expect(document.head.querySelectorAll("[data-praxis-head]")).toHaveLength(0);
12
- });
13
- it("forgets the remembered initial title, so the next page's baseline is captured fresh", () => {
14
- // Without resetHeadState between "pages", the initial title is only ever
15
- // captured once (pushHead's `_initialTitle ??=`) — exactly the leak an
16
- // @praxisjs/ssg prerender run (many render() calls, one Node process)
17
- // needs this export to avoid between routes.
18
- document.head.innerHTML = "";
19
- document.title = "page A";
20
- const idA = Symbol("a");
21
- pushHead(idA, { title: "A" });
22
- removeHead(idA);
23
- expect(document.title).toBe("page A");
24
- resetHeadState();
25
- document.title = "page B";
26
- const idB = Symbol("b");
27
- pushHead(idB, { title: "B" });
28
- removeHead(idB);
29
- expect(document.title).toBe("page B");
30
- });
31
- });
32
- //# sourceMappingURL=internal.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal.test.js","sourceRoot":"","sources":["../../src/__tests__/internal.test.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEvF,cAAc,EAAE,CAAC;QAEjB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,yEAAyE;QACzE,uEAAuE;QACvE,sEAAsE;QACtE,6CAA6C;QAC7C,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAC7B,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtC,cAAc,EAAE,CAAC;QAEjB,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}