unhead 2.0.17 → 2.0.18

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/client.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { R as ResolvableHead, q as CreateClientHeadOptions, U as Unhead, G as RenderDomHeadOptions } from './shared/unhead.BxIzrSMV.mjs';
1
+ import { R as ResolvableHead, r as CreateClientHeadOptions, U as Unhead, I as RenderDomHeadOptions } from './shared/unhead.Prz0gZXE.mjs';
2
2
  import 'hookable';
3
3
 
4
4
  declare function createHead<T = ResolvableHead>(options?: CreateClientHeadOptions): Unhead<T>;
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { R as ResolvableHead, q as CreateClientHeadOptions, U as Unhead, G as RenderDomHeadOptions } from './shared/unhead.BxIzrSMV.js';
1
+ import { R as ResolvableHead, r as CreateClientHeadOptions, U as Unhead, I as RenderDomHeadOptions } from './shared/unhead.Prz0gZXE.js';
2
2
  import 'hookable';
3
3
 
4
4
  declare function createHead<T = ResolvableHead>(options?: CreateClientHeadOptions): Unhead<T>;
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { H as HeadSafe } from './shared/unhead.DcRvKVx9.mjs';
2
- import { U as Unhead, R as ResolvableHead, r as HeadEntryOptions, o as ActiveHeadEntry, a8 as UseSeoMetaInput, C as CreateHeadOptions } from './shared/unhead.BxIzrSMV.mjs';
3
- export { u as useScript } from './shared/unhead.YQlj2HXR.mjs';
1
+ import { H as HeadSafe } from './shared/unhead.Ctcwz9O1.mjs';
2
+ import { U as Unhead, R as ResolvableHead, s as HeadEntryOptions, p as ActiveHeadEntry, a8 as UseSeoMetaInput, C as CreateHeadOptions } from './shared/unhead.Prz0gZXE.mjs';
3
+ export { u as useScript } from './shared/unhead.CnYfgE7E.mjs';
4
4
  import 'hookable';
5
5
 
6
6
  declare function useHead<T extends Unhead<any>, I = ResolvableHead>(unhead: T, input?: ResolvableHead, options?: HeadEntryOptions): ActiveHeadEntry<I>;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { H as HeadSafe } from './shared/unhead.BzieZHWV.js';
2
- import { U as Unhead, R as ResolvableHead, r as HeadEntryOptions, o as ActiveHeadEntry, a8 as UseSeoMetaInput, C as CreateHeadOptions } from './shared/unhead.BxIzrSMV.js';
3
- export { u as useScript } from './shared/unhead.jgc6RGmf.js';
1
+ import { H as HeadSafe } from './shared/unhead.DQUgqVjB.js';
2
+ import { U as Unhead, R as ResolvableHead, s as HeadEntryOptions, p as ActiveHeadEntry, a8 as UseSeoMetaInput, C as CreateHeadOptions } from './shared/unhead.Prz0gZXE.js';
3
+ export { u as useScript } from './shared/unhead.kTflSlNr.js';
4
4
  import 'hookable';
5
5
 
6
6
  declare function useHead<T extends Unhead<any>, I = ResolvableHead>(unhead: T, input?: ResolvableHead, options?: HeadEntryOptions): ActiveHeadEntry<I>;
package/dist/legacy.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { createUnhead } from './index.mjs';
2
2
  export { useHead, useHeadSafe, useSeoMeta, useServerHead, useServerHeadSafe, useServerSeoMeta } from './index.mjs';
3
- import { U as Unhead, R as ResolvableHead, C as CreateHeadOptions } from './shared/unhead.BxIzrSMV.mjs';
4
- export { u as useScript } from './shared/unhead.YQlj2HXR.mjs';
5
- import './shared/unhead.DcRvKVx9.mjs';
3
+ import { U as Unhead, R as ResolvableHead, C as CreateHeadOptions } from './shared/unhead.Prz0gZXE.mjs';
4
+ export { u as useScript } from './shared/unhead.CnYfgE7E.mjs';
5
+ import './shared/unhead.Ctcwz9O1.mjs';
6
6
  import 'hookable';
7
7
 
8
8
  declare const activeHead: {
package/dist/legacy.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { createUnhead } from './index.js';
2
2
  export { useHead, useHeadSafe, useSeoMeta, useServerHead, useServerHeadSafe, useServerSeoMeta } from './index.js';
3
- import { U as Unhead, R as ResolvableHead, C as CreateHeadOptions } from './shared/unhead.BxIzrSMV.js';
4
- export { u as useScript } from './shared/unhead.jgc6RGmf.js';
5
- import './shared/unhead.BzieZHWV.js';
3
+ import { U as Unhead, R as ResolvableHead, C as CreateHeadOptions } from './shared/unhead.Prz0gZXE.js';
4
+ export { u as useScript } from './shared/unhead.kTflSlNr.js';
5
+ import './shared/unhead.DQUgqVjB.js';
6
6
  import 'hookable';
7
7
 
8
8
  declare const activeHead: {
@@ -0,0 +1,54 @@
1
+ import { S as SerializableHead } from './shared/unhead.Prz0gZXE.mjs';
2
+ import 'hookable';
3
+
4
+ declare const TagIdMap: {
5
+ readonly html: 0;
6
+ readonly head: 1;
7
+ readonly title: 4;
8
+ readonly meta: 5;
9
+ readonly body: 44;
10
+ readonly script: 52;
11
+ readonly style: 53;
12
+ readonly link: 54;
13
+ readonly base: 56;
14
+ };
15
+ interface PreparedHtmlTemplate {
16
+ html: string;
17
+ input: SerializableHead;
18
+ }
19
+ interface PreparedHtmlTemplateWithIndexes {
20
+ html: string;
21
+ input: SerializableHead;
22
+ indexes: {
23
+ htmlTagStart: number;
24
+ htmlTagEnd: number;
25
+ headTagEnd: number;
26
+ bodyTagStart: number;
27
+ bodyTagEnd: number;
28
+ bodyCloseTagStart: number;
29
+ };
30
+ }
31
+ /**
32
+ * Parse HTML attributes string into key-value object
33
+ */
34
+ declare function parseAttributes(attrStr: string): Record<string, string>;
35
+ /**
36
+ * Parse HTML to find tag indexes without extracting head elements
37
+ * Used for transformHtmlTemplateRaw where we don't want to extract existing head content
38
+ */
39
+ declare function parseHtmlForIndexes(html: string): PreparedHtmlTemplateWithIndexes;
40
+ declare function parseHtmlForUnheadExtraction(html: string): PreparedHtmlTemplateWithIndexes;
41
+ /**
42
+ * Optimized HTML construction function that uses indexes instead of string.replace()
43
+ * This avoids searching through the entire HTML
44
+ */
45
+ declare function applyHeadToHtml(template: PreparedHtmlTemplateWithIndexes, headHtml: {
46
+ htmlAttrs: string;
47
+ headTags: string;
48
+ bodyAttrs: string;
49
+ bodyTagsOpen?: string;
50
+ bodyTags: string;
51
+ }): string;
52
+
53
+ export { TagIdMap, applyHeadToHtml, parseAttributes, parseHtmlForIndexes, parseHtmlForUnheadExtraction };
54
+ export type { PreparedHtmlTemplate, PreparedHtmlTemplateWithIndexes };
@@ -0,0 +1,54 @@
1
+ import { S as SerializableHead } from './shared/unhead.Prz0gZXE.js';
2
+ import 'hookable';
3
+
4
+ declare const TagIdMap: {
5
+ readonly html: 0;
6
+ readonly head: 1;
7
+ readonly title: 4;
8
+ readonly meta: 5;
9
+ readonly body: 44;
10
+ readonly script: 52;
11
+ readonly style: 53;
12
+ readonly link: 54;
13
+ readonly base: 56;
14
+ };
15
+ interface PreparedHtmlTemplate {
16
+ html: string;
17
+ input: SerializableHead;
18
+ }
19
+ interface PreparedHtmlTemplateWithIndexes {
20
+ html: string;
21
+ input: SerializableHead;
22
+ indexes: {
23
+ htmlTagStart: number;
24
+ htmlTagEnd: number;
25
+ headTagEnd: number;
26
+ bodyTagStart: number;
27
+ bodyTagEnd: number;
28
+ bodyCloseTagStart: number;
29
+ };
30
+ }
31
+ /**
32
+ * Parse HTML attributes string into key-value object
33
+ */
34
+ declare function parseAttributes(attrStr: string): Record<string, string>;
35
+ /**
36
+ * Parse HTML to find tag indexes without extracting head elements
37
+ * Used for transformHtmlTemplateRaw where we don't want to extract existing head content
38
+ */
39
+ declare function parseHtmlForIndexes(html: string): PreparedHtmlTemplateWithIndexes;
40
+ declare function parseHtmlForUnheadExtraction(html: string): PreparedHtmlTemplateWithIndexes;
41
+ /**
42
+ * Optimized HTML construction function that uses indexes instead of string.replace()
43
+ * This avoids searching through the entire HTML
44
+ */
45
+ declare function applyHeadToHtml(template: PreparedHtmlTemplateWithIndexes, headHtml: {
46
+ htmlAttrs: string;
47
+ headTags: string;
48
+ bodyAttrs: string;
49
+ bodyTagsOpen?: string;
50
+ bodyTags: string;
51
+ }): string;
52
+
53
+ export { TagIdMap, applyHeadToHtml, parseAttributes, parseHtmlForIndexes, parseHtmlForUnheadExtraction };
54
+ export type { PreparedHtmlTemplate, PreparedHtmlTemplateWithIndexes };
@@ -0,0 +1,508 @@
1
+ const TAG_HTML = 0;
2
+ const TAG_HEAD = 1;
3
+ const TAG_TITLE = 4;
4
+ const TAG_META = 5;
5
+ const TAG_BODY = 44;
6
+ const TAG_SCRIPT = 52;
7
+ const TAG_STYLE = 53;
8
+ const TAG_LINK = 54;
9
+ const TAG_BASE = 56;
10
+ const LT_CHAR = 60;
11
+ const GT_CHAR = 62;
12
+ const SLASH_CHAR = 47;
13
+ const EQUALS_CHAR = 61;
14
+ const QUOTE_CHAR = 34;
15
+ const APOS_CHAR = 39;
16
+ const EXCLAMATION_CHAR = 33;
17
+ const BACKSLASH_CHAR = 92;
18
+ const DASH_CHAR = 45;
19
+ const TagIdMap = {
20
+ html: TAG_HTML,
21
+ head: TAG_HEAD,
22
+ title: TAG_TITLE,
23
+ meta: TAG_META,
24
+ body: TAG_BODY,
25
+ script: TAG_SCRIPT,
26
+ style: TAG_STYLE,
27
+ link: TAG_LINK,
28
+ base: TAG_BASE
29
+ };
30
+ function isWhitespace(charCode) {
31
+ return charCode === 32 || charCode === 9 || charCode === 10 || charCode === 13;
32
+ }
33
+ function processCommentOrDoctype(htmlChunk, position) {
34
+ let i = position;
35
+ const chunkLength = htmlChunk.length;
36
+ if (i + 3 < chunkLength && htmlChunk.charCodeAt(i + 2) === DASH_CHAR && htmlChunk.charCodeAt(i + 3) === DASH_CHAR) {
37
+ i += 4;
38
+ while (i < chunkLength - 2) {
39
+ if (htmlChunk.charCodeAt(i) === DASH_CHAR && htmlChunk.charCodeAt(i + 1) === DASH_CHAR && htmlChunk.charCodeAt(i + 2) === GT_CHAR) {
40
+ i += 3;
41
+ return {
42
+ complete: true,
43
+ newPosition: i,
44
+ remainingText: ""
45
+ };
46
+ }
47
+ i++;
48
+ }
49
+ return {
50
+ complete: false,
51
+ newPosition: position,
52
+ remainingText: htmlChunk.substring(position)
53
+ };
54
+ } else {
55
+ i += 2;
56
+ while (i < chunkLength) {
57
+ if (htmlChunk.charCodeAt(i) === GT_CHAR) {
58
+ i++;
59
+ return {
60
+ complete: true,
61
+ newPosition: i,
62
+ remainingText: ""
63
+ };
64
+ }
65
+ i++;
66
+ }
67
+ return {
68
+ complete: false,
69
+ newPosition: i,
70
+ remainingText: htmlChunk.substring(position, i)
71
+ };
72
+ }
73
+ }
74
+ function parseAttributes(attrStr) {
75
+ if (!attrStr)
76
+ return {};
77
+ const result = {};
78
+ const len = attrStr.length;
79
+ let i = 0;
80
+ const WHITESPACE = 0;
81
+ const NAME = 1;
82
+ const AFTER_NAME = 2;
83
+ const BEFORE_VALUE = 3;
84
+ const QUOTED_VALUE = 4;
85
+ const UNQUOTED_VALUE = 5;
86
+ let state = WHITESPACE;
87
+ let nameStart = 0;
88
+ let nameEnd = 0;
89
+ let valueStart = 0;
90
+ let quoteChar = 0;
91
+ let name = "";
92
+ while (i < len) {
93
+ const charCode = attrStr.charCodeAt(i);
94
+ const isSpace = isWhitespace(charCode);
95
+ switch (state) {
96
+ case WHITESPACE:
97
+ if (!isSpace) {
98
+ state = NAME;
99
+ nameStart = i;
100
+ nameEnd = 0;
101
+ }
102
+ break;
103
+ case NAME:
104
+ if (charCode === EQUALS_CHAR || isSpace) {
105
+ nameEnd = i;
106
+ name = attrStr.substring(nameStart, nameEnd).toLowerCase();
107
+ state = charCode === EQUALS_CHAR ? BEFORE_VALUE : AFTER_NAME;
108
+ }
109
+ break;
110
+ case AFTER_NAME:
111
+ if (charCode === EQUALS_CHAR) {
112
+ state = BEFORE_VALUE;
113
+ } else if (!isSpace) {
114
+ result[name] = "";
115
+ state = NAME;
116
+ nameStart = i;
117
+ nameEnd = 0;
118
+ }
119
+ break;
120
+ case BEFORE_VALUE:
121
+ if (charCode === QUOTE_CHAR || charCode === APOS_CHAR) {
122
+ quoteChar = charCode;
123
+ state = QUOTED_VALUE;
124
+ valueStart = i + 1;
125
+ } else if (!isSpace) {
126
+ state = UNQUOTED_VALUE;
127
+ valueStart = i;
128
+ }
129
+ break;
130
+ case QUOTED_VALUE:
131
+ if (charCode === BACKSLASH_CHAR && i + 1 < len) {
132
+ i++;
133
+ } else if (charCode === quoteChar) {
134
+ result[name] = attrStr.substring(valueStart, i);
135
+ state = WHITESPACE;
136
+ }
137
+ break;
138
+ case UNQUOTED_VALUE:
139
+ if (isSpace || charCode === GT_CHAR) {
140
+ result[name] = attrStr.substring(valueStart, i);
141
+ state = WHITESPACE;
142
+ }
143
+ break;
144
+ }
145
+ i++;
146
+ }
147
+ if (state === QUOTED_VALUE || state === UNQUOTED_VALUE) {
148
+ if (name) {
149
+ result[name] = attrStr.substring(valueStart, i);
150
+ }
151
+ } else if (state === NAME || state === AFTER_NAME || state === BEFORE_VALUE) {
152
+ nameEnd = nameEnd || i;
153
+ const currentName = attrStr.substring(nameStart, nameEnd).toLowerCase();
154
+ if (currentName) {
155
+ result[currentName] = "";
156
+ }
157
+ }
158
+ return result;
159
+ }
160
+ function parseHtmlForIndexes(html) {
161
+ const indexes = {
162
+ htmlTagStart: html.indexOf("<html"),
163
+ htmlTagEnd: -1,
164
+ headTagEnd: html.indexOf("</head>"),
165
+ bodyTagStart: html.indexOf("<body"),
166
+ bodyTagEnd: -1,
167
+ bodyCloseTagStart: html.indexOf("</body>")
168
+ };
169
+ if (indexes.htmlTagStart >= 0) {
170
+ const htmlTagEndPos = html.indexOf(">", indexes.htmlTagStart);
171
+ if (htmlTagEndPos >= 0) {
172
+ indexes.htmlTagEnd = htmlTagEndPos + 1;
173
+ }
174
+ }
175
+ if (indexes.bodyTagStart >= 0) {
176
+ const bodyTagEndPos = html.indexOf(">", indexes.bodyTagStart);
177
+ if (bodyTagEndPos >= 0) {
178
+ indexes.bodyTagEnd = bodyTagEndPos + 1;
179
+ }
180
+ }
181
+ return { html, input: {}, indexes };
182
+ }
183
+ function parseHtmlForUnheadExtraction(html) {
184
+ const input = {};
185
+ const htmlParts = [];
186
+ let position = 0;
187
+ let inHead = false;
188
+ let foundBodyStart = false;
189
+ let lastCopyPosition = 0;
190
+ let currentOutputLength = 0;
191
+ const indexes = {
192
+ htmlTagStart: -1,
193
+ htmlTagEnd: -1,
194
+ headTagEnd: -1,
195
+ bodyTagStart: -1,
196
+ bodyTagEnd: -1,
197
+ bodyCloseTagStart: -1
198
+ };
199
+ const headElementsToExtract = /* @__PURE__ */ new Set([TAG_TITLE, TAG_META, TAG_LINK, TAG_SCRIPT, TAG_STYLE, TAG_BASE]);
200
+ function copyAccumulatedText() {
201
+ if (lastCopyPosition < position) {
202
+ const textToAdd = html.substring(lastCopyPosition, position);
203
+ htmlParts.push(textToAdd);
204
+ currentOutputLength += textToAdd.length;
205
+ lastCopyPosition = position;
206
+ }
207
+ }
208
+ function addText(text) {
209
+ htmlParts.push(text);
210
+ currentOutputLength += text.length;
211
+ }
212
+ while (position < html.length && !foundBodyStart) {
213
+ const currentCharCode = html.charCodeAt(position);
214
+ if (currentCharCode !== LT_CHAR) {
215
+ position++;
216
+ continue;
217
+ }
218
+ if (position + 1 >= html.length) {
219
+ copyAccumulatedText();
220
+ addText(html[position]);
221
+ break;
222
+ }
223
+ const nextCharCode = html.charCodeAt(position + 1);
224
+ if (nextCharCode === EXCLAMATION_CHAR) {
225
+ const result = processCommentOrDoctype(html, position);
226
+ if (result.complete) {
227
+ copyAccumulatedText();
228
+ addText(html.substring(position, result.newPosition));
229
+ position = result.newPosition;
230
+ lastCopyPosition = position;
231
+ } else {
232
+ copyAccumulatedText();
233
+ addText(html.substring(position));
234
+ break;
235
+ }
236
+ continue;
237
+ }
238
+ if (nextCharCode === SLASH_CHAR) {
239
+ let tagEnd2 = position + 2;
240
+ while (tagEnd2 < html.length && html.charCodeAt(tagEnd2) !== GT_CHAR) {
241
+ tagEnd2++;
242
+ }
243
+ if (tagEnd2 >= html.length) {
244
+ copyAccumulatedText();
245
+ addText(html.substring(position));
246
+ break;
247
+ }
248
+ const tagName2 = html.substring(position + 2, tagEnd2).toLowerCase().trim();
249
+ const tagId2 = TagIdMap[tagName2] ?? -1;
250
+ if (tagId2 === TAG_HEAD) {
251
+ inHead = false;
252
+ copyAccumulatedText();
253
+ const headCloseStart = currentOutputLength;
254
+ addText(html.substring(position, tagEnd2 + 1));
255
+ indexes.headTagEnd = headCloseStart;
256
+ } else {
257
+ copyAccumulatedText();
258
+ addText(html.substring(position, tagEnd2 + 1));
259
+ }
260
+ position = tagEnd2 + 1;
261
+ lastCopyPosition = position;
262
+ continue;
263
+ }
264
+ const tagStart = position + 1;
265
+ let tagNameEnd = tagStart;
266
+ while (tagNameEnd < html.length) {
267
+ const c = html.charCodeAt(tagNameEnd);
268
+ if (isWhitespace(c) || c === SLASH_CHAR || c === GT_CHAR) {
269
+ break;
270
+ }
271
+ tagNameEnd++;
272
+ }
273
+ if (tagNameEnd >= html.length) {
274
+ copyAccumulatedText();
275
+ addText(html.substring(position));
276
+ break;
277
+ }
278
+ const tagName = html.substring(tagStart, tagNameEnd).toLowerCase();
279
+ const tagId = TagIdMap[tagName] ?? -1;
280
+ let tagEnd = tagNameEnd;
281
+ let inQuote = false;
282
+ let quoteChar = 0;
283
+ let foundEnd = false;
284
+ let isSelfClosing = false;
285
+ while (tagEnd < html.length && !foundEnd) {
286
+ const c = html.charCodeAt(tagEnd);
287
+ if (inQuote) {
288
+ if (c === quoteChar) {
289
+ inQuote = false;
290
+ }
291
+ } else if (c === QUOTE_CHAR || c === APOS_CHAR) {
292
+ inQuote = true;
293
+ quoteChar = c;
294
+ } else if (c === SLASH_CHAR && tagEnd + 1 < html.length && html.charCodeAt(tagEnd + 1) === GT_CHAR) {
295
+ isSelfClosing = true;
296
+ tagEnd += 2;
297
+ foundEnd = true;
298
+ continue;
299
+ } else if (c === GT_CHAR) {
300
+ tagEnd++;
301
+ foundEnd = true;
302
+ continue;
303
+ }
304
+ tagEnd++;
305
+ }
306
+ if (!foundEnd) {
307
+ copyAccumulatedText();
308
+ addText(html.substring(position));
309
+ break;
310
+ }
311
+ const attributesStr = html.substring(tagNameEnd, tagEnd - (isSelfClosing ? 2 : 1)).trim();
312
+ const attributes = parseAttributes(attributesStr);
313
+ if (tagId === TAG_HTML) {
314
+ copyAccumulatedText();
315
+ indexes.htmlTagStart = currentOutputLength;
316
+ if (Object.keys(attributes).length > 0) {
317
+ input.htmlAttrs = attributes;
318
+ addText(`<${tagName}>`);
319
+ } else {
320
+ addText(html.substring(position, tagEnd));
321
+ }
322
+ indexes.htmlTagEnd = currentOutputLength;
323
+ } else if (tagId === TAG_BODY) {
324
+ copyAccumulatedText();
325
+ indexes.bodyTagStart = currentOutputLength;
326
+ if (Object.keys(attributes).length > 0) {
327
+ input.bodyAttrs = attributes;
328
+ addText(`<${tagName}>`);
329
+ } else {
330
+ addText(html.substring(position, tagEnd));
331
+ }
332
+ indexes.bodyTagEnd = currentOutputLength;
333
+ foundBodyStart = true;
334
+ position = tagEnd;
335
+ lastCopyPosition = position;
336
+ break;
337
+ } else if (tagId === TAG_HEAD) {
338
+ inHead = true;
339
+ copyAccumulatedText();
340
+ addText(html.substring(position, tagEnd));
341
+ } else if (inHead && headElementsToExtract.has(tagId)) {
342
+ if (tagId === TAG_TITLE) {
343
+ if (!isSelfClosing) {
344
+ const titleEnd = findClosingTag(html, tagEnd, tagName);
345
+ if (titleEnd !== -1) {
346
+ const titleContent = html.substring(tagEnd, titleEnd).trim();
347
+ if (titleContent && !input.title) {
348
+ input.title = titleContent;
349
+ }
350
+ position = findTagEnd(html, titleEnd, tagName);
351
+ lastCopyPosition = position;
352
+ continue;
353
+ }
354
+ }
355
+ } else if (tagId === TAG_SCRIPT) {
356
+ const scriptAttrs = { ...attributes };
357
+ if (!isSelfClosing) {
358
+ const scriptEnd = findClosingTag(html, tagEnd, tagName);
359
+ if (scriptEnd !== -1) {
360
+ const scriptContent = html.substring(tagEnd, scriptEnd);
361
+ scriptAttrs.innerHTML = scriptContent || "";
362
+ position = findTagEnd(html, scriptEnd, tagName);
363
+ } else {
364
+ scriptAttrs.innerHTML = "";
365
+ position = tagEnd;
366
+ }
367
+ } else {
368
+ scriptAttrs.innerHTML = "";
369
+ position = tagEnd;
370
+ }
371
+ lastCopyPosition = position;
372
+ (input.script ||= []).push(scriptAttrs);
373
+ continue;
374
+ } else if (tagId === TAG_STYLE) {
375
+ const styleAttrs = { ...attributes };
376
+ if (!isSelfClosing) {
377
+ const styleEnd = findClosingTag(html, tagEnd, tagName);
378
+ if (styleEnd !== -1) {
379
+ const styleContent = html.substring(tagEnd, styleEnd);
380
+ styleAttrs.textContent = styleContent || "";
381
+ position = findTagEnd(html, styleEnd, tagName);
382
+ } else {
383
+ styleAttrs.textContent = "";
384
+ position = tagEnd;
385
+ }
386
+ } else {
387
+ styleAttrs.textContent = "";
388
+ position = tagEnd;
389
+ }
390
+ lastCopyPosition = position;
391
+ (input.style ||= []).push(styleAttrs);
392
+ continue;
393
+ } else if (tagId === TAG_META) {
394
+ (input.meta ||= []).push(attributes);
395
+ position = tagEnd;
396
+ lastCopyPosition = position;
397
+ continue;
398
+ } else if (tagId === TAG_LINK) {
399
+ (input.link ||= []).push(attributes);
400
+ position = tagEnd;
401
+ lastCopyPosition = position;
402
+ continue;
403
+ } else if (tagId === TAG_BASE && !input.base) {
404
+ input.base = attributes;
405
+ position = tagEnd;
406
+ lastCopyPosition = position;
407
+ continue;
408
+ }
409
+ } else {
410
+ copyAccumulatedText();
411
+ addText(html.substring(position, tagEnd));
412
+ }
413
+ position = tagEnd;
414
+ lastCopyPosition = position;
415
+ }
416
+ const remainingHtml = html.substring(position);
417
+ const bodyCloseIndex = remainingHtml.indexOf("</body>");
418
+ if (bodyCloseIndex !== -1) {
419
+ indexes.bodyCloseTagStart = currentOutputLength + bodyCloseIndex;
420
+ }
421
+ copyAccumulatedText();
422
+ addText(remainingHtml);
423
+ return { html: htmlParts.join(""), input, indexes };
424
+ }
425
+ function findClosingTag(html, startPos, tagName) {
426
+ const tagId = TagIdMap[tagName];
427
+ const isScriptOrStyle = tagId === TAG_SCRIPT || tagId === TAG_STYLE;
428
+ if (!isScriptOrStyle) {
429
+ const closingTag2 = `</${tagName}`;
430
+ const index = html.indexOf(closingTag2, startPos);
431
+ return index === -1 ? -1 : index;
432
+ }
433
+ const closingTag = `</${tagName}`;
434
+ let pos = startPos;
435
+ let inSingleQuote = false;
436
+ let inDoubleQuote = false;
437
+ let inBacktick = false;
438
+ let lastCharWasBackslash = false;
439
+ while (pos < html.length) {
440
+ const currentCharCode = html.charCodeAt(pos);
441
+ if (!lastCharWasBackslash) {
442
+ if (currentCharCode === APOS_CHAR && !inDoubleQuote && !inBacktick) {
443
+ inSingleQuote = !inSingleQuote;
444
+ } else if (currentCharCode === QUOTE_CHAR && !inSingleQuote && !inBacktick) {
445
+ inDoubleQuote = !inDoubleQuote;
446
+ } else if (currentCharCode === 96 && !inSingleQuote && !inDoubleQuote) {
447
+ inBacktick = !inBacktick;
448
+ }
449
+ }
450
+ lastCharWasBackslash = currentCharCode === BACKSLASH_CHAR && !lastCharWasBackslash;
451
+ const inQuotes = inSingleQuote || inDoubleQuote || inBacktick;
452
+ if (!inQuotes && html.startsWith(closingTag, pos)) {
453
+ const afterTagPos = pos + closingTag.length;
454
+ if (afterTagPos >= html.length) {
455
+ return pos;
456
+ }
457
+ const nextChar = html.charCodeAt(afterTagPos);
458
+ if (nextChar === GT_CHAR || isWhitespace(nextChar)) {
459
+ return pos;
460
+ }
461
+ }
462
+ pos++;
463
+ }
464
+ return -1;
465
+ }
466
+ function findTagEnd(html, closingTagStart, tagName) {
467
+ let pos = closingTagStart + tagName.length + 2;
468
+ while (pos < html.length && html.charCodeAt(pos) !== GT_CHAR) {
469
+ pos++;
470
+ }
471
+ return pos < html.length ? pos + 1 : pos;
472
+ }
473
+ function applyHeadToHtml(template, headHtml) {
474
+ const { html, indexes } = template;
475
+ const parts = [];
476
+ let lastIndex = 0;
477
+ if (indexes.htmlTagStart >= 0) {
478
+ parts.push(html.substring(lastIndex, indexes.htmlTagStart));
479
+ parts.push(`<html${headHtml.htmlAttrs}>`);
480
+ lastIndex = indexes.htmlTagEnd;
481
+ }
482
+ if (indexes.headTagEnd >= 0) {
483
+ parts.push(html.substring(lastIndex, indexes.headTagEnd));
484
+ parts.push(headHtml.headTags);
485
+ parts.push("</head>");
486
+ lastIndex = indexes.headTagEnd + 7;
487
+ }
488
+ if (indexes.bodyTagStart >= 0) {
489
+ parts.push(html.substring(lastIndex, indexes.bodyTagStart));
490
+ if (headHtml.bodyTagsOpen) {
491
+ parts.push(`<body${headHtml.bodyAttrs}>
492
+ ${headHtml.bodyTagsOpen}`);
493
+ } else {
494
+ parts.push(`<body${headHtml.bodyAttrs}>`);
495
+ }
496
+ lastIndex = indexes.bodyTagEnd;
497
+ }
498
+ if (indexes.bodyCloseTagStart >= 0) {
499
+ parts.push(html.substring(lastIndex, indexes.bodyCloseTagStart));
500
+ parts.push(headHtml.bodyTags);
501
+ parts.push(html.substring(indexes.bodyCloseTagStart));
502
+ } else {
503
+ parts.push(html.substring(lastIndex));
504
+ }
505
+ return parts.join("");
506
+ }
507
+
508
+ export { TagIdMap, applyHeadToHtml, parseAttributes, parseHtmlForIndexes, parseHtmlForUnheadExtraction };
@@ -1,4 +1,4 @@
1
- import { m as HeadPluginInput, U as Unhead, l as HeadPluginOptions } from './shared/unhead.BxIzrSMV.mjs';
1
+ import { n as HeadPluginInput, U as Unhead, m as HeadPluginOptions } from './shared/unhead.Prz0gZXE.mjs';
2
2
  import 'hookable';
3
3
 
4
4
  declare const AliasSortingPlugin: HeadPluginInput;
package/dist/plugins.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { m as HeadPluginInput, U as Unhead, l as HeadPluginOptions } from './shared/unhead.BxIzrSMV.js';
1
+ import { n as HeadPluginInput, U as Unhead, m as HeadPluginOptions } from './shared/unhead.Prz0gZXE.js';
2
2
  import 'hookable';
3
3
 
4
4
  declare const AliasSortingPlugin: HeadPluginInput;