reroute-js 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/cli/bin.d.ts +1 -1
  2. package/cli/bin.js +183 -25
  3. package/cli/bin.js.map +6 -6
  4. package/cli/index.d.ts +1 -1
  5. package/cli/index.js +4 -4
  6. package/cli/index.js.map +1 -1
  7. package/cli/src/cli.d.ts +1 -1
  8. package/cli/src/commands/analyze.d.ts +1 -1
  9. package/cli/src/commands/build.d.ts +1 -1
  10. package/cli/src/commands/dev.d.ts +1 -1
  11. package/cli/src/commands/gen.d.ts +1 -1
  12. package/cli/src/commands/index.d.ts +1 -1
  13. package/cli/src/commands/init.d.ts +1 -1
  14. package/cli/src/commands/lib/assets.d.ts +1 -1
  15. package/cli/src/commands/lib/bundler.d.ts +1 -1
  16. package/cli/src/commands/lib/command.d.ts +1 -1
  17. package/cli/src/commands/lib/env.d.ts +1 -1
  18. package/cli/src/commands/lib/index.d.ts +1 -1
  19. package/cli/src/commands/lib/log.d.ts +1 -1
  20. package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
  21. package/cli/src/commands/lib/markdown/index.d.ts +1 -1
  22. package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
  23. package/cli/src/commands/lib/production.d.ts +1 -1
  24. package/cli/src/commands/lib/server.d.ts +1 -1
  25. package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
  26. package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
  27. package/cli/src/commands/lib/tailwind.d.ts +1 -1
  28. package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
  29. package/cli/src/commands/lib/version.d.ts +1 -1
  30. package/cli/src/commands/og.d.ts +1 -1
  31. package/cli/src/commands/start.d.ts +1 -1
  32. package/cli/src/index.d.ts +1 -1
  33. package/core/index.d.ts +1 -1
  34. package/core/index.js +179 -21
  35. package/core/index.js.map +6 -6
  36. package/core/src/bundler/hash.d.ts +1 -1
  37. package/core/src/bundler/index.d.ts +1 -1
  38. package/core/src/config.d.ts +81 -5
  39. package/core/src/config.d.ts.map +1 -1
  40. package/core/src/content/discovery.d.ts +1 -1
  41. package/core/src/content/index.d.ts +1 -1
  42. package/core/src/content/metadata.d.ts +1 -1
  43. package/core/src/index.d.ts +1 -1
  44. package/core/src/llms/extractor.d.ts +1 -1
  45. package/core/src/llms/formatter.d.ts +1 -1
  46. package/core/src/llms/full-generator.d.ts +1 -1
  47. package/core/src/llms/index-generator.d.ts +1 -1
  48. package/core/src/llms/index.d.ts +1 -1
  49. package/core/src/og/discovery.d.ts +1 -1
  50. package/core/src/og/index.d.ts +1 -1
  51. package/core/src/og/meta.d.ts +1 -1
  52. package/core/src/og/render.d.ts +1 -1
  53. package/core/src/og/types.d.ts +1 -1
  54. package/core/src/robots/discovery.d.ts +1 -1
  55. package/core/src/robots/generator.d.ts +1 -1
  56. package/core/src/robots/index.d.ts +1 -1
  57. package/core/src/robots/policies.d.ts +1 -1
  58. package/core/src/rss/discovery.d.ts +1 -1
  59. package/core/src/rss/generator.d.ts +1 -1
  60. package/core/src/rss/index.d.ts +1 -1
  61. package/core/src/sitemap/discovery.d.ts +1 -1
  62. package/core/src/sitemap/generator.d.ts +1 -1
  63. package/core/src/sitemap/index.d.ts +1 -1
  64. package/core/src/ssr/index.d.ts +1 -1
  65. package/core/src/ssr/lib/cache.d.ts +1 -1
  66. package/core/src/ssr/lib/collections.d.ts +1 -1
  67. package/core/src/ssr/lib/compression.d.ts +1 -1
  68. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  69. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  70. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  71. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  72. package/core/src/ssr/lib/data.d.ts +1 -1
  73. package/core/src/ssr/lib/html.d.ts +1 -1
  74. package/core/src/ssr/lib/imports.d.ts +1 -1
  75. package/core/src/ssr/lib/index.d.ts +1 -1
  76. package/core/src/ssr/lib/layouts.d.ts +1 -1
  77. package/core/src/ssr/lib/metadata.d.ts +1 -1
  78. package/core/src/ssr/lib/metadata.d.ts.map +1 -1
  79. package/core/src/ssr/lib/mime.d.ts +1 -1
  80. package/core/src/ssr/lib/modules.d.ts +1 -1
  81. package/core/src/ssr/lib/path.d.ts +1 -1
  82. package/core/src/ssr/lib/preload.d.ts +1 -1
  83. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  84. package/core/src/ssr/lib/scripts/data.d.ts +1 -1
  85. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  86. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  87. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  88. package/core/src/ssr/lib/seed.d.ts +1 -1
  89. package/core/src/ssr/lib/serialize.d.ts +1 -1
  90. package/core/src/ssr/lib/setup.d.ts +4 -1
  91. package/core/src/ssr/lib/setup.d.ts.map +1 -1
  92. package/core/src/ssr/lib/styles.d.ts +1 -1
  93. package/core/src/ssr/lib/template.d.ts +1 -1
  94. package/core/src/ssr/lib/types.d.ts +3 -1
  95. package/core/src/ssr/lib/types.d.ts.map +1 -1
  96. package/core/src/ssr/render.d.ts +1 -1
  97. package/core/src/ssr/stream.d.ts +1 -1
  98. package/core/src/ssr/stream.d.ts.map +1 -1
  99. package/elysia/index.d.ts +1 -1
  100. package/elysia/index.js +235 -58
  101. package/elysia/index.js.map +8 -8
  102. package/elysia/src/index.d.ts +1 -1
  103. package/elysia/src/libs/assets.d.ts +1 -1
  104. package/elysia/src/libs/cache.d.ts +1 -1
  105. package/elysia/src/libs/caching.d.ts +1 -1
  106. package/elysia/src/libs/http.d.ts +1 -1
  107. package/elysia/src/libs/image.d.ts +1 -1
  108. package/elysia/src/libs/index.d.ts +1 -1
  109. package/elysia/src/libs/llms.d.ts +1 -1
  110. package/elysia/src/libs/response.d.ts +1 -1
  111. package/elysia/src/libs/serving.d.ts +1 -1
  112. package/elysia/src/plugin.d.ts +1 -1
  113. package/elysia/src/plugin.d.ts.map +1 -1
  114. package/elysia/src/routes/artifacts.d.ts +1 -1
  115. package/elysia/src/routes/content.d.ts +1 -1
  116. package/elysia/src/routes/image.d.ts +1 -1
  117. package/elysia/src/routes/index.d.ts +1 -1
  118. package/elysia/src/routes/internal.d.ts +1 -1
  119. package/elysia/src/routes/llms.d.ts +1 -1
  120. package/elysia/src/routes/og.d.ts +1 -1
  121. package/elysia/src/routes/redirects.d.ts +1 -1
  122. package/elysia/src/routes/robots.d.ts +1 -1
  123. package/elysia/src/routes/rss.d.ts +1 -1
  124. package/elysia/src/routes/search.d.ts +1 -1
  125. package/elysia/src/routes/sitemap.d.ts +1 -1
  126. package/elysia/src/routes/ssr.d.ts +6 -3
  127. package/elysia/src/routes/ssr.d.ts.map +1 -1
  128. package/elysia/src/routes/static.d.ts +1 -1
  129. package/elysia/src/types.d.ts +1 -1
  130. package/package.json +1 -1
  131. package/react/index.d.ts +1 -1
  132. package/react/index.js +17 -5
  133. package/react/index.js.map +3 -3
  134. package/react/src/components/ClientOnly.d.ts +1 -1
  135. package/react/src/components/ContentRoute.d.ts +1 -1
  136. package/react/src/components/Image.d.ts +1 -1
  137. package/react/src/components/LazyRoute.d.ts +1 -1
  138. package/react/src/components/Link.d.ts +1 -1
  139. package/react/src/components/Markdown.d.ts +1 -1
  140. package/react/src/components/Outlet.d.ts +1 -1
  141. package/react/src/components/index.d.ts +1 -1
  142. package/react/src/hooks/index.d.ts +1 -1
  143. package/react/src/hooks/useContent.d.ts +1 -1
  144. package/react/src/hooks/useData.d.ts +1 -1
  145. package/react/src/hooks/useFeed.d.ts +1 -1
  146. package/react/src/hooks/useLayoutData.d.ts +1 -1
  147. package/react/src/hooks/useLlms.d.ts +1 -1
  148. package/react/src/hooks/useNavigate.d.ts +1 -1
  149. package/react/src/hooks/useParams.d.ts +1 -1
  150. package/react/src/hooks/useRouter.d.ts +1 -1
  151. package/react/src/hooks/useSearch.d.ts +1 -1
  152. package/react/src/hooks/useSearchParams.d.ts +1 -1
  153. package/react/src/hooks/useToc.d.ts +1 -1
  154. package/react/src/index.d.ts +1 -1
  155. package/react/src/lib/collection.d.ts +1 -1
  156. package/react/src/lib/content.d.ts +1 -1
  157. package/react/src/lib/head.d.ts +1 -1
  158. package/react/src/lib/index.d.ts +1 -1
  159. package/react/src/lib/lazy-route.d.ts +1 -1
  160. package/react/src/lib/route-loader.d.ts +1 -1
  161. package/react/src/providers/ContentProvider.d.ts +1 -1
  162. package/react/src/providers/RerouteProvider.d.ts +1 -1
  163. package/react/src/providers/RouterProvider.d.ts +1 -1
  164. package/react/src/providers/RouterProvider.d.ts.map +1 -1
  165. package/react/src/providers/index.d.ts +1 -1
  166. package/react/src/types/any.d.ts +1 -1
  167. package/react/src/types/index.d.ts +1 -1
  168. package/react/src/types/router.d.ts +1 -1
  169. package/telemetry/react.d.ts +1 -1
  170. package/telemetry/react.js +2 -2
  171. package/telemetry/react.js.map +1 -1
  172. package/telemetry/server.d.ts +1 -1
  173. package/telemetry/server.js +2 -2
  174. package/telemetry/server.js.map +6 -6
  175. package/telemetry/src/react/api.d.ts +1 -1
  176. package/telemetry/src/react/context.d.ts +1 -1
  177. package/telemetry/src/react/index.d.ts +1 -1
  178. package/telemetry/src/react/telemetry.d.ts +1 -1
  179. package/telemetry/src/server/context.d.ts +1 -1
  180. package/telemetry/src/server/headers/extractor.d.ts +1 -1
  181. package/telemetry/src/server/headers/index.d.ts +1 -1
  182. package/telemetry/src/server/headers/presets.d.ts +1 -1
  183. package/telemetry/src/server/index.d.ts +1 -1
  184. package/telemetry/src/server/instrumentation.d.ts +1 -1
  185. package/telemetry/src/server/plugin.d.ts +1 -1
  186. package/telemetry/src/server/sourcemap.d.ts +1 -1
