@alignable/bifrost 1.0.10 → 1.0.12

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.
@@ -3,10 +3,9 @@ import React from "react";
3
3
  import { usePageContext } from "vike-react/usePageContext";
4
4
  function Wrapper({ children }) {
5
5
  const pageContext = usePageContext();
6
- const beforeRender = pageContext.isClientSide && pageContext._beforeRender;
7
- if (beforeRender) {
8
- beforeRender();
9
- pageContext._beforeRender = void 0;
6
+ if (pageContext.isClientSide && pageContext._shouldEmitBeforeRender) {
7
+ window.Turbolinks.controller.viewWillRender();
8
+ pageContext._shouldEmitBeforeRender = false;
10
9
  }
11
10
  return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
12
11
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../renderer/Wrapper.tsx"],"sourcesContent":["import React from \"react\";\nimport { usePageContext } from \"vike-react/usePageContext\";\n\nexport default function Wrapper({ children }: { children: React.ReactNode }) {\n const pageContext = usePageContext();\n\n // We want to fire `turbolinks:before-render` as late as possible - synchronously before rendering the page.\n // This is important because before-render scripts may clear the DOM, and we want to paint the new page immediately\n // onBeforeRenderClient awaits for promises so there is a delay\n const beforeRender = pageContext.isClientSide && pageContext._beforeRender;\n if (beforeRender) {\n beforeRender();\n pageContext._beforeRender = undefined;\n }\n return <>{children}</>;\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,sBAAsB;AAEhB,SAAR,QAAyB,EAAE,SAAS,GAAkC;AAC3E,QAAM,cAAc,eAAe;AAKnC,QAAM,eAAe,YAAY,gBAAgB,YAAY;AAC7D,MAAI,cAAc;AAChB,iBAAa;AACb,gBAAY,gBAAgB;AAAA,EAC9B;AACA,SAAO,0DAAG,QAAS;AACrB;","names":[]}
1
+ {"version":3,"sources":["../../renderer/Wrapper.tsx"],"sourcesContent":["import React from \"react\";\nimport { usePageContext } from \"vike-react/usePageContext\";\n\nexport default function Wrapper({ children }: { children: React.ReactNode }) {\n const pageContext = usePageContext();\n\n // We want to fire `turbolinks:before-render` as late as possible - synchronously before rendering the page.\n // This is important because before-render scripts may clear the DOM, and we want to paint the new page immediately\n // onBeforeRenderClient awaits for promises so there is a delay\n if (pageContext.isClientSide && pageContext._shouldEmitBeforeRender) {\n window.Turbolinks.controller.viewWillRender();\n pageContext._shouldEmitBeforeRender = false;\n }\n \n return <>{children}</>;\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,sBAAsB;AAEhB,SAAR,QAAyB,EAAE,SAAS,GAAkC;AAC3E,QAAM,cAAc,eAAe;AAKnC,MAAI,YAAY,gBAAgB,YAAY,yBAAyB;AACnE,WAAO,WAAW,WAAW,eAAe;AAC5C,gBAAY,0BAA0B;AAAA,EACxC;AAEA,SAAO,0DAAG,QAAS;AACrB;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { PageContextClient } from 'vike/types';
2
- import '../../type-813ffb18.js';
2
+ import '../../type-d58626e7.js';
3
3
  import '../../controller-01a828bc.js';
4
4
 
5
5
  declare function bifrostOnAfterRenderClient(pageContext: PageContextClient): Promise<void>;
@@ -8,9 +8,7 @@ import {
8
8
  // renderer/bifrost/onBeforeRenderClient.ts
9
9
  async function bifrostOnBeforeRenderClient(pageContext) {
10
10
  if (!pageContext.isHydration) {
11
- pageContext._beforeRender = () => {
12
- Turbolinks.controller.viewWillRender();
13
- };
11
+ pageContext._shouldEmitBeforeRender = true;
14
12
  await Turbolinks._vikeBeforeRender(
15
13
  pageContext._turbolinksVisit,
16
14
  pageContext.errorWhileRendering
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../renderer/bifrost/onBeforeRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport { setBodyAttributes } from \"../../lib/elementUtils\";\n\nexport default async function bifrostOnBeforeRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration) {\n pageContext._beforeRender = () => {\n Turbolinks.controller.viewWillRender(); // turbolinks:before-render\n };\n await Turbolinks._vikeBeforeRender(\n pageContext._turbolinksVisit,\n pageContext.errorWhileRendering\n );\n\n // Copy over body attributes because vike-react only handles body on initial render, and we need to reset when coming from wrapped\n if (pageContext.config.bodyAttributes)\n setBodyAttributes(\n pageContext.config.bodyAttributes.reduce(\n (acc, attrs) => ({ ...acc, ...attrs }),\n {}\n )\n );\n }\n}\n"],"mappings":";;;;;;;;AAIA,eAAO,4BACL,aACA;AACA,MAAI,CAAC,YAAY,aAAa;AAC5B,gBAAY,gBAAgB,MAAM;AAChC,iBAAW,WAAW,eAAe;AAAA,IACvC;AACA,UAAM,WAAW;AAAA,MACf,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAGA,QAAI,YAAY,OAAO;AACrB;AAAA,QACE,YAAY,OAAO,eAAe;AAAA,UAChC,CAAC,KAAK,WAAW,EAAE,GAAG,KAAK,GAAG,MAAM;AAAA,UACpC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,EACJ;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../renderer/bifrost/onBeforeRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport { setBodyAttributes } from \"../../lib/elementUtils\";\n\nexport default async function bifrostOnBeforeRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration) {\n pageContext._shouldEmitBeforeRender = true;\n await Turbolinks._vikeBeforeRender(\n pageContext._turbolinksVisit,\n pageContext.errorWhileRendering\n );\n\n // Copy over body attributes because vike-react only handles body on initial render, and we need to reset when coming from wrapped\n if (pageContext.config.bodyAttributes)\n setBodyAttributes(\n pageContext.config.bodyAttributes.reduce(\n (acc, attrs) => ({ ...acc, ...attrs }),\n {}\n )\n );\n }\n}\n"],"mappings":";;;;;;;;AAIA,eAAO,4BACL,aACA;AACA,MAAI,CAAC,YAAY,aAAa;AAC5B,gBAAY,0BAA0B;AACtC,UAAM,WAAW;AAAA,MACf,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAGA,QAAI,YAAY,OAAO;AACrB;AAAA,QACE,YAAY,OAAO,eAAe;AAAA,UAChC,CAAC,KAAK,WAAW,EAAE,GAAG,KAAK,GAAG,MAAM;AAAA,UACpC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,EACJ;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- export { W as WrappedServerOnly } from '../type-813ffb18.js';
1
+ export { W as WrappedServerOnly } from '../type-d58626e7.js';
2
2
  import '../controller-01a828bc.js';
3
3
  import 'vike/types';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { PageContextServer } from 'vike/types';
2
- import '../type-813ffb18.js';
2
+ import '../type-d58626e7.js';
3
3
  import '../controller-01a828bc.js';
4
4
 
5
5
  declare function headHtmlEnd(pageContext: PageContextServer): string;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import '../config.js';
3
- import '../../type-813ffb18.js';
3
+ import '../../type-d58626e7.js';
4
4
  import '../../controller-01a828bc.js';
5
5
  import 'vike/types';
6
6
 
@@ -1,4 +1,4 @@
1
- import '../../type-813ffb18.js';
1
+ import '../../type-d58626e7.js';
2
2
  import { PageContextClient } from 'vike/types';
3
3
  import '../../controller-01a828bc.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import '../../type-813ffb18.js';
1
+ import '../../type-d58626e7.js';
2
2
  import { PageContextClient } from 'vike/types';
3
3
  import '../../controller-01a828bc.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import '../../type-813ffb18.js';
1
+ import '../../type-d58626e7.js';
2
2
  import { PageContextClient } from 'vike/types';
3
3
  import '../../controller-01a828bc.js';
4
4
 
@@ -14,13 +14,21 @@ var lastTrackedScriptSignature;
14
14
  function mergeHead(head) {
15
15
  const newHead = categorizeHead(head);
16
16
  const oldHead = categorizeHead(document.head);
17
- const reload = () => window.Turbolinks.controller.viewInvalidated();
17
+ const reload = () => {
18
+ window.Turbolinks.controller.viewInvalidated();
19
+ return {
20
+ waitForReload: () => new Promise(() => {
21
+ }),
22
+ waitForHeadScripts: () => new Promise(() => {
23
+ })
24
+ };
25
+ };
18
26
  if (head.querySelector('meta[name="turbolinks-visit-control"]')?.getAttribute("content") === "reload") {
19
- reload();
27
+ return reload();
20
28
  }
21
29
  lastTrackedScriptSignature = lastTrackedScriptSignature || trackedElementSignature([...oldHead.scripts, ...oldHead.stylesheets]);
22
30
  if (lastTrackedScriptSignature !== trackedElementSignature([...newHead.scripts, ...newHead.stylesheets])) {
23
- reload();
31
+ return reload();
24
32
  }
25
33
  if (firstLoad) {
26
34
  for (const element of oldHead.scripts) {
@@ -33,7 +41,10 @@ function mergeHead(head) {
33
41
  copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);
34
42
  removeCurrentHeadProvisionalElements(oldHead.provisional);
35
43
  copyNewHeadProvisionalElements(newHead.provisional);
36
- return copyNewHeadScriptElements(newHead.scripts);
44
+ return {
45
+ waitForReload: () => Promise.resolve(),
46
+ waitForHeadScripts: copyNewHeadScriptElements(newHead.scripts)
47
+ };
37
48
  }
38
49
  function trackedElementSignature(scripts) {
39
50
  return scripts.filter(elementIsTracked).map((s) => s.outerHTML).join();
@@ -131,6 +142,11 @@ function categorizeHead(head) {
131
142
  // renderer/wrapped/onBeforeRenderClient.ts
132
143
  async function wrappedOnBeforeRenderClient(pageContext) {
133
144
  if (pageContext.isHydration) {
145
+ if (document.readyState === "loading") {
146
+ await new Promise(
147
+ (resolve) => document.addEventListener("DOMContentLoaded", () => resolve(null))
148
+ );
149
+ }
134
150
  pageContext._turbolinksProxy = {
135
151
  body: document.getElementById("proxied-body")
136
152
  };
@@ -156,14 +172,14 @@ async function wrappedOnBeforeRenderClient(pageContext) {
156
172
  };
157
173
  }
158
174
  const { head, bodyAttrs } = pageContext._turbolinksProxy;
159
- pageContext._beforeRender = () => {
160
- pageContext._waitForHeadScripts = mergeHead(head);
161
- Turbolinks.controller.viewWillRender();
162
- };
175
+ pageContext._shouldEmitBeforeRender = true;
163
176
  await Turbolinks._vikeBeforeRender(
164
177
  pageContext._turbolinksVisit,
165
178
  pageContext.errorWhileRendering
166
179
  );
180
+ const { waitForReload, waitForHeadScripts } = mergeHead(head);
181
+ await waitForReload();
182
+ pageContext._waitForHeadScripts = waitForHeadScripts;
167
183
  if (bodyAttrs)
168
184
  setBodyAttributes(bodyAttrs);
169
185
  }
@@ -1 +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\";\nimport {\n setBodyAttributes,\n getElementAttributes,\n} from \"../../lib/elementUtils\";\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 bodyAttrs: getElementAttributes(bodyEl),\n body: proxyBodyEl,\n head: headEl,\n };\n }\n const { head, bodyAttrs } = pageContext._turbolinksProxy!;\n pageContext._beforeRender = () => {\n pageContext._waitForHeadScripts = mergeHead(head!);\n Turbolinks.controller.viewWillRender(); // turbolinks:before-render\n };\n\n await Turbolinks._vikeBeforeRender(\n pageContext._turbolinksVisit,\n pageContext.errorWhileRendering\n );\n\n if (bodyAttrs) setBodyAttributes(bodyAttrs);\n}\n"],"mappings":"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","names":[]}
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 = () => {\n window.Turbolinks.controller.viewInvalidated()\n return {\n waitForReload: () => new Promise<void>(() => {}),\n waitForHeadScripts: () => new Promise<void>(() => {}),\n }\n };\n\n if (\n head\n .querySelector('meta[name=\"turbolinks-visit-control\"]')\n ?.getAttribute(\"content\") === \"reload\"\n ) {\n return 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 return 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 {\n waitForReload: () => Promise.resolve(),\n waitForHeadScripts: copyNewHeadScriptElements(newHead.scripts),\n };\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\";\nimport {\n setBodyAttributes,\n getElementAttributes,\n} from \"../../lib/elementUtils\";\n\nexport default async function wrappedOnBeforeRenderClient(\n pageContext: PageContextClient\n) {\n if (pageContext.isHydration) {\n // Vike scripts load async so can run before document.body exists. we need to delay rendering.\n // This is only an issue if user sets `injectScriptsAt: \"HTML_BEGIN\"` in +config.ts\n if (document.readyState === \"loading\") {\n await new Promise((resolve) =>\n document.addEventListener(\"DOMContentLoaded\", () => resolve(null))\n );\n }\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 bodyAttrs: getElementAttributes(bodyEl),\n body: proxyBodyEl,\n head: headEl,\n };\n }\n const { head, bodyAttrs } = pageContext._turbolinksProxy!;\n pageContext._shouldEmitBeforeRender = true;\n\n await Turbolinks._vikeBeforeRender(\n pageContext._turbolinksVisit,\n pageContext.errorWhileRendering\n );\n const { waitForReload, waitForHeadScripts } = mergeHead(head!);\n\n // If a full reload is required, wait for it here\n await waitForReload();\n pageContext._waitForHeadScripts = waitForHeadScripts;\n\n if (bodyAttrs) setBodyAttributes(bodyAttrs);\n}\n"],"mappings":"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","names":[]}
@@ -20,9 +20,9 @@ declare global {
20
20
  }
21
21
  interface PageContextClient {
22
22
  _snapshot?: Snapshot;
23
- _beforeRender?: () => void;
24
23
  _waitForHeadScripts?: () => Promise<void>;
25
24
  _turbolinksVisit?: Visit;
25
+ _shouldEmitBeforeRender?: boolean;
26
26
  }
27
27
  }
28
28
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@alignable/bifrost",
3
3
  "repository": "https://github.com/Alignable/bifrost.git",
4
- "version": "1.0.10",
4
+ "version": "1.0.12",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {