@farm.js/core 0.1.0-beta.45 → 0.1.0-beta.47

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 (70) hide show
  1. package/dist/api/route-manager.cjs.map +1 -1
  2. package/dist/api/route-manager.mjs +2 -2
  3. package/dist/api.cjs.map +1 -1
  4. package/dist/api.mjs +3 -3
  5. package/dist/{chunk-EPBXX44K.mjs → chunk-3UUEBVR3.mjs} +3 -3
  6. package/dist/{chunk-IRYMQRYJ.mjs → chunk-ECLWCE4H.mjs} +2 -2
  7. package/dist/{chunk-IWPBMZGE.mjs → chunk-IHYFDXKQ.mjs} +4 -4
  8. package/dist/{chunk-FLGRRGVU.mjs → chunk-KTV3UWGE.mjs} +2 -2
  9. package/dist/{chunk-FLGRRGVU.mjs.map → chunk-KTV3UWGE.mjs.map} +1 -1
  10. package/dist/{chunk-MU2QKVYL.mjs → chunk-MP2SDRRB.mjs} +2 -2
  11. package/dist/{chunk-6NCLVPI7.mjs → chunk-MWYVMV3T.mjs} +124 -15
  12. package/dist/chunk-MWYVMV3T.mjs.map +1 -0
  13. package/dist/{chunk-QLCUQD3U.mjs → chunk-SHZF3DEB.mjs} +2 -2
  14. package/dist/{chunk-VHYARVB7.mjs → chunk-TIESOJ7Z.mjs} +2 -2
  15. package/dist/{chunk-KEPCW6EI.mjs → chunk-U5SPS2HR.mjs} +10 -1
  16. package/dist/chunk-U5SPS2HR.mjs.map +1 -0
  17. package/dist/client/lifecycle.mjs +2 -2
  18. package/dist/client-plugins.cjs +1 -1
  19. package/dist/client-plugins.cjs.map +1 -1
  20. package/dist/client-plugins.mjs +2 -2
  21. package/dist/client.cjs +1 -1
  22. package/dist/client.cjs.map +1 -1
  23. package/dist/client.mjs +2 -2
  24. package/dist/index.cjs +134 -12
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.mts +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.mjs +11 -9
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/internal/build-runtime.cjs +132 -12
  31. package/dist/internal/build-runtime.cjs.map +1 -1
  32. package/dist/internal/build-runtime.d.mts +1 -1
  33. package/dist/internal/build-runtime.d.ts +1 -1
  34. package/dist/internal/build-runtime.mjs +6 -6
  35. package/dist/internal/client-runtime.cjs +1 -1
  36. package/dist/internal/client-runtime.cjs.map +1 -1
  37. package/dist/internal/client-runtime.mjs +2 -2
  38. package/dist/internal/config-runtime.cjs.map +1 -1
  39. package/dist/internal/config-runtime.d.mts +1 -1
  40. package/dist/internal/config-runtime.d.ts +1 -1
  41. package/dist/internal/config-runtime.mjs +1 -1
  42. package/dist/middleware.cjs.map +1 -1
  43. package/dist/middleware.mjs +3 -3
  44. package/dist/plugin.cjs +127 -11
  45. package/dist/plugin.cjs.map +1 -1
  46. package/dist/plugin.mjs +5 -5
  47. package/dist/server.cjs +129 -11
  48. package/dist/server.cjs.map +1 -1
  49. package/dist/server.d.mts +1 -1
  50. package/dist/server.d.ts +1 -1
  51. package/dist/server.mjs +7 -5
  52. package/dist/server.mjs.map +1 -1
  53. package/dist/testing.mjs +2 -2
  54. package/dist/{utils-CjZRiq-l.d.mts → utils-9OPxcT1T.d.mts} +9 -1
  55. package/dist/{utils-_LOF-V9f.d.ts → utils-CIIoLfn9.d.ts} +9 -1
  56. package/dist/version.cjs +1 -1
  57. package/dist/version.cjs.map +1 -1
  58. package/dist/version.mjs +1 -1
  59. package/dist/vite.cjs +127 -11
  60. package/dist/vite.cjs.map +1 -1
  61. package/dist/vite.mjs +5 -5
  62. package/package.json +3 -3
  63. package/dist/chunk-6NCLVPI7.mjs.map +0 -1
  64. package/dist/chunk-KEPCW6EI.mjs.map +0 -1
  65. /package/dist/{chunk-EPBXX44K.mjs.map → chunk-3UUEBVR3.mjs.map} +0 -0
  66. /package/dist/{chunk-IRYMQRYJ.mjs.map → chunk-ECLWCE4H.mjs.map} +0 -0
  67. /package/dist/{chunk-IWPBMZGE.mjs.map → chunk-IHYFDXKQ.mjs.map} +0 -0
  68. /package/dist/{chunk-MU2QKVYL.mjs.map → chunk-MP2SDRRB.mjs.map} +0 -0
  69. /package/dist/{chunk-QLCUQD3U.mjs.map → chunk-SHZF3DEB.mjs.map} +0 -0
  70. /package/dist/{chunk-VHYARVB7.mjs.map → chunk-TIESOJ7Z.mjs.map} +0 -0