package/cli/bin.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.42.0
2
+ * reroute-js v0.43.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2026 stewones <hi@stewan.io>
package/cli/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
3
  /**
4
- * reroute-js v0.42.0
4
+ * reroute-js v0.43.0
5
5
  *
6
6
  * @license MIT
7
7
  * @copyright 2026 stewones <hi@stewan.io>
@@ -48,7 +48,7 @@ async function getVersionString() {
48
48
  }
49
49
  async function getVersion() {
50
50
  if (true) {
51
- return "0.42.0";
51
+ return "0.43.0";
52
52
  }
53
53
  const possiblePaths = [
54
54
  path.join(import.meta.dir, "../../../../package.json"),
@@ -66,7 +66,7 @@ async function getVersion() {
66
66
  }
67
67
  async function getCommit() {
68
68
  if (true) {
69
- return "7dd4c06";
69
+ return "8a3c652";
70
70
  }
71
71
  return "dev";
72
72
  }
@@ -2215,7 +2215,12 @@ ${ogMetaTags}`;
2215
2215
  if (routeResult.lang)
2216
2216
  pageLang = routeResult.lang;
2217
2217
  statusOverride = routeResult.statusOverride;
2218
- return { perPageHead, pageLang, statusOverride };
2218
+ return {
2219
+ perPageHead,
2220
+ pageLang,
2221
+ statusOverride,
2222
+ ssrExport: routeResult.ssrExport
2223
+ };
2219
2224
  }
2220
2225
  async function processLayoutForMetadata(layout, clientDir, isWatchMode, addHead, setLang, ogConfig) {
2221
2226
  if (typeof layout?.path !== "string")
@@ -2226,7 +2231,7 @@ async function processLayoutForMetadata(layout, clientDir, isWatchMode, addHead,
2226
2231
  if (meta)
2227
2232
  addHead(buildHeadFromMeta(meta, ogConfig));
2228
2233
  if (ssr) {
2229
- const ssrHead = extractSSRHead(ssr);
2234
+ const ssrHead = extractSSRHead(ssr, undefined, ogConfig);
2230
2235
  if (ssrHead)
2231
2236
  addHead(`
2232
2237
  ${ssrHead}`);
@@ -2256,7 +2261,7 @@ function extractContentMetadata(pathname, addHead, setLang, ogConfig) {
2256
2261
  const meta = exp?.meta;
2257
2262
  const ssr = exp?.ssr;
2258
2263
  addHead(buildHeadFromMeta(meta, ogConfig));
2259
- const ssrHead = extractSSRHead(ssr);
2264
+ const ssrHead = extractSSRHead(ssr, undefined, ogConfig);
2260
2265
  if (ssrHead)
2261
2266
  addHead(`
2262
2267
  ${ssrHead}`);
@@ -2281,11 +2286,16 @@ async function extractMatchedRouteMetadata(pathname, clientDir, m, isWatchMode,
2281
2286
  head += buildHeadFromMeta(meta, ogConfig);
2282
2287
  if (ssr) {
2283
2288
  const routeData = ssrData && typeof ssrData === "object" ? ssrData[pathname] : undefined;
2284
- const ssrHead = extractSSRHead(ssr, routeData);
2289
+ const ssrHead = extractSSRHead(ssr, routeData, ogConfig, head);
2285
2290
  if (ssrHead)
2286
2291
  head += `
2287
2292
  ${ssrHead}`;
2288
- return { head, lang: extractSSRLang(ssr), statusOverride };
2293
+ return {
2294
+ head,
2295
+ lang: extractSSRLang(ssr),
2296
+ statusOverride,
2297
+ ssrExport: ssr
2298
+ };
2289
2299
  }
2290
2300
  return { head, statusOverride };
2291
2301
  } catch {}
@@ -2296,6 +2306,7 @@ async function extractRouteMetadata(pathname, clientDir, cwd, isWatchMode, curre
2296
2306
  let head = "";
2297
2307
  let lang;
2298
2308
  let statusOverride = currentStatusOverride;
2309
+ let ssrExport;
2299
2310
  try {
2300
2311
  const m = await loadRoutesModule(cwd, isWatchMode);
2301
2312
  if (!m) {
@@ -2312,13 +2323,14 @@ async function extractRouteMetadata(pathname, clientDir, cwd, isWatchMode, curre
2312
2323
  head = result.head;
2313
2324
  lang = result.lang;
2314
2325
  statusOverride = result.statusOverride;
2326
+ ssrExport = result.ssrExport;
2315
2327
  } else {
2316
2328
  head += await extractNotFoundMetadata(pathname, clientDir, m, isWatchMode, (l) => {
2317
2329
  lang = l;
2318
2330
  }, ogConfig);
2319
2331
  }
2320
2332
  } catch {}
2321
- return { head, lang, statusOverride };
2333
+ return { head, lang, statusOverride, ssrExport };
2322
2334
  }
2323
2335
  function findBestNotFoundRoute(list, pathname) {
2324
2336
  let chosen;
@@ -2347,7 +2359,7 @@ async function extractNotFoundMetadata(pathname, clientDir, routesModule, isWatc
2347
2359
  const { meta, ssr } = await loadModuleMetaAndSSR(chosen, abs, isWatchMode);
2348
2360
  if (meta)
2349
2361
  head += buildHeadFromMeta(meta, ogConfig);
2350
- const ssrHead = extractSSRHead(ssr);
2362
+ const ssrHead = extractSSRHead(ssr, undefined, ogConfig);
2351
2363
  if (ssrHead)
2352
2364
  head += `
2353
2365
  ${ssrHead}`;
@@ -2358,29 +2370,86 @@ ${ssrHead}`;
2358
2370
  } catch {}
2359
2371
  return head;
2360
2372
  }
2361
- function extractSSRHead(ssr, data) {
2373
+ function parseTitleFromHead(head) {
2374
+ const match = head.match(/<title[^>]*>(.*?)<\/title>/is);
2375
+ if (match?.[1])
2376
+ return unescapeHtml(match[1].trim());
2377
+ return;
2378
+ }
2379
+ function parseDescriptionFromHead(head) {
2380
+ let match = head.match(/<meta\s+name=["']description["']\s+content=["'](.+?)["']\s*\/?>/i);
2381
+ if (match?.[1])
2382
+ return unescapeHtml(match[1].trim());
2383
+ match = head.match(/<meta\s+content=["'](.+?)["']\s+name=["']description["']\s*\/?>/i);
2384
+ if (match?.[1])
2385
+ return unescapeHtml(match[1].trim());
2386
+ return;
2387
+ }
2388
+ function unescapeHtml(input) {
2389
+ return input.replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
2390
+ }
2391
+ function hasMetaTag(head, property) {
2392
+ const propRegex = new RegExp(`<meta\\s+(?:property|name)=["']${property}["']`, "i");
2393
+ const contentFirstRegex = new RegExp(`<meta\\s+content=["'][^"']*["']\\s+(?:property|name)=["']${property}["']`, "i");
2394
+ return propRegex.test(head) || contentFirstRegex.test(head);
2395
+ }
2396
+ function generateMissingOGTags(head, ogConfig) {
2397
+ const title = parseTitleFromHead(head);
2398
+ const description = parseDescriptionFromHead(head);
2399
+ const additionalTags = [];
2400
+ if (title && !hasMetaTag(head, "og:title")) {
2401
+ additionalTags.push(`<meta property="og:title" content="${escapeHtml2(title)}" />`);
2402
+ }
2403
+ const finalDescription = description || ogConfig?.siteDescription;
2404
+ if (finalDescription && !hasMetaTag(head, "og:description")) {
2405
+ additionalTags.push(`<meta property="og:description" content="${escapeHtml2(finalDescription)}" />`);
2406
+ }
2407
+ if (title && !hasMetaTag(head, "twitter:title")) {
2408
+ additionalTags.push(`<meta name="twitter:title" content="${escapeHtml2(title)}" />`);
2409
+ }
2410
+ if (finalDescription && !hasMetaTag(head, "twitter:description")) {
2411
+ additionalTags.push(`<meta name="twitter:description" content="${escapeHtml2(finalDescription)}" />`);
2412
+ }
2413
+ if (!hasMetaTag(head, "og:type")) {
2414
+ const ogType = ogConfig?.defaultType || "website";
2415
+ additionalTags.push(`<meta property="og:type" content="${escapeHtml2(ogType)}" />`);
2416
+ }
2417
+ if (!hasMetaTag(head, "twitter:card")) {
2418
+ const twitterCard = ogConfig?.twitterCard || "summary_large_image";
2419
+ additionalTags.push(`<meta name="twitter:card" content="${twitterCard}" />`);
2420
+ }
2421
+ return additionalTags.length > 0 ? `
2422
+ ${additionalTags.join(`
2423
+ `)}` : "";
2424
+ }
2425
+ function extractSSRHead(ssr, data, ogConfig, existingHead) {
2362
2426
  if (!ssr)
2363
2427
  return "";
2428
+ let headContent = "";
2364
2429
  if (typeof ssr.head === "function") {
2365
2430
  try {
2366
2431
  const result = ssr.head({ data });
2367
2432
  if (typeof result === "string")
2368
- return result;
2369
- if (Array.isArray(result))
2370
- return String(result.join(`
2433
+ headContent = result;
2434
+ else if (Array.isArray(result))
2435
+ headContent = String(result.join(`
2371
2436
  `));
2372
- return "";
2373
2437
  } catch (err) {
2374
2438
  console.error("[extractSSRHead] Error calling head function:", err);
2375
2439
  return "";
2376
2440
  }
2377
- }
2378
- if (typeof ssr.head === "string")
2379
- return ssr.head;
2380
- if (Array.isArray(ssr.head))
2381
- return String(ssr.head.join(`
2441
+ } else if (typeof ssr.head === "string") {
2442
+ headContent = ssr.head;
2443
+ } else if (Array.isArray(ssr.head)) {
2444
+ headContent = String(ssr.head.join(`
2382
2445
  `));
2383
- return "";
2446
+ }
2447
+ if (!headContent)
2448
+ return "";
2449
+ const combinedHead = existingHead ? `${existingHead}
2450
+ ${headContent}` : headContent;
2451
+ const additionalOGTags = generateMissingOGTags(combinedHead, ogConfig);
2452
+ return headContent + additionalOGTags;
2384
2453
  }
2385
2454
  function extractSSRLang(ssr) {
2386
2455
  if (!ssr)
@@ -5323,7 +5392,8 @@ async function renderSSRDocumentStream(options) {
5323
5392
  browserTelemetryConfig,
5324
5393
  traceContext,
5325
5394
  parentSpan: options.parentSpan,
5326
- timeout: options.timeout
5395
+ timeout: options.timeout,
5396
+ ssrExport: setup2.metadataResult.ssrExport
5327
5397
  });
5328
5398
  if (debug)
5329
5399
  console.log(`[renderStream] ${pathname} - returning stream: ${(performance.now() - t0).toFixed(2)}ms`);
@@ -5431,12 +5501,100 @@ function buildStreamingScripts(ctx) {
5431
5501
  const feedsScript = createFeedsScript();
5432
5502
  const llmsScript = createLlmsScript();
5433
5503
  let allScripts = dataScript + feedsScript + llmsScript + collectionScripts + ctx.preloadHydrationScript;
5504
+ const metaUpdateScript = generateMetaUpdateScript(ctx, ssrDataSnapshot);
5505
+ if (metaUpdateScript) {
5506
+ allScripts += metaUpdateScript;
5507
+ }
5434
5508
  allScripts += `<script type="module" src="${ctx.bundleUrl}"></script>`;
5435
5509
  if (ctx.isWatchMode) {
5436
5510
  allScripts += `<script type="module" src="/__reroute_watch.js"></script>`;
5437
5511
  }
5438
5512
  return allScripts;
5439
5513
  }
5514
+ function generateMetaUpdateScript(ctx, ssrDataSnapshot) {
5515
+ if (typeof ctx.ssrExport?.head !== "function") {
5516
+ return "";
5517
+ }
5518
+ const routeData = ssrDataSnapshot[ctx.pathname];
5519
+ if (!routeData) {
5520
+ return "";
5521
+ }
5522
+ let headResult;
5523
+ try {
5524
+ headResult = ctx.ssrExport.head({ data: routeData });
5525
+ } catch (err) {
5526
+ console.error("[reroute] Error calling ssr.head() at stream end:", err);
5527
+ return "";
5528
+ }
5529
+ if (!headResult) {
5530
+ return "";
5531
+ }
5532
+ const headHtml = Array.isArray(headResult) ? headResult.join(`
5533
+ `) : headResult;
5534
+ if (!headHtml) {
5535
+ return "";
5536
+ }
5537
+ const metaUpdates = parseHeadForMetaUpdates(headHtml);
5538
+ if (Object.keys(metaUpdates).length === 0) {
5539
+ return "";
5540
+ }
5541
+ const updatesJson = JSON.stringify(metaUpdates);
5542
+ return `<script>(function(){var u=${updatesJson};if(u.title){document.title=u.title}Object.keys(u).forEach(function(k){if(k==='title')return;var s=k.split(':');var isOg=s[0]==='og'||s[0]==='twitter';var el=isOg?document.querySelector('meta[property="'+k+'"]')||document.querySelector('meta[name="'+k+'"]'):document.querySelector('meta[name="'+k+'"]');if(el){el.setAttribute('content',u[k])}else{var m=document.createElement('meta');m.setAttribute(isOg?'property':'name',k);m.setAttribute('content',u[k]);document.head.appendChild(m)}})})()</script>`;
5543
+ }
5544
+ function parseHeadForMetaUpdates(headHtml) {
5545
+ const updates = {};
5546
+ const titleMatch = headHtml.match(/<title[^>]*>(.*?)<\/title>/is);
5547
+ if (titleMatch?.[1]) {
5548
+ updates.title = unescapeHtmlEntities(titleMatch[1].trim());
5549
+ }
5550
+ let descMatch = headHtml.match(/<meta\s+name=["']description["']\s+content=["'](.+?)["']/i);
5551
+ if (!descMatch) {
5552
+ descMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+name=["']description["']/i);
5553
+ }
5554
+ if (descMatch?.[1]) {
5555
+ updates.description = unescapeHtmlEntities(descMatch[1].trim());
5556
+ }
5557
+ let ogTitleMatch = headHtml.match(/<meta\s+property=["']og:title["']\s+content=["'](.+?)["']/i);
5558
+ if (!ogTitleMatch) {
5559
+ ogTitleMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+property=["']og:title["']/i);
5560
+ }
5561
+ if (ogTitleMatch?.[1]) {
5562
+ updates["og:title"] = unescapeHtmlEntities(ogTitleMatch[1].trim());
5563
+ } else if (updates.title) {
5564
+ updates["og:title"] = updates.title;
5565
+ }
5566
+ let ogDescMatch = headHtml.match(/<meta\s+property=["']og:description["']\s+content=["'](.+?)["']/i);
5567
+ if (!ogDescMatch) {
5568
+ ogDescMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+property=["']og:description["']/i);
5569
+ }
5570
+ if (ogDescMatch?.[1]) {
5571
+ updates["og:description"] = unescapeHtmlEntities(ogDescMatch[1].trim());
5572
+ } else if (updates.description) {
5573
+ updates["og:description"] = updates.description;
5574
+ }
5575
+ let twitterTitleMatch = headHtml.match(/<meta\s+name=["']twitter:title["']\s+content=["'](.+?)["']/i);
5576
+ if (!twitterTitleMatch) {
5577
+ twitterTitleMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+name=["']twitter:title["']/i);
5578
+ }
5579
+ if (twitterTitleMatch?.[1]) {
5580
+ updates["twitter:title"] = unescapeHtmlEntities(twitterTitleMatch[1].trim());
5581
+ } else if (updates.title) {
5582
+ updates["twitter:title"] = updates.title;
5583
+ }
5584
+ let twitterDescMatch = headHtml.match(/<meta\s+name=["']twitter:description["']\s+content=["'](.+?)["']/i);
5585
+ if (!twitterDescMatch) {
5586
+ twitterDescMatch = headHtml.match(/<meta\s+content=["'](.+?)["']\s+name=["']twitter:description["']/i);
5587
+ }
5588
+ if (twitterDescMatch?.[1]) {
5589
+ updates["twitter:description"] = unescapeHtmlEntities(twitterDescMatch[1].trim());
5590
+ } else if (updates.description) {
5591
+ updates["twitter:description"] = updates.description;
5592
+ }
5593
+ return updates;
5594
+ }
5595
+ function unescapeHtmlEntities(str) {
5596
+ return str.replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
5597
+ }
5440
5598
  var init_stream = __esm(() => {
5441
5599
  init_server2();
5442
5600
  init_config();
@@ -105839,7 +105997,7 @@ async function getVersionString2() {
105839
105997
  }
105840
105998
  async function getVersion2() {
105841
105999
  if (true) {
105842
- return "0.42.0";
106000
+ return "0.43.0";
105843
106001
  }
105844
106002
  const possiblePaths = [
105845
106003
  path3.join(import.meta.dir, "../../../package.json"),
@@ -105856,10 +106014,10 @@ async function getVersion2() {
105856
106014
  }
105857
106015
  async function getCommit2() {
105858
106016
  if (true) {
105859
- return "7dd4c06";
106017
+ return "8a3c652";
105860
106018
  }
105861
106019
  return "dev";
105862
106020
  }
105863
106021
  main();
105864
106022
 
105865
- //# debugId=449323AA472C1CD464756E2164756E21
106023
+ //# debugId=F78EC5575219E60664756E2164756E21