@alignable/bifrost 0.1.1 → 1.0.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 (119) hide show
  1. package/dist/chunk-4W4KH2A5.js +50 -0
  2. package/dist/chunk-4W4KH2A5.js.map +1 -0
  3. package/dist/{chunk-X3MUHPJ3.js → chunk-NS2C4D24.js} +59 -177
  4. package/dist/chunk-NS2C4D24.js.map +1 -0
  5. package/dist/controller-af32e731.d.ts +9 -0
  6. package/dist/index.d.ts +1 -15
  7. package/dist/index.js +1 -13
  8. package/dist/index.js.map +1 -1
  9. package/dist/renderer/+config.js +3 -47
  10. package/dist/renderer/Head.d.ts +5 -0
  11. package/dist/renderer/Head.js +25 -0
  12. package/dist/renderer/Head.js.map +1 -0
  13. package/dist/renderer/bifrost/onAfterRenderClient.d.ts +5 -0
  14. package/dist/renderer/bifrost/onAfterRenderClient.js +14 -0
  15. package/dist/renderer/bifrost/onAfterRenderClient.js.map +1 -0
  16. package/dist/renderer/bifrost/onBeforeRenderClient.d.ts +5 -0
  17. package/dist/renderer/bifrost/onBeforeRenderClient.js +15 -0
  18. package/dist/renderer/bifrost/onBeforeRenderClient.js.map +1 -0
  19. package/dist/renderer/config.d.ts +92 -0
  20. package/dist/renderer/headHtmlEnd.d.ts +7 -0
  21. package/dist/renderer/headHtmlEnd.js +8 -0
  22. package/dist/renderer/headHtmlEnd.js.map +1 -0
  23. package/dist/renderer/onBeforeRoute.d.ts +3 -6
  24. package/dist/renderer/onBeforeRoute.js +9 -3
  25. package/dist/renderer/onBeforeRoute.js.map +1 -1
  26. package/dist/renderer/wrapped/Page.d.ts +9 -0
  27. package/dist/renderer/wrapped/Page.js +25 -0
  28. package/dist/renderer/wrapped/Page.js.map +1 -0
  29. package/dist/renderer/wrapped/onAfterRenderClient.d.ts +7 -0
  30. package/dist/renderer/wrapped/onAfterRenderClient.js +30 -0
  31. package/dist/renderer/wrapped/onAfterRenderClient.js.map +1 -0
  32. package/dist/renderer/wrapped/onBeforeRender.client.d.ts +7 -0
  33. package/dist/renderer/wrapped/onBeforeRender.client.js +40 -0
  34. package/dist/renderer/wrapped/onBeforeRender.client.js.map +1 -0
  35. package/dist/renderer/wrapped/onBeforeRenderClient.d.ts +7 -0
  36. package/dist/renderer/wrapped/onBeforeRenderClient.js +172 -0
  37. package/dist/renderer/wrapped/onBeforeRenderClient.js.map +1 -0
  38. package/dist/renderer/wrapped/onBeforeRenderHtml.d.ts +5 -0
  39. package/dist/renderer/wrapped/onBeforeRenderHtml.js +14 -0
  40. package/dist/renderer/wrapped/onBeforeRenderHtml.js.map +1 -0
  41. package/dist/type-82702ff4.d.ts +27 -0
  42. package/package.json +14 -24
  43. package/dist/chunk-2DSY3VFP.js +0 -118
  44. package/dist/chunk-2DSY3VFP.js.map +0 -1
  45. package/dist/chunk-5SP2QGEH.js +0 -76
  46. package/dist/chunk-5SP2QGEH.js.map +0 -1
  47. package/dist/chunk-ABLEI4J7.js +0 -30
  48. package/dist/chunk-ABLEI4J7.js.map +0 -1
  49. package/dist/chunk-EYYCKU6F.js +0 -11
  50. package/dist/chunk-EYYCKU6F.js.map +0 -1
  51. package/dist/chunk-IYGONC4I.js +0 -31
  52. package/dist/chunk-IYGONC4I.js.map +0 -1
  53. package/dist/chunk-JHLK62FM.js +0 -20
  54. package/dist/chunk-JHLK62FM.js.map +0 -1
  55. package/dist/chunk-K4H777XA.js +0 -9
  56. package/dist/chunk-K4H777XA.js.map +0 -1
  57. package/dist/chunk-OXCN6F2S.js +0 -10
  58. package/dist/chunk-OXCN6F2S.js.map +0 -1
  59. package/dist/chunk-PESUYCE4.js +0 -33
  60. package/dist/chunk-PESUYCE4.js.map +0 -1
  61. package/dist/chunk-RQ34EW7E.js +0 -13
  62. package/dist/chunk-RQ34EW7E.js.map +0 -1
  63. package/dist/chunk-RSVASTEA.js +0 -63
  64. package/dist/chunk-RSVASTEA.js.map +0 -1
  65. package/dist/chunk-VYXAWOXV.js +0 -22
  66. package/dist/chunk-VYXAWOXV.js.map +0 -1
  67. package/dist/chunk-X2R7ODLQ.js +0 -14
  68. package/dist/chunk-X2R7ODLQ.js.map +0 -1
  69. package/dist/chunk-X3MUHPJ3.js.map +0 -1
  70. package/dist/chunk-XMNZZA6S.js +0 -75
  71. package/dist/chunk-XMNZZA6S.js.map +0 -1
  72. package/dist/internal-837e7a40.d.ts +0 -128
  73. package/dist/renderer/+config.js.map +0 -1
  74. package/dist/renderer/_config.d.ts +0 -111
  75. package/dist/renderer/_error/Page.d.ts +0 -8
  76. package/dist/renderer/_error/Page.js +0 -14
  77. package/dist/renderer/_error/Page.js.map +0 -1
  78. package/dist/renderer/bifrost/onRenderClient.d.ts +0 -9
  79. package/dist/renderer/bifrost/onRenderClient.js +0 -15
  80. package/dist/renderer/bifrost/onRenderHtml.d.ts +0 -20
  81. package/dist/renderer/bifrost/onRenderHtml.js +0 -13
  82. package/dist/renderer/bifrost/onRenderHtml.js.map +0 -1
  83. package/dist/renderer/configs/bifrost.d.ts +0 -50
  84. package/dist/renderer/configs/bifrost.js +0 -7
  85. package/dist/renderer/configs/bifrost.js.map +0 -1
  86. package/dist/renderer/configs/wrapped.d.ts +0 -25
  87. package/dist/renderer/configs/wrapped.js +0 -7
  88. package/dist/renderer/configs/wrapped.js.map +0 -1
  89. package/dist/renderer/onRenderClient.d.ts +0 -9
  90. package/dist/renderer/onRenderClient.js +0 -35
  91. package/dist/renderer/onRenderClient.js.map +0 -1
  92. package/dist/renderer/onRenderHtml.d.ts +0 -37
  93. package/dist/renderer/onRenderHtml.js +0 -32
  94. package/dist/renderer/onRenderHtml.js.map +0 -1
  95. package/dist/renderer/useNavigation.d.ts +0 -13
  96. package/dist/renderer/useNavigation.js +0 -12
  97. package/dist/renderer/useNavigation.js.map +0 -1
  98. package/dist/renderer/usePageContext.d.ts +0 -14
  99. package/dist/renderer/usePageContext.js +0 -10
  100. package/dist/renderer/usePageContext.js.map +0 -1
  101. package/dist/renderer/utils/PassthruLayout.d.ts +0 -5
  102. package/dist/renderer/utils/PassthruLayout.js +0 -7
  103. package/dist/renderer/utils/PassthruLayout.js.map +0 -1
  104. package/dist/renderer/utils/buildHead.d.ts +0 -9
  105. package/dist/renderer/utils/buildHead.js +0 -7
  106. package/dist/renderer/utils/buildHead.js.map +0 -1
  107. package/dist/renderer/utils/getConfigOrPageContext.d.ts +0 -13
  108. package/dist/renderer/utils/getConfigOrPageContext.js +0 -7
  109. package/dist/renderer/utils/getConfigOrPageContext.js.map +0 -1
  110. package/dist/renderer/utils/getGlobalObject.d.ts +0 -6
  111. package/dist/renderer/utils/getGlobalObject.js +0 -7
  112. package/dist/renderer/utils/getGlobalObject.js.map +0 -1
  113. package/dist/renderer/wrapped/onRenderClient.d.ts +0 -9
  114. package/dist/renderer/wrapped/onRenderClient.js +0 -13
  115. package/dist/renderer/wrapped/onRenderClient.js.map +0 -1
  116. package/dist/renderer/wrapped/onRenderHtml.d.ts +0 -27
  117. package/dist/renderer/wrapped/onRenderHtml.js +0 -12
  118. package/dist/renderer/wrapped/onRenderHtml.js.map +0 -1
  119. /package/dist/renderer/{bifrost/onRenderClient.js.map → config.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../renderer/Head.tsx"],"sourcesContent":["import React from \"react\";\n\n// Register turbolinks global for ios to hook into\nconst turbolinksIOSCompat = `window.Turbolinks = {controller:{restorationIdentifier: ''}};`;\n\n/// emit turbolinks:load on DOMContentLoaded\nconst turbolinksLoadEvent = `addEventListener(\"DOMContentLoaded\", () => {\n const event = new Event(\"turbolinks:load\", { bubbles: true, cancelable: true });\n event.data = {url: window.location.href};\n document.dispatchEvent(event); \n});`;\n\n/**\n * Hard reload when user navigates to a passthru turbolinks page.\n * Turbolinks navigates with history.pushState. When navigating passthru => bifrost (tracked scripts change), it reloads page.\n * Now on bifrost page, if user clicks back button, the browser sees the original navigation as initiated by pushState,\n * so the browser does not load the page. We detect this and force a reload.\n *\n * Further discussion on Vike handling this natively: https://github.com/vikejs/vike/issues/2801\n */\nconst turbolinksBackButton = `addEventListener(\"popstate\", (e) => {\n if(e.state && e.state.turbolinks) window.location.reload();\n});`;\n\nexport default function Head() {\n return (\n <>\n <script\n dangerouslySetInnerHTML={{\n __html: turbolinksIOSCompat + turbolinksLoadEvent + turbolinksBackButton\n }}\n />\n </>\n );\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAGlB,IAAM,sBAAsB;AAG5B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAc5B,IAAM,uBAAuB;AAAA;AAAA;AAId,SAAR,OAAwB;AAC7B,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,yBAAyB;AAAA,QACvB,QAAQ,sBAAsB,sBAAsB;AAAA,MACtD;AAAA;AAAA,EACF,CACF;AAEJ;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { PageContextClient } from 'vike/types';
2
+
3
+ declare function bifrostOnAfterRenderClient(pageContext: PageContextClient): Promise<void>;
4
+
5
+ export { bifrostOnAfterRenderClient as default };
@@ -0,0 +1,14 @@
1
+ import {
2
+ Turbolinks
3
+ } from "../../chunk-NS2C4D24.js";
4
+
5
+ // renderer/bifrost/onAfterRenderClient.ts
6
+ async function bifrostOnAfterRenderClient(pageContext) {
7
+ if (!pageContext.isHydration) {
8
+ await Turbolinks._vikeAfterRender(false);
9
+ }
10
+ }
11
+ export {
12
+ bifrostOnAfterRenderClient as default
13
+ };
14
+ //# sourceMappingURL=onAfterRenderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../renderer/bifrost/onAfterRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\n\nexport default async function bifrostOnAfterRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration) {\n await Turbolinks._vikeAfterRender(false);\n }\n}\n"],"mappings":";;;;;AAGA,eAAO,2BACL,aACA;AACA,MAAI,CAAC,YAAY,aAAa;AAC5B,UAAM,WAAW,iBAAiB,KAAK;AAAA,EACzC;AACF;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { PageContextClient } from 'vike/types';
2
+
3
+ declare function bifrostOnBeforeRenderClient(pageContext: PageContextClient): Promise<void>;
4
+
5
+ export { bifrostOnBeforeRenderClient as default };
@@ -0,0 +1,15 @@
1
+ import {
2
+ Turbolinks
3
+ } from "../../chunk-NS2C4D24.js";
4
+
5
+ // renderer/bifrost/onBeforeRenderClient.ts
6
+ Turbolinks.start();
7
+ async function bifrostOnBeforeRenderClient(pageContext) {
8
+ if (!pageContext.isHydration) {
9
+ await Turbolinks._vikeBeforeRender();
10
+ }
11
+ }
12
+ export {
13
+ bifrostOnBeforeRenderClient as default
14
+ };
15
+ //# sourceMappingURL=onBeforeRenderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../renderer/bifrost/onBeforeRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\n\nTurbolinks.start();\n\nexport default async function bifrostOnBeforeRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration) {\n await Turbolinks._vikeBeforeRender();\n }\n}\n"],"mappings":";;;;;AAGA,WAAW,MAAM;AAEjB,eAAO,4BACL,aACA;AACA,MAAI,CAAC,YAAY,aAAa;AAC5B,UAAM,WAAW,kBAAkB;AAAA,EACrC;AACF;","names":[]}
@@ -0,0 +1,92 @@
1
+ export { W as WrappedServerOnly } from '../type-82702ff4.js';
2
+ import '../controller-af32e731.js';
3
+ import 'vike/types';
4
+
5
+ declare const _default: {
6
+ name: string;
7
+ require: {
8
+ vike: string;
9
+ "vike-react": string;
10
+ };
11
+ Head: string;
12
+ headHtmlEnd: string;
13
+ onBeforeRoute: "import:@alignable/bifrost/__internal/renderer/onBeforeRoute:default";
14
+ passToClient: string[];
15
+ meta: {
16
+ getLayout: {
17
+ env: {
18
+ server: true;
19
+ client: true;
20
+ };
21
+ };
22
+ proxyHeaders: {
23
+ env: {
24
+ server: true;
25
+ client: true;
26
+ };
27
+ };
28
+ proxyMode: {
29
+ env: {
30
+ server: true;
31
+ client: true;
32
+ config: true;
33
+ };
34
+ effect({ configDefinedAt, configValue }: {
35
+ configValue: unknown;
36
+ configDefinedAt: `Config ${string} defined at ${string}`;
37
+ }): {
38
+ onBeforeRenderClient: "import:@alignable/bifrost/__internal/renderer/bifrost/onBeforeRenderClient:default";
39
+ onAfterRenderClient: "import:@alignable/bifrost/__internal/renderer/bifrost/onAfterRenderClient:default";
40
+ Page?: undefined;
41
+ onBeforeRenderHtml?: undefined;
42
+ onBeforeRender?: undefined;
43
+ meta?: undefined;
44
+ clientRouting?: undefined;
45
+ } | {
46
+ Page: any;
47
+ onBeforeRenderHtml: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderHtml:default";
48
+ onBeforeRender: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default";
49
+ onBeforeRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default";
50
+ onAfterRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default";
51
+ meta: {
52
+ onBeforeRender: {
53
+ env: {
54
+ client: true;
55
+ server: false;
56
+ };
57
+ };
58
+ };
59
+ clientRouting?: undefined;
60
+ } | {
61
+ clientRouting: false;
62
+ onBeforeRenderClient?: undefined;
63
+ onAfterRenderClient?: undefined;
64
+ Page?: undefined;
65
+ onBeforeRenderHtml?: undefined;
66
+ onBeforeRender?: undefined;
67
+ meta?: undefined;
68
+ };
69
+ };
70
+ };
71
+ };
72
+
73
+ /**
74
+ * Returning null tells Bifrost to run passthru proxy
75
+ */
76
+ type GetLayout = (headers: Record<string, number | string | string[] | undefined>) => Vike.ProxyLayoutInfo | null;
77
+ declare global {
78
+ namespace Vike {
79
+ interface Config {
80
+ proxyMode?: false | "wrapped" | "passthru";
81
+ proxyHeaders?: Record<string, string>;
82
+ getLayout?: GetLayout;
83
+ }
84
+ interface PageContext {
85
+ proxyLayoutInfo?: ProxyLayoutInfo;
86
+ }
87
+ interface ProxyLayoutInfo {
88
+ }
89
+ }
90
+ }
91
+
92
+ export { GetLayout, _default as default };
@@ -0,0 +1,7 @@
1
+ import { PageContextServer } from 'vike/types';
2
+ import '../type-82702ff4.js';
3
+ import '../controller-af32e731.js';
4
+
5
+ declare function headHtmlEnd(pageContext: PageContextServer): string;
6
+
7
+ export { headHtmlEnd as default };
@@ -0,0 +1,8 @@
1
+ // renderer/headHtmlEnd.ts
2
+ function headHtmlEnd(pageContext) {
3
+ return pageContext._wrappedServerOnly?.headInnerHtml || "";
4
+ }
5
+ export {
6
+ headHtmlEnd as default
7
+ };
8
+ //# sourceMappingURL=headHtmlEnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../renderer/headHtmlEnd.ts"],"sourcesContent":["import { PageContextServer } from \"vike/types\";\nimport \"../lib/type\";\n\nexport default function headHtmlEnd(pageContext: PageContextServer) {\n return pageContext._wrappedServerOnly?.headInnerHtml || \"\";\n}\n"],"mappings":";AAGe,SAAR,YAA6B,aAAgC;AAClE,SAAO,YAAY,oBAAoB,iBAAiB;AAC1D;","names":[]}
@@ -1,16 +1,13 @@
1
- import { e as Snapshot } from '../internal-837e7a40.js';
1
+ import { S as Snapshot } from '../controller-af32e731.js';
2
2
  import { PageContext } from 'vike/types';
3
- import 'react';
4
- import './configs/bifrost.js';
5
- import './configs/wrapped.js';
6
3
 
7
4
  declare const onBeforeRoute: (pageContext: PageContext) => {
8
5
  pageContext: {
9
- snapshot: Snapshot;
6
+ _snapshot: Snapshot;
10
7
  };
11
8
  } | {
12
9
  pageContext: {
13
- snapshot?: undefined;
10
+ _snapshot?: undefined;
14
11
  };
15
12
  };
16
13
 
@@ -1,9 +1,9 @@
1
1
  // renderer/onBeforeRoute.ts
2
2
  var onBeforeRoute = (pageContext) => {
3
- if (typeof window !== "undefined") {
3
+ if (typeof window !== "undefined" && pageContext.isClientSide) {
4
4
  const Turbolinks = window.Turbolinks;
5
5
  const currentVisit = Turbolinks.controller.currentVisit;
6
- if (pageContext.isBackwardNavigation) {
6
+ if (pageContext.isHistoryNavigation) {
7
7
  const snapshot = Turbolinks.controller.getCachedSnapshotForLocation(
8
8
  window.location.href
9
9
  );
@@ -14,12 +14,18 @@ var onBeforeRoute = (pageContext) => {
14
14
  if (!!snapshot) {
15
15
  return {
16
16
  pageContext: {
17
- snapshot
17
+ _snapshot: snapshot
18
18
  }
19
19
  };
20
20
  } else {
21
21
  return { pageContext: {} };
22
22
  }
23
+ } else if (Turbolinks.controller.started && (!currentVisit || currentVisit.state === "completed")) {
24
+ throw new Error(
25
+ `Bifrost does not support calling navigate() directly. Use navigate from "@alignable/bifrost" or Turbolinks.visit() instead.`
26
+ );
27
+ } else if (currentVisit?.state === "started") {
28
+ currentVisit.updateIfRedirect(pageContext.urlOriginal);
23
29
  }
24
30
  }
25
31
  return { pageContext: {} };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../renderer/onBeforeRoute.ts"],"sourcesContent":["// do NOT import turbolinks in this file. It is used on server side.\n\nimport { PageContext } from \"vike/types\";\n\nconst onBeforeRoute = (pageContext: PageContext) => {\n if (typeof window !== \"undefined\") {\n const Turbolinks = window.Turbolinks;\n\n const currentVisit = Turbolinks.controller.currentVisit;\n if (pageContext.isBackwardNavigation) {\n const snapshot = Turbolinks.controller.getCachedSnapshotForLocation(\n window.location.href\n );\n Turbolinks.controller.historyPoppedToLocationWithRestorationIdentifier(\n window.location.href,\n \"\"\n );\n\n if (!!snapshot) {\n return {\n pageContext: {\n snapshot,\n },\n };\n } else {\n return { pageContext: {} };\n }\n }\n }\n return { pageContext: {} };\n};\n\nexport default onBeforeRoute;\n"],"mappings":";AAIA,IAAM,gBAAgB,CAAC,gBAA6B;AAClD,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,aAAa,OAAO;AAE1B,UAAM,eAAe,WAAW,WAAW;AAC3C,QAAI,YAAY,sBAAsB;AACpC,YAAM,WAAW,WAAW,WAAW;AAAA,QACrC,OAAO,SAAS;AAAA,MAClB;AACA,iBAAW,WAAW;AAAA,QACpB,OAAO,SAAS;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,CAAC,CAAC,UAAU;AACd,eAAO;AAAA,UACL,aAAa;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,EAAE,aAAa,CAAC,EAAE;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,aAAa,CAAC,EAAE;AAC3B;AAEA,IAAO,wBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../renderer/onBeforeRoute.ts"],"sourcesContent":["// do NOT import turbolinks in this file. It is used on server side.\n\nimport type { PageContext } from \"vike/types\";\n\nconst onBeforeRoute = (pageContext: PageContext) => {\n if (typeof window !== \"undefined\" && pageContext.isClientSide) {\n const Turbolinks = window.Turbolinks;\n\n const currentVisit = Turbolinks.controller.currentVisit;\n\n if (pageContext.isHistoryNavigation) {\n // See Head.tsx\n const snapshot = Turbolinks.controller.getCachedSnapshotForLocation(\n window.location.href\n );\n Turbolinks.controller.historyPoppedToLocationWithRestorationIdentifier(\n window.location.href,\n \"\"\n );\n\n if (!!snapshot) {\n return {\n pageContext: {\n _snapshot: snapshot,\n },\n };\n } else {\n return { pageContext: {} };\n }\n } else if (\n Turbolinks.controller.started &&\n (!currentVisit || currentVisit.state === \"completed\")\n ) {\n throw new Error(\n `Bifrost does not support calling navigate() directly. Use navigate from \"@alignable/bifrost\" or Turbolinks.visit() instead.`\n );\n } else if (currentVisit?.state === \"started\") {\n // It would be great if Vike exposed some isRedirecting flag, but we can infer it\n currentVisit.updateIfRedirect(pageContext.urlOriginal);\n }\n }\n return { pageContext: {} };\n};\n\nexport default onBeforeRoute;\n"],"mappings":";AAIA,IAAM,gBAAgB,CAAC,gBAA6B;AAClD,MAAI,OAAO,WAAW,eAAe,YAAY,cAAc;AAC7D,UAAM,aAAa,OAAO;AAE1B,UAAM,eAAe,WAAW,WAAW;AAE3C,QAAI,YAAY,qBAAqB;AAEnC,YAAM,WAAW,WAAW,WAAW;AAAA,QACrC,OAAO,SAAS;AAAA,MAClB;AACA,iBAAW,WAAW;AAAA,QACpB,OAAO,SAAS;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,CAAC,CAAC,UAAU;AACd,eAAO;AAAA,UACL,aAAa;AAAA,YACX,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,EAAE,aAAa,CAAC,EAAE;AAAA,MAC3B;AAAA,IACF,WACE,WAAW,WAAW,YACrB,CAAC,gBAAgB,aAAa,UAAU,cACzC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,WAAW,cAAc,UAAU,WAAW;AAE5C,mBAAa,iBAAiB,YAAY,WAAW;AAAA,IACvD;AAAA,EACF;AACA,SAAO,EAAE,aAAa,CAAC,EAAE;AAC3B;AAEA,IAAO,wBAAQ;","names":[]}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import '../config.js';
3
+ import '../../type-82702ff4.js';
4
+ import '../../controller-af32e731.js';
5
+ import 'vike/types';
6
+
7
+ declare function Page(): React.JSX.Element;
8
+
9
+ export { Page as default };
@@ -0,0 +1,25 @@
1
+ import "../../chunk-4W4KH2A5.js";
2
+
3
+ // renderer/wrapped/Page.tsx
4
+ import React from "react";
5
+ import { usePageContext } from "vike-react/usePageContext";
6
+ function Page() {
7
+ const pageContext = usePageContext();
8
+ const bodyHtml = pageContext.isClientSide ? pageContext._turbolinksProxy?.body?.innerHTML : pageContext._wrappedServerOnly?.bodyInnerHtml;
9
+ if (bodyHtml) {
10
+ return /* @__PURE__ */ React.createElement(
11
+ "div",
12
+ {
13
+ id: "proxied-body",
14
+ dangerouslySetInnerHTML: {
15
+ __html: bodyHtml
16
+ }
17
+ }
18
+ );
19
+ }
20
+ return /* @__PURE__ */ React.createElement(React.Fragment, null);
21
+ }
22
+ export {
23
+ Page as default
24
+ };
25
+ //# sourceMappingURL=Page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../renderer/wrapped/Page.tsx"],"sourcesContent":["import React from \"react\";\nimport { usePageContext } from \"vike-react/usePageContext\";\nimport { type PageContext } from \"vike/types\";\nimport \"../config\";\nimport \"../../lib/type\";\n\nexport default function Page() {\n const pageContext = usePageContext();\n\n const bodyHtml = pageContext.isClientSide\n ? pageContext._turbolinksProxy?.body?.innerHTML\n : pageContext._wrappedServerOnly?.bodyInnerHtml;\n\n if (bodyHtml) {\n return (\n <div\n id=\"proxied-body\"\n dangerouslySetInnerHTML={{\n __html: bodyHtml,\n }}\n />\n );\n }\n return <></>;\n}\n"],"mappings":";;;AAAA,OAAO,WAAW;AAClB,SAAS,sBAAsB;AAKhB,SAAR,OAAwB;AAC7B,QAAM,cAAc,eAAe;AAEnC,QAAM,WAAW,YAAY,eACzB,YAAY,kBAAkB,MAAM,YACpC,YAAY,oBAAoB;AAEpC,MAAI,UAAU;AACZ,WACE;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,yBAAyB;AAAA,UACvB,QAAQ;AAAA,QACV;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SAAO,wDAAE;AACX;","names":[]}
@@ -0,0 +1,7 @@
1
+ import '../../type-82702ff4.js';
2
+ import { PageContextClient } from 'vike/types';
3
+ import '../../controller-af32e731.js';
4
+
5
+ declare function wrappedOnAfterRenderClient(pageContext: PageContextClient): Promise<void>;
6
+
7
+ export { wrappedOnAfterRenderClient as default };
@@ -0,0 +1,30 @@
1
+ import {
2
+ Turbolinks
3
+ } from "../../chunk-NS2C4D24.js";
4
+
5
+ // lib/getElementAttributes.ts
6
+ function getElementAttributes(element) {
7
+ const bodyAttrs = {};
8
+ element.getAttributeNames().forEach((name) => {
9
+ bodyAttrs[name] = element.getAttribute(name);
10
+ });
11
+ return bodyAttrs;
12
+ }
13
+
14
+ // renderer/wrapped/onAfterRenderClient.ts
15
+ async function wrappedOnAfterRenderClient(pageContext) {
16
+ const { proxyLayoutInfo } = pageContext;
17
+ const bodyEl = document.getElementById("proxied-body");
18
+ Turbolinks._vpsCachePageContext({
19
+ proxyLayoutInfo,
20
+ bodyAttrs: getElementAttributes(bodyEl)
21
+ });
22
+ if (!pageContext.isHydration) {
23
+ await pageContext._waitForHeadScripts?.();
24
+ await Turbolinks._vikeAfterRender(true);
25
+ }
26
+ }
27
+ export {
28
+ wrappedOnAfterRenderClient as default
29
+ };
30
+ //# sourceMappingURL=onAfterRenderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/getElementAttributes.ts","../../../renderer/wrapped/onAfterRenderClient.ts"],"sourcesContent":["export function getElementAttributes(element: Element) {\n const bodyAttrs: Record<string, string> = {};\n element.getAttributeNames().forEach((name) => {\n bodyAttrs[name] = element.getAttribute(name)!;\n });\n return bodyAttrs;\n}\n","import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport { getElementAttributes } from \"../../lib/getElementAttributes\";\n\nexport default async function wrappedOnAfterRenderClient(\n pageContext: PageContextClient\n) {\n const { proxyLayoutInfo } = pageContext;\n const bodyEl = document.getElementById(\"proxied-body\")!;\n Turbolinks._vpsCachePageContext({\n proxyLayoutInfo,\n bodyAttrs: getElementAttributes(bodyEl),\n });\n if (!pageContext.isHydration) {\n // On client navigation, tell turbolinks to run scripts and fire events\n await pageContext._waitForHeadScripts?.();\n await Turbolinks._vikeAfterRender(true);\n }\n}\n"],"mappings":";;;;;AAAO,SAAS,qBAAqB,SAAkB;AACrD,QAAM,YAAoC,CAAC;AAC3C,UAAQ,kBAAkB,EAAE,QAAQ,CAAC,SAAS;AAC5C,cAAU,IAAI,IAAI,QAAQ,aAAa,IAAI;AAAA,EAC7C,CAAC;AACD,SAAO;AACT;;;ACDA,eAAO,2BACL,aACA;AACA,QAAM,EAAE,gBAAgB,IAAI;AAC5B,QAAM,SAAS,SAAS,eAAe,cAAc;AACrD,aAAW,qBAAqB;AAAA,IAC9B;AAAA,IACA,WAAW,qBAAqB,MAAM;AAAA,EACxC,CAAC;AACD,MAAI,CAAC,YAAY,aAAa;AAE5B,UAAM,YAAY,sBAAsB;AACxC,UAAM,WAAW,iBAAiB,IAAI;AAAA,EACxC;AACF;","names":[]}
@@ -0,0 +1,7 @@
1
+ import '../../type-82702ff4.js';
2
+ import { PageContextClient } from 'vike/types';
3
+ import '../../controller-af32e731.js';
4
+
5
+ declare function wrappedOnBeforeRender(pageContext: PageContextClient): Promise<void>;
6
+
7
+ export { wrappedOnBeforeRender as default };
@@ -0,0 +1,40 @@
1
+ // renderer/wrapped/onBeforeRender.client.ts
2
+ import { redirect } from "vike/abort";
3
+ async function wrappedOnBeforeRender(pageContext) {
4
+ if (pageContext.isClientSide && !pageContext?._snapshot && !pageContext.isHydration) {
5
+ const resp = await fetch(pageContext.urlOriginal, {
6
+ headers: { ...pageContext.config.proxyHeaders, accept: "text/html" }
7
+ });
8
+ if (resp.redirected) {
9
+ const parsedUrl = new URL(resp.url);
10
+ if (window.location.origin === parsedUrl.origin) {
11
+ throw redirect(parsedUrl.pathname + parsedUrl.search + parsedUrl.hash);
12
+ } else {
13
+ throw redirect(resp.url);
14
+ }
15
+ }
16
+ if (!resp.ok) {
17
+ throw redirect(resp.url);
18
+ }
19
+ const html = await resp.text();
20
+ const layoutInfo = pageContext.config.getLayout(
21
+ Object.fromEntries(resp.headers.entries())
22
+ );
23
+ if (!layoutInfo) {
24
+ throw redirect(resp.url);
25
+ }
26
+ const parsed = document.createElement("html");
27
+ parsed.innerHTML = html;
28
+ const bodyEl = parsed.querySelector("body");
29
+ const headEl = parsed.querySelector("head");
30
+ pageContext.proxyLayoutInfo = layoutInfo;
31
+ pageContext._turbolinksProxy = {
32
+ body: bodyEl,
33
+ head: headEl
34
+ };
35
+ }
36
+ }
37
+ export {
38
+ wrappedOnBeforeRender as default
39
+ };
40
+ //# sourceMappingURL=onBeforeRender.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../renderer/wrapped/onBeforeRender.client.ts"],"sourcesContent":["import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { redirect } from \"vike/abort\";\n\n// onBeforeRender runs before changing the browser location, so `throw redirect` works\n// we wait for onBeforeRenderClient to call mergeHead, which runs after browser location change\n// Possibly could move this back into onBeforeRenderClient: https://github.com/vikejs/vike/pull/2820\nexport default async function wrappedOnBeforeRender(\n pageContext: PageContextClient\n) {\n if (\n pageContext.isClientSide &&\n !pageContext?._snapshot &&\n !pageContext.isHydration\n ) {\n /*\n Mermaid diagram of client side navigation logic:\n\n Vike Router --> Proxy Mode\n Proxy Mode -->|wrapped| Request Legacy Backend\n Request Legacy Backend -->|redirect| Vike Router\n Request Legacy Backend -->|html| Render Wrapped Page\n Proxy Mode -->|false| Render Vike Page\n Proxy Mode -->|passthru| Browser Navigation\n\n ┌─────────────┐ ┌────────────┐ ┌────────────────────────┐ ┌─────────────────────┐\n │ │ │ │ │ │ │ │\n │ Vike Router ├────►│ Proxy Mode ├─wrapped►│ Request Legacy Backend ├html─►│ Render Wrapped Page │\n │ │ │ │ │ │ │ │\n └─────────────┘ └──────┬─────┘ └────────────┬───────────┘ └─────────────────────┘\n ▲ │ redirect \n └───────────────────┼────────────────────────────┘ \n false \n │ ┌────────────────────────┐ \n │ │ │ \n ├──────────────►│ Render Vike Page │ \n passthru │ │ \n │ └────────────────────────┘ \n │ \n │ ┌────────────────────────┐ \n │ │ │ \n └──────────────►│ Browser Navigation │ \n │ │ \n └────────────────────────┘ \n\n The Vike router must run on every redirect, because the legacy backend could redirect to a Vike page.\n The browser follows redirects automatically, which hits the vike server, which will passthru if needed\n It would be more performant to run the Vike router on the client, but the browser does not expose redirect info.\n Optimization: use serviceworker to intercept redirects.\n */\n const resp = await fetch(pageContext.urlOriginal, {\n headers: { ...pageContext.config.proxyHeaders, accept: \"text/html\" },\n });\n\n if (resp.redirected) {\n const parsedUrl = new URL(resp.url);\n // Need to redirect to run vike router (in case redirect is not wrapped page)\n // Downside is we will make another network request\n // TODO: Can we prevent the double request? Move to server side and throw redirect on 3xx?\n if (window.location.origin === parsedUrl.origin) {\n // redirect needs to start with \"/\" or vike will do hard reload\n throw redirect(parsedUrl.pathname + parsedUrl.search + parsedUrl.hash);\n } else {\n // external redirect\n throw redirect(resp.url);\n }\n }\n if (!resp.ok) {\n throw redirect(resp.url);\n }\n const html = await resp.text();\n const layoutInfo = pageContext.config.getLayout!(\n Object.fromEntries(resp.headers.entries())\n );\n if (!layoutInfo) {\n // Fallback to full reload if layout not found\n // window.location.href = resp.url;\n throw redirect(resp.url);\n }\n\n const parsed = document.createElement(\"html\");\n parsed.innerHTML = html;\n const bodyEl = parsed.querySelector(\"body\")!;\n const headEl = parsed.querySelector(\"head\")!;\n pageContext.proxyLayoutInfo = layoutInfo;\n pageContext._turbolinksProxy = {\n body: bodyEl,\n head: headEl,\n };\n }\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AAKzB,eAAO,sBACL,aACA;AACA,MACE,YAAY,gBACZ,CAAC,aAAa,aACd,CAAC,YAAY,aACb;AAoCA,UAAM,OAAO,MAAM,MAAM,YAAY,aAAa;AAAA,MAChD,SAAS,EAAE,GAAG,YAAY,OAAO,cAAc,QAAQ,YAAY;AAAA,IACrE,CAAC;AAED,QAAI,KAAK,YAAY;AACnB,YAAM,YAAY,IAAI,IAAI,KAAK,GAAG;AAIlC,UAAI,OAAO,SAAS,WAAW,UAAU,QAAQ;AAE/C,cAAM,SAAS,UAAU,WAAW,UAAU,SAAS,UAAU,IAAI;AAAA,MACvE,OAAO;AAEL,cAAM,SAAS,KAAK,GAAG;AAAA,MACzB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,SAAS,KAAK,GAAG;AAAA,IACzB;AACA,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,aAAa,YAAY,OAAO;AAAA,MACpC,OAAO,YAAY,KAAK,QAAQ,QAAQ,CAAC;AAAA,IAC3C;AACA,QAAI,CAAC,YAAY;AAGf,YAAM,SAAS,KAAK,GAAG;AAAA,IACzB;AAEA,UAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,WAAO,YAAY;AACnB,UAAM,SAAS,OAAO,cAAc,MAAM;AAC1C,UAAM,SAAS,OAAO,cAAc,MAAM;AAC1C,gBAAY,kBAAkB;AAC9B,gBAAY,mBAAmB;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,7 @@
1
+ import '../../type-82702ff4.js';
2
+ import { PageContextClient } from 'vike/types';
3
+ import '../../controller-af32e731.js';
4
+
5
+ declare function wrappedOnBeforeRenderClient(pageContext: PageContextClient): Promise<void>;
6
+
7
+ export { wrappedOnBeforeRenderClient as default };
@@ -0,0 +1,172 @@
1
+ import {
2
+ Turbolinks,
3
+ copyElementAttributes,
4
+ createScriptElement
5
+ } from "../../chunk-NS2C4D24.js";
6
+
7
+ // lib/turbolinks/mergeHead.ts
8
+ var allHeadScriptsEverRun = {};
9
+ var firstLoad = true;
10
+ var lastTrackedScriptSignature;
11
+ function mergeHead(head) {
12
+ const newHead = categorizeHead(head);
13
+ const oldHead = categorizeHead(document.head);
14
+ const reload = () => window.Turbolinks.controller.viewInvalidated();
15
+ if (head.querySelector('meta[name="turbolinks-visit-control"]')?.getAttribute("content") === "reload") {
16
+ reload();
17
+ }
18
+ lastTrackedScriptSignature = lastTrackedScriptSignature || trackedElementSignature([...oldHead.scripts, ...oldHead.stylesheets]);
19
+ if (lastTrackedScriptSignature !== trackedElementSignature([...newHead.scripts, ...newHead.stylesheets])) {
20
+ reload();
21
+ }
22
+ if (firstLoad) {
23
+ for (const element of oldHead.scripts) {
24
+ allHeadScriptsEverRun[element.outerHTML] = {
25
+ tracked: elementIsTracked(element)
26
+ };
27
+ }
28
+ firstLoad = false;
29
+ }
30
+ copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);
31
+ removeCurrentHeadProvisionalElements(oldHead.provisional);
32
+ copyNewHeadProvisionalElements(newHead.provisional);
33
+ return copyNewHeadScriptElements(newHead.scripts);
34
+ }
35
+ function trackedElementSignature(scripts) {
36
+ return scripts.filter(elementIsTracked).map((s) => s.outerHTML).join();
37
+ }
38
+ function copyNewHeadStylesheetElements(next, prev) {
39
+ const existing = prev.map((s) => s.outerHTML);
40
+ for (const element of next) {
41
+ if (!existing.includes(element.outerHTML)) {
42
+ document.head.appendChild(element);
43
+ }
44
+ }
45
+ }
46
+ function copyNewHeadScriptElements(next) {
47
+ const deferredScripts = [];
48
+ let blockingLoaded = [];
49
+ const scriptsLoadedPromise = new Promise((onScriptsLoaded) => {
50
+ for (const element of next) {
51
+ const runBefore = element.outerHTML in allHeadScriptsEverRun;
52
+ if (!runBefore) {
53
+ let cb;
54
+ if (!element.defer && element.src) {
55
+ const idx = blockingLoaded.length;
56
+ cb = () => {
57
+ blockingLoaded[idx] = true;
58
+ if (blockingLoaded.every((v) => v)) {
59
+ onScriptsLoaded();
60
+ }
61
+ };
62
+ blockingLoaded.push(false);
63
+ }
64
+ const newElement = createScriptElement(element, cb);
65
+ if (element.defer) {
66
+ deferredScripts.push(newElement);
67
+ } else {
68
+ document.head.appendChild(newElement);
69
+ }
70
+ allHeadScriptsEverRun[element.outerHTML] = {
71
+ tracked: elementIsTracked(element)
72
+ };
73
+ }
74
+ }
75
+ if (blockingLoaded.length === 0) {
76
+ onScriptsLoaded();
77
+ }
78
+ });
79
+ return () => {
80
+ deferredScripts.forEach((s) => document.head.appendChild(s));
81
+ return scriptsLoadedPromise;
82
+ };
83
+ }
84
+ function removeCurrentHeadProvisionalElements(prev) {
85
+ for (const element of prev) {
86
+ document.head.removeChild(element);
87
+ }
88
+ }
89
+ function copyNewHeadProvisionalElements(next) {
90
+ for (const element of next) {
91
+ document.head.appendChild(element);
92
+ }
93
+ }
94
+ function elementIsTracked(element) {
95
+ return element.getAttribute("data-turbolinks-track") == "reload";
96
+ }
97
+ function elementIsScript(element) {
98
+ const tagName = element.tagName.toLowerCase();
99
+ return tagName == "script";
100
+ }
101
+ function elementIsStylesheet(element) {
102
+ const tagName = element.tagName.toLowerCase();
103
+ return tagName == "style" || tagName == "link" && element.getAttribute("rel") == "stylesheet";
104
+ }
105
+ function elementIsFavicon(element) {
106
+ const tagName = element.tagName.toLowerCase();
107
+ return tagName == "link" && element.getAttribute("rel") == "icon";
108
+ }
109
+ function categorizeHead(head) {
110
+ const scripts = [];
111
+ const stylesheets = [];
112
+ const provisional = [];
113
+ for (const element of head.children) {
114
+ if (elementIsFavicon(element)) {
115
+ continue;
116
+ }
117
+ if (elementIsScript(element)) {
118
+ scripts.push(element);
119
+ } else if (elementIsStylesheet(element)) {
120
+ stylesheets.push(element);
121
+ } else {
122
+ provisional.push(element);
123
+ }
124
+ }
125
+ return { scripts, stylesheets, provisional };
126
+ }
127
+
128
+ // renderer/wrapped/onBeforeRenderClient.ts
129
+ Turbolinks.start();
130
+ async function wrappedOnBeforeRenderClient(pageContext) {
131
+ if (pageContext.isHydration) {
132
+ pageContext._turbolinksProxy = {
133
+ body: document.getElementById("proxied-body")
134
+ };
135
+ return;
136
+ }
137
+ if (pageContext?._snapshot) {
138
+ if (pageContext.isHydration) {
139
+ throw new Error(
140
+ "restoration visit should never happen on initial render"
141
+ );
142
+ }
143
+ const { proxyLayoutInfo } = pageContext._snapshot.pageContext;
144
+ const { bodyEl, headEl } = pageContext._snapshot;
145
+ const proxyBodyEl = bodyEl.querySelector("#proxied-body");
146
+ if (!proxyBodyEl || !(proxyBodyEl instanceof HTMLElement)) {
147
+ throw new Error("proxied body not found in cached snapshot");
148
+ }
149
+ pageContext.proxyLayoutInfo = proxyLayoutInfo;
150
+ pageContext._turbolinksProxy = {
151
+ body: proxyBodyEl
152
+ };
153
+ await Turbolinks._vikeBeforeRender(() => {
154
+ pageContext._waitForHeadScripts = mergeHead(headEl);
155
+ });
156
+ copyBody(bodyEl);
157
+ } else {
158
+ const { head, body } = pageContext._turbolinksProxy;
159
+ await Turbolinks._vikeBeforeRender(() => {
160
+ pageContext._waitForHeadScripts = mergeHead(head);
161
+ });
162
+ copyBody(body);
163
+ }
164
+ }
165
+ function copyBody(bodyEl) {
166
+ document.body.getAttributeNames().forEach((n) => document.body.removeAttribute(n));
167
+ copyElementAttributes(document.body, bodyEl);
168
+ }
169
+ export {
170
+ wrappedOnBeforeRenderClient as default
171
+ };
172
+ //# sourceMappingURL=onBeforeRenderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/turbolinks/mergeHead.ts","../../../renderer/wrapped/onBeforeRenderClient.ts"],"sourcesContent":["import { createScriptElement } from \"./util\";\n\ninterface ElementDetails {\n tracked: boolean;\n}\nconst allHeadScriptsEverRun: { [outerHTML: string]: ElementDetails } = {};\nlet firstLoad = true;\nlet lastTrackedScriptSignature: string;\n\n// Returns function which resolves when all new blocking head scripts have loaded\nexport function mergeHead(head: HTMLHeadElement) {\n const newHead = categorizeHead(head);\n const oldHead = categorizeHead(document.head);\n const reload = () => window.Turbolinks.controller.viewInvalidated();\n\n if (\n head\n .querySelector('meta[name=\"turbolinks-visit-control\"]')\n ?.getAttribute(\"content\") === \"reload\"\n ) {\n reload();\n }\n\n lastTrackedScriptSignature =\n lastTrackedScriptSignature ||\n trackedElementSignature([...oldHead.scripts, ...oldHead.stylesheets]);\n if (\n lastTrackedScriptSignature !==\n trackedElementSignature([...newHead.scripts, ...newHead.stylesheets])\n ) {\n reload();\n }\n\n if (firstLoad) {\n // TODO: messy code\n for (const element of oldHead.scripts) {\n allHeadScriptsEverRun[element.outerHTML] = {\n tracked: elementIsTracked(element),\n };\n }\n firstLoad = false;\n }\n\n copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);\n removeCurrentHeadProvisionalElements(oldHead.provisional);\n copyNewHeadProvisionalElements(newHead.provisional);\n\n return copyNewHeadScriptElements(newHead.scripts);\n}\n\nfunction trackedElementSignature(scripts: Element[]) {\n return scripts\n .filter(elementIsTracked)\n .map((s) => s.outerHTML)\n .join();\n}\n\nfunction copyNewHeadStylesheetElements(next: Element[], prev: Element[]) {\n const existing = prev.map((s) => s.outerHTML);\n for (const element of next) {\n if (!existing.includes(element.outerHTML)) {\n document.head.appendChild(element);\n }\n }\n}\n\nfunction copyNewHeadScriptElements(next: Element[]): () => Promise<void> {\n const deferredScripts: Element[] = [];\n let blockingLoaded: boolean[] = [];\n const scriptsLoadedPromise = new Promise<void>((onScriptsLoaded) => {\n for (const element of next as HTMLScriptElement[]) {\n const runBefore = element.outerHTML in allHeadScriptsEverRun;\n if (!runBefore) {\n let cb;\n if (!element.defer && element.src) {\n const idx = blockingLoaded.length;\n cb = () => {\n blockingLoaded[idx] = true;\n if (blockingLoaded.every((v) => v)) {\n onScriptsLoaded();\n }\n };\n blockingLoaded.push(false);\n }\n const newElement = createScriptElement(element, cb);\n if (element.defer) {\n deferredScripts.push(newElement);\n } else {\n document.head.appendChild(newElement);\n }\n allHeadScriptsEverRun[element.outerHTML] = {\n tracked: elementIsTracked(element),\n };\n }\n }\n if (blockingLoaded.length === 0) {\n // raf waits for react to finish\n onScriptsLoaded();\n }\n });\n return () => {\n deferredScripts.forEach((s) => document.head.appendChild(s));\n return scriptsLoadedPromise;\n };\n}\n\nfunction removeCurrentHeadProvisionalElements(prev: Element[]) {\n for (const element of prev) {\n document.head.removeChild(element);\n }\n}\n\nfunction copyNewHeadProvisionalElements(next: Element[]) {\n for (const element of next) {\n document.head.appendChild(element);\n }\n}\n\nfunction elementIsTracked(element: Element) {\n return element.getAttribute(\"data-turbolinks-track\") == \"reload\";\n}\n\nfunction elementIsScript(element: Element) {\n const tagName = element.tagName.toLowerCase();\n return tagName == \"script\";\n}\n\nfunction elementIsStylesheet(element: Element) {\n const tagName = element.tagName.toLowerCase();\n return (\n tagName == \"style\" ||\n (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n );\n}\n\nfunction elementIsFavicon(element: Element) {\n const tagName = element.tagName.toLowerCase();\n\n return tagName == \"link\" && element.getAttribute(\"rel\") == \"icon\";\n}\n\nfunction categorizeHead(head: ParentNode) {\n const scripts = [];\n const stylesheets = [];\n const provisional = [];\n for (const element of head.children) {\n // we want to keep the same favicon on page transitions\n if (elementIsFavicon(element)) {\n continue;\n }\n\n if (elementIsScript(element)) {\n scripts.push(element);\n } else if (elementIsStylesheet(element)) {\n stylesheets.push(element);\n } else {\n provisional.push(element);\n }\n }\n return { scripts, stylesheets, provisional };\n}\n","import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport { copyElementAttributes } from \"../../lib/turbolinks/util\";\nimport { mergeHead } from \"../../lib/turbolinks/mergeHead\";\n\nTurbolinks.start();\n\nexport default async function wrappedOnBeforeRenderClient(\n pageContext: PageContextClient\n) {\n if (pageContext.isHydration) {\n pageContext._turbolinksProxy = {\n body: document.getElementById(\"proxied-body\")!,\n };\n return;\n }\n\n if (pageContext?._snapshot) {\n if (pageContext.isHydration) {\n throw new Error(\n \"restoration visit should never happen on initial render\"\n );\n }\n const { proxyLayoutInfo } = pageContext._snapshot.pageContext;\n const { bodyEl, headEl } = pageContext._snapshot;\n const proxyBodyEl = bodyEl.querySelector(\"#proxied-body\")!;\n if (!proxyBodyEl || !(proxyBodyEl instanceof HTMLElement)) {\n throw new Error(\"proxied body not found in cached snapshot\");\n }\n pageContext.proxyLayoutInfo = proxyLayoutInfo;\n pageContext._turbolinksProxy = {\n body: proxyBodyEl,\n };\n\n await Turbolinks._vikeBeforeRender(() => {\n pageContext._waitForHeadScripts = mergeHead(headEl);\n });\n copyBody(bodyEl);\n } else {\n const { head, body } = pageContext._turbolinksProxy!;\n\n await Turbolinks._vikeBeforeRender(() => {\n pageContext._waitForHeadScripts = mergeHead(head!);\n });\n copyBody(body);\n }\n}\n\n// Copy over body attributes because vike-react only handles body on initial render\nfunction copyBody(bodyEl: HTMLElement) {\n document.body\n .getAttributeNames()\n .forEach((n) => document.body.removeAttribute(n));\n copyElementAttributes(document.body, bodyEl);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,5 @@
1
+ import { PageContextServer } from 'vike/types';
2
+
3
+ declare function wrappedOnBeforeRenderHtml(pageContext: PageContextServer): void;
4
+
5
+ export { wrappedOnBeforeRenderHtml as default };
@@ -0,0 +1,14 @@
1
+ // renderer/wrapped/onBeforeRenderHtml.ts
2
+ import { useConfig } from "vike-react/useConfig";
3
+ function wrappedOnBeforeRenderHtml(pageContext) {
4
+ if (pageContext._wrappedServerOnly) {
5
+ const { bodyAttributes, proxyLayoutInfo } = pageContext._wrappedServerOnly;
6
+ const config = useConfig();
7
+ config({ bodyAttributes });
8
+ pageContext.proxyLayoutInfo = proxyLayoutInfo;
9
+ }
10
+ }
11
+ export {
12
+ wrappedOnBeforeRenderHtml as default
13
+ };
14
+ //# sourceMappingURL=onBeforeRenderHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../renderer/wrapped/onBeforeRenderHtml.ts"],"sourcesContent":["import { PageContextServer } from \"vike/types\";\nimport { useConfig } from \"vike-react/useConfig\";\n\nexport default function wrappedOnBeforeRenderHtml(\n pageContext: PageContextServer\n) {\n if (pageContext._wrappedServerOnly) {\n const { bodyAttributes, proxyLayoutInfo } = pageContext._wrappedServerOnly;\n const config = useConfig();\n\n config({ bodyAttributes });\n\n // Move layout/layoutProps to top-level pageContext so Vike can pass them to client\n pageContext.proxyLayoutInfo = proxyLayoutInfo;\n }\n}\n"],"mappings":";AACA,SAAS,iBAAiB;AAEX,SAAR,0BACL,aACA;AACA,MAAI,YAAY,oBAAoB;AAClC,UAAM,EAAE,gBAAgB,gBAAgB,IAAI,YAAY;AACxD,UAAM,SAAS,UAAU;AAEzB,WAAO,EAAE,eAAe,CAAC;AAGzB,gBAAY,kBAAkB;AAAA,EAChC;AACF;","names":[]}