package/dist/client.mjs CHANGED
@@ -62,7 +62,7 @@ import {
62
62
  createClientPluginManager,
63
63
  installChunkErrorRecovery,
64
64
  isChunkLoadError
65
- } from "./chunk-QLCUQD3U.mjs";
65
+ } from "./chunk-SHZF3DEB.mjs";
66
66
  import "./chunk-GQVQESLY.mjs";
67
67
  import {
68
68
  api,
@@ -80,7 +80,7 @@ import "./chunk-RBRLLZL5.mjs";
80
80
  import "./chunk-WZ5QFROO.mjs";
81
81
  import "./chunk-7ZMKVETU.mjs";
82
82
  import "./chunk-FXG2PS27.mjs";
83
- import "./chunk-FLGRRGVU.mjs";
83
+ import "./chunk-KTV3UWGE.mjs";
84
84
  import "./chunk-CGILA3WO.mjs";
85
85
  export {
86
86
  APIClientError,
package/dist/index.cjs CHANGED
@@ -256,6 +256,13 @@ function matchRoute(url, segments) {
256
256
  function resolveAppPath(root, ...paths) {
257
257
  return import_path.default.resolve(root, ...paths);
258
258
  }
259
+ function toRootRelativeUrlPath(absolutePath, projectRoot) {
260
+ if (absolutePath === projectRoot) return "";
261
+ if (absolutePath.startsWith(`${projectRoot}/`) || absolutePath.startsWith(`${projectRoot}\\`)) {
262
+ return absolutePath.slice(projectRoot.length).replace(/\\/g, "/");
263
+ }
264
+ return void 0;
265
+ }
259
266
  function toViteModuleId(filePath, root) {
260
267
  if (!import_path.default.isAbsolute(filePath)) return filePath;
261
268
  const relativePath2 = import_path.default.relative(root, filePath);
@@ -304,6 +311,7 @@ var init_utils = __esm({
304
311
  __name(segmentsToPattern, "segmentsToPattern");
305
312
  __name(matchRoute, "matchRoute");
306
313
  __name(resolveAppPath, "resolveAppPath");
314
+ __name(toRootRelativeUrlPath, "toRootRelativeUrlPath");
307
315
  __name(toViteModuleId, "toViteModuleId");
308
316
  __name(fileExists, "fileExists");
309
317
  __name(globFiles, "globFiles");
@@ -10544,9 +10552,8 @@ var init_route_manager = __esm({
10544
10552
  return this.clientManifestCache.manifest;
10545
10553
  }
10546
10554
  const toUrlPath = /* @__PURE__ */ __name((absolutePath) => {
10547
- if (absolutePath === normalizedProjectRoot || absolutePath.startsWith(`${normalizedProjectRoot}${import_path5.default.sep}`)) {
10548
- return absolutePath.slice(normalizedProjectRoot.length);
10549
- }
10555
+ const rootRelative = toRootRelativeUrlPath(absolutePath, normalizedProjectRoot);
10556
+ if (rootRelative !== void 0) return rootRelative;
10550
10557
  if (import_path5.default.isAbsolute(absolutePath)) {
10551
10558
  const normalized = absolutePath.replace(/\\/g, "/");
10552
10559
  return normalized.startsWith("/") ? `/@fs${normalized}` : `/@fs/${normalized}`;
@@ -11172,6 +11179,60 @@ var init_route_manager = __esm({
11172
11179
  }
11173
11180
  });
11174
11181
 
11182
+ // src/server/full-document.ts
11183
+ function stripContentsWrappers(markup) {
11184
+ let out = markup.replace(/^\s+/, "");
11185
+ const opener = /^<div\b[^>]*style="display\s*:\s*contents"[^>]*>/i;
11186
+ let match;
11187
+ while (match = opener.exec(out)) {
11188
+ out = out.slice(match[0].length).replace(/^\s+/, "");
11189
+ }
11190
+ return out;
11191
+ }
11192
+ function extractFarmFullDocument(markup) {
11193
+ const inner = stripContentsWrappers(markup);
11194
+ if (!/^<!doctype/i.test(inner) && !/^<html[\s>]/i.test(inner)) return null;
11195
+ const start = markup.search(/<!doctype|<html[\s>]/i);
11196
+ const closeIndex = markup.toLowerCase().lastIndexOf("</html>");
11197
+ if (start < 0 || closeIndex < 0) return null;
11198
+ return markup.slice(start, closeIndex + "</html>".length);
11199
+ }
11200
+ function opensFarmFullDocument(markup) {
11201
+ const inner = stripContentsWrappers(markup);
11202
+ return /^<!doctype/i.test(inner) || /^<html[\s>]/i.test(inner);
11203
+ }
11204
+ function composeFarmFullDocument(documentHtml, assets) {
11205
+ let html = documentHtml;
11206
+ if (assets.htmlAttributes) {
11207
+ html = html.replace(
11208
+ /<html\b([^>]*)>/i,
11209
+ (_match, attrs) => `<html${attrs}${assets.htmlAttributes}>`
11210
+ );
11211
+ }
11212
+ if (!/\sid=["']root["']/i.test(html)) {
11213
+ html = html.replace(/<body\b([^>]*)>/i, '<body$1><div id="root">').replace(/<\/body>/i, "</div></body>");
11214
+ }
11215
+ if (assets.headAssets) {
11216
+ html = html.replace(/<\/head>/i, () => ` ${assets.headAssets}
11217
+ </head>`);
11218
+ }
11219
+ if (assets.bodyFooter) {
11220
+ html = html.replace(/<\/body>/i, () => ` ${assets.bodyFooter}
11221
+ </body>`);
11222
+ }
11223
+ return /^\s*<!doctype/i.test(html) ? html : `<!DOCTYPE html>
11224
+ ${html}`;
11225
+ }
11226
+ var init_full_document = __esm({
11227
+ "src/server/full-document.ts"() {
11228
+ "use strict";
11229
+ __name(stripContentsWrappers, "stripContentsWrappers");
11230
+ __name(extractFarmFullDocument, "extractFarmFullDocument");
11231
+ __name(opensFarmFullDocument, "opensFarmFullDocument");
11232
+ __name(composeFarmFullDocument, "composeFarmFullDocument");
11233
+ }
11234
+ });
11235
+
11175
11236
  // src/middleware/server.ts
11176
11237
  function getGlobalMiddlewareStore(key) {
11177
11238
  const state = globalThis;
@@ -15188,7 +15249,7 @@ var init_server3 = __esm({
15188
15249
  var version;
15189
15250
  var init_package = __esm({
15190
15251
  "package.json"() {
15191
- version = "0.1.0-beta.45";
15252
+ version = "0.1.0-beta.47";
15192
15253
  }
15193
15254
  });
15194
15255
 
@@ -15360,6 +15421,13 @@ function warnSuppressedAsyncHydrationOnce(modulePath) {
15360
15421
  `${modulePath} is an async server component that imports client components. React cannot hydrate async components in the browser, so this route stays server-rendered and its client imports are not interactive. Move the interactive UI into a "use client" child rendered by a synchronous page, or enable experimental server components support.`
15361
15422
  );
15362
15423
  }
15424
+ function warnFarmFullDocumentLayout() {
15425
+ if (warnedFullDocumentLayout) return;
15426
+ warnedFullDocumentLayout = true;
15427
+ logger.warn(
15428
+ `A root layout returned a full <html> document. Farm.js owns the document shell, so a layout should return a fragment (its children) \u2014 like the docs example \u2014 and let the framework provide <html>/<head>/<body>. The document has been composed into the response, but returning a fragment avoids the ambiguity and keeps dev and production identical.`
15429
+ );
15430
+ }
15363
15431
  function hasRequestHeader(req, name2) {
15364
15432
  const value = req.headers[name2.toLowerCase()];
15365
15433
  return Array.isArray(value) ? value.length > 0 : Boolean(value);
@@ -15498,13 +15566,14 @@ function createRouteStateProps(input) {
15498
15566
  context: input.pluginExposedContext.size > 0 ? { data: input.pluginExposedContext } : void 0
15499
15567
  };
15500
15568
  }
15501
- var fs3, path11, import_stream, import_node_url5, cachedClerkProvider, importRuntimeModule, warnedSuppressedAsyncHydrationModules, _ServerRenderer, ServerRenderer;
15569
+ var fs3, path11, import_stream, import_node_url5, cachedClerkProvider, importRuntimeModule, warnedSuppressedAsyncHydrationModules, fullDocumentRoutes, warnedFullDocumentLayout, _ServerRenderer, ServerRenderer;
15502
15570
  var init_renderer2 = __esm({
15503
15571
  "src/server/renderer.ts"() {
15504
15572
  "use strict";
15505
15573
  fs3 = __toESM(require("fs"));
15506
15574
  path11 = __toESM(require("path"));
15507
15575
  init_utils();
15576
+ init_full_document();
15508
15577
  init_client_component();
15509
15578
  import_stream = require("stream");
15510
15579
  init_server();
@@ -15539,6 +15608,9 @@ var init_renderer2 = __esm({
15539
15608
  importRuntimeModule = new Function("specifier", "return import(specifier);");
15540
15609
  warnedSuppressedAsyncHydrationModules = /* @__PURE__ */ new Set();
15541
15610
  __name(warnSuppressedAsyncHydrationOnce, "warnSuppressedAsyncHydrationOnce");
15611
+ fullDocumentRoutes = /* @__PURE__ */ new Set();
15612
+ warnedFullDocumentLayout = false;
15613
+ __name(warnFarmFullDocumentLayout, "warnFarmFullDocumentLayout");
15542
15614
  __name(hasRequestHeader, "hasRequestHeader");
15543
15615
  __name(serializeInlineValue2, "serializeInlineValue");
15544
15616
  __name(escapeHtmlAttribute2, "escapeHtmlAttribute");
@@ -16236,7 +16308,7 @@ var init_renderer2 = __esm({
16236
16308
  );
16237
16309
  const clientLayouts = layouts.map((layout2, index) => ({
16238
16310
  pattern: layout2.pattern,
16239
- modulePath: layout2.modulePath.startsWith(this.config.root) ? layout2.modulePath.slice(this.config.root.length) : layout2.modulePath,
16311
+ modulePath: toRootRelativeUrlPath(layout2.modulePath, this.config.root) ?? layout2.modulePath,
16240
16312
  shouldHydrate: layoutHydrationMetadata[index]?.shouldHydrate === true,
16241
16313
  islandStrategy: layoutHydrationMetadata[index]?.islandStrategy ?? null
16242
16314
  }));
@@ -16812,7 +16884,7 @@ var init_renderer2 = __esm({
16812
16884
  const routeSlots = (req.__FARM_ROUTE_SLOTS__ || []).map(
16813
16885
  (slot) => ({
16814
16886
  ...slot,
16815
- modulePath: typeof slot.modulePath === "string" && slot.modulePath.startsWith(this.config.root) ? slot.modulePath.slice(this.config.root.length) : slot.modulePath
16887
+ modulePath: typeof slot.modulePath === "string" ? toRootRelativeUrlPath(slot.modulePath, this.config.root) ?? slot.modulePath : slot.modulePath
16816
16888
  })
16817
16889
  );
16818
16890
  const deferredProps = prepareDeferredData({
@@ -16820,7 +16892,7 @@ var init_renderer2 = __esm({
16820
16892
  slots: routeSlots
16821
16893
  });
16822
16894
  const pagePath = req.__FARM_PAGE_PATH__;
16823
- const relativePath2 = pagePath ? pagePath.startsWith(this.config.root) ? pagePath.slice(this.config.root.length) : pagePath : "/src/app/page.tsx";
16895
+ const relativePath2 = pagePath ? toRootRelativeUrlPath(pagePath, this.config.root) ?? pagePath : "/src/app/page.tsx";
16824
16896
  const deploymentId = this.getDeploymentId();
16825
16897
  const bootstrapScript = `<script>
16826
16898
  window.__FARM_PROPS__ = ${serializeInlineValue2(deferredProps.data.page)};
@@ -16854,7 +16926,27 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
16854
16926
  this.config.basePath,
16855
16927
  getTheme()
16856
16928
  );
16857
- const html = `<!DOCTYPE html>
16929
+ const fullDocument = extractFarmFullDocument(content);
16930
+ let html;
16931
+ if (fullDocument) {
16932
+ warnFarmFullDocumentLayout();
16933
+ html = composeFarmFullDocument(fullDocument, {
16934
+ htmlAttributes: `${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}`,
16935
+ headAssets: [
16936
+ themeDocument.head,
16937
+ `<meta name="farm-deployment-id" content="${escapeHtmlAttribute2(deploymentId)}">`,
16938
+ metaTags,
16939
+ alternateTags,
16940
+ renderFarmFontDevHead(this.config.root || process.cwd()),
16941
+ `<link rel="stylesheet" href="/src/app/globals.css">`,
16942
+ `<script type="module" src="/@vite/client"></script>`,
16943
+ rendererHydrationScript,
16944
+ bootstrapScript
16945
+ ].filter(Boolean).join("\n "),
16946
+ bodyFooter: [deferredScript, `<script type="module" src="/@farm/client.js"></script>`].filter(Boolean).join("\n ")
16947
+ });
16948
+ } else {
16949
+ html = `<!DOCTYPE html>
16858
16950
  <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
16859
16951
  <head>
16860
16952
  ${themeDocument.head}
@@ -16875,6 +16967,7 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
16875
16967
  <script type="module" src="/@farm/client.js"></script>
16876
16968
  </body>
16877
16969
  </html>`;
16970
+ }
16878
16971
  emitFarmEvent({
16879
16972
  type: "render.stream.shellReady",
16880
16973
  route: route2,
@@ -16897,7 +16990,8 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
16897
16990
  }
16898
16991
  async renderWithSSR(element, req, res, clearMiddlewareData, options = {}) {
16899
16992
  const renderToPipeableStream2 = this.rendererRuntime.renderToPipeableStream;
16900
- if (!renderToPipeableStream2) {
16993
+ const fullDocumentRouteKey = options.observabilityRoute || req.__FARM_ROUTE__ || req.url || "/";
16994
+ if (!renderToPipeableStream2 || fullDocumentRoutes.has(fullDocumentRouteKey)) {
16901
16995
  return this.renderBufferedSSR(element, req, res, clearMiddlewareData, options);
16902
16996
  }
16903
16997
  return new Promise((resolve8, reject) => {
@@ -16916,7 +17010,7 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
16916
17010
  let didError = false;
16917
17011
  const pagePath = req.__FARM_PAGE_PATH__;
16918
17012
  const isClientComponent = req.__FARM_IS_CLIENT_COMPONENT__ === true;
16919
- const relativePath2 = pagePath ? pagePath.startsWith(this.config.root) ? pagePath.slice(this.config.root.length) : pagePath : "/src/app/page.tsx";
17013
+ const relativePath2 = pagePath ? toRootRelativeUrlPath(pagePath, this.config.root) ?? pagePath : "/src/app/page.tsx";
16920
17014
  const manifest = options.routeManifest ?? this.routeManager.generateClientManifest(this.config.root);
16921
17015
  const clientManifest = {
16922
17016
  clientEntry: "/@farm/client.js",
@@ -16964,7 +17058,7 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
16964
17058
  const routeSlotPayload = (req.__FARM_ROUTE_SLOTS__ || []).map(
16965
17059
  (slot) => ({
16966
17060
  ...slot,
16967
- modulePath: typeof slot.modulePath === "string" && slot.modulePath.startsWith(this.config.root) ? slot.modulePath.slice(this.config.root.length) : slot.modulePath
17061
+ modulePath: typeof slot.modulePath === "string" ? toRootRelativeUrlPath(slot.modulePath, this.config.root) ?? slot.modulePath : slot.modulePath
16968
17062
  })
16969
17063
  );
16970
17064
  const deferredProps = prepareDeferredData({
@@ -17044,6 +17138,7 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
17044
17138
  htmlParts.push(shell);
17045
17139
  staticShellParts?.push(shell);
17046
17140
  let firstChunk = true;
17141
+ let checkedFullDocument = false;
17047
17142
  const writableStream = new import_stream.Writable({
17048
17143
  write(chunk, encoding, callback) {
17049
17144
  if (firstChunk && process.env.FARM_VERBOSE) {
@@ -17051,6 +17146,13 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue2(
17051
17146
  firstChunk = false;
17052
17147
  }
17053
17148
  const chunkText = Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk);
17149
+ if (!checkedFullDocument) {
17150
+ checkedFullDocument = true;
17151
+ if (opensFarmFullDocument(chunkText)) {
17152
+ fullDocumentRoutes.add(fullDocumentRouteKey);
17153
+ warnFarmFullDocumentLayout();
17154
+ }
17155
+ }
17054
17156
  htmlParts.push(chunkText);
17055
17157
  if (staticShellParts && !staticShellClosed) {
17056
17158
  const dynamicIndex = findPPRDynamicChunkIndex(chunkText);
@@ -17249,6 +17351,24 @@ ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue2(i18nSnapshot)};
17249
17351
  getTheme()
17250
17352
  );
17251
17353
  const rendererHydrationScript = this.rendererRuntime.generateHydrationScript?.() || "";
17354
+ const fullDocument = extractFarmFullDocument(content);
17355
+ if (fullDocument) {
17356
+ warnFarmFullDocumentLayout();
17357
+ return composeFarmFullDocument(fullDocument, {
17358
+ htmlAttributes: `${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}`,
17359
+ headAssets: [
17360
+ themeDocument.head,
17361
+ `<meta name="farm-deployment-id" content="${escapeHtmlAttribute2(this.getDeploymentId())}">`,
17362
+ alternateLinks,
17363
+ fontHead,
17364
+ `<link rel="stylesheet" href="/src/app/globals.css" />`,
17365
+ `<script type="module" src="/@vite/client"></script>`,
17366
+ rendererHydrationScript,
17367
+ integrationManifestScript
17368
+ ].filter(Boolean).join("\n "),
17369
+ bodyFooter: clientScript.trim()
17370
+ });
17371
+ }
17252
17372
  return `<!DOCTYPE html>
17253
17373
  <html lang="${escapeHtmlAttribute2(i18nSnapshot?.locale || "en")}"${i18nSnapshot ? ` dir="${i18nSnapshot.direction}"` : ""}${themeDocument.attributes}>
17254
17374
  <head>
@@ -34212,6 +34332,7 @@ __export(src_exports, {
34212
34332
  storageCacheAdapter: () => storageCacheAdapter,
34213
34333
  titleFromMarkdown: () => titleFromMarkdown,
34214
34334
  toFormData: () => toFormData,
34335
+ toRootRelativeUrlPath: () => toRootRelativeUrlPath,
34215
34336
  toViteModuleId: () => toViteModuleId,
34216
34337
  toggleTheme: () => toggleTheme,
34217
34338
  unstable_cache: () => unstable_cache,
@@ -50297,6 +50418,7 @@ __name(decodeCookiePart, "decodeCookiePart");
50297
50418
  storageCacheAdapter,
50298
50419
  titleFromMarkdown,
50299
50420
  toFormData,
50421
+ toRootRelativeUrlPath,
50300
50422
  toViteModuleId,
50301
50423
  toggleTheme,
50302
50424
  unstable_cache,