@alignable/bifrost 1.0.29 → 1.0.31

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 (33) hide show
  1. package/dist/{chunk-HMWI2UKQ.js → chunk-DI7YJ6WP.js} +9 -1
  2. package/dist/chunk-DI7YJ6WP.js.map +1 -0
  3. package/dist/{chunk-NO3JVTT3.js → chunk-K4IICQ55.js} +1 -1
  4. package/dist/chunk-K4IICQ55.js.map +1 -0
  5. package/dist/{chunk-IM33TFPL.js → chunk-SKQ56GUV.js} +2 -2
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/renderer/+config.js +1 -1
  9. package/dist/renderer/Wrapper.js +5 -7
  10. package/dist/renderer/Wrapper.js.map +1 -1
  11. package/dist/renderer/bifrost/onAfterRenderClient.d.ts +3 -3
  12. package/dist/renderer/bifrost/onAfterRenderClient.js +7 -5
  13. package/dist/renderer/bifrost/onAfterRenderClient.js.map +1 -1
  14. package/dist/renderer/bifrost/onBeforeRenderClient.d.ts +2 -2
  15. package/dist/renderer/bifrost/onBeforeRenderClient.js +7 -5
  16. package/dist/renderer/bifrost/onBeforeRenderClient.js.map +1 -1
  17. package/dist/renderer/config.d.ts +16 -1
  18. package/dist/renderer/headHtmlEnd.d.ts +1 -1
  19. package/dist/renderer/turbolinksStart.js +2 -2
  20. package/dist/renderer/wrapped/Page.d.ts +1 -1
  21. package/dist/renderer/wrapped/Page.js +1 -1
  22. package/dist/renderer/wrapped/onAfterRenderClient.d.ts +3 -3
  23. package/dist/renderer/wrapped/onAfterRenderClient.js +7 -5
  24. package/dist/renderer/wrapped/onAfterRenderClient.js.map +1 -1
  25. package/dist/renderer/wrapped/onBeforeRender.client.d.ts +1 -1
  26. package/dist/renderer/wrapped/onBeforeRenderClient.d.ts +3 -3
  27. package/dist/renderer/wrapped/onBeforeRenderClient.js +13 -10
  28. package/dist/renderer/wrapped/onBeforeRenderClient.js.map +1 -1
  29. package/dist/{type-490a74eb.d.ts → type-5bab0608.d.ts} +1 -0
  30. package/package.json +1 -1
  31. package/dist/chunk-HMWI2UKQ.js.map +0 -1
  32. package/dist/chunk-NO3JVTT3.js.map +0 -1
  33. /package/dist/{chunk-IM33TFPL.js.map → chunk-SKQ56GUV.js.map} +0 -0
@@ -20,6 +20,7 @@ var config_default = {
20
20
  getLayout: { env: { server: true, client: true } },
21
21
  layoutHeaders: { env: { server: true, client: false } },
22
22
  proxyHeaders: { env: { server: true, client: true } },
23
+ onWrappedReactRenderTimeout: { env: { server: false, client: true } },
23
24
  proxyMode: {
24
25
  env: { server: true, client: true, config: true },
25
26
  effect({ configDefinedAt, configValue }) {
@@ -37,6 +38,13 @@ var config_default = {
37
38
  onBeforeRender: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default",
38
39
  onBeforeRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default",
39
40
  onAfterRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default",
41
+ // Disable onRenderClient timeout since we wait for head scripts to load in onAfterRenderClient
42
+ // onWrappedReactRenderTimeout will fire when vike-react's onRenderClient times out.
43
+ // Ideally, we could only disable timeout for onAfterRenderClient
44
+ // https://github.com/vikejs/vike/issues/3147
45
+ hooksTimeout: {
46
+ onRenderClient: false
47
+ },
40
48
  meta: {
41
49
  onBeforeRender: { env: { client: true, server: false } }
42
50
  }
@@ -59,4 +67,4 @@ var config_default = {
59
67
  export {
60
68
  config_default
61
69
  };
62
- //# sourceMappingURL=chunk-HMWI2UKQ.js.map
70
+ //# sourceMappingURL=chunk-DI7YJ6WP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../renderer/config.ts"],"sourcesContent":["import { type Config } from \"vike/types\";\n\nexport default {\n name: \"@alignable/bifrost\",\n require: {\n vike: \">=0.4.244\",\n \"vike-react\": \">=0.6.11\",\n },\n\n headHtmlBegin:\n \"import:@alignable/bifrost/__internal/renderer/headHtmlBegin:default\",\n headHtmlEnd:\n \"import:@alignable/bifrost/__internal/renderer/headHtmlEnd:default\",\n onBeforeRoute:\n \"import:@alignable/bifrost/__internal/renderer/onBeforeRoute:default\",\n Wrapper: \"import:@alignable/bifrost/__internal/renderer/Wrapper:default\",\n\n passToClient: [\"proxyLayoutInfo\"],\n\n meta: {\n bodyAttributes: {\n // vike-react bodyAttributes are server-only, but legacy backend may change bodyAttributes and we need to reset on return to bifrost pages\n env: { server: true, client: true },\n global: true,\n cumulative: true,\n },\n getLayout: { env: { server: true, client: true } },\n layoutHeaders: { env: { server: true, client: false } },\n proxyHeaders: { env: { server: true, client: true } },\n onWrappedReactRenderTimeout: { env: { server: false, client: true} },\n proxyMode: {\n env: { server: true, client: true, config: true },\n effect({ configDefinedAt, configValue }) {\n switch (configValue) {\n case false:\n return {\n onBeforeRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/bifrost/onBeforeRenderClient:default\",\n onAfterRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/bifrost/onAfterRenderClient:default\",\n };\n case \"wrapped\":\n return {\n Page: \"import:@alignable/bifrost/__internal/renderer/wrapped/Page:default\" as any,\n onRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onRenderHtml:default\",\n onBeforeRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderHtml:default\",\n onBeforeRender:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default\",\n onBeforeRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default\",\n onAfterRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default\",\n // Disable onRenderClient timeout since we wait for head scripts to load in onAfterRenderClient\n // onWrappedReactRenderTimeout will fire when vike-react's onRenderClient times out.\n // Ideally, we could only disable timeout for onAfterRenderClient\n // https://github.com/vikejs/vike/issues/3147\n hooksTimeout: {\n onRenderClient: false,\n },\n meta: {\n onBeforeRender: { env: { client: true, server: false } },\n },\n };\n case \"passthru\":\n // tell Vike to hit the server for all passthru pages (which will get load balanced to legacy backend)\n return {\n onRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/passthru/onRenderHtml:default\",\n clientRouting: false,\n };\n default:\n throw new Error(\n `${configDefinedAt} should be one of: false, \"wrapped\", \"passthru\"`\n );\n }\n },\n },\n },\n} satisfies Config;\n\n/**\n * Returning null tells Bifrost to run passthru proxy\n */\nexport type GetLayout = (\n headers: Record<string, number | string | string[] | undefined>\n) => Vike.ProxyLayoutInfo | null;\n\ndeclare global {\n namespace Vike {\n interface Config {\n proxyMode?: false | \"wrapped\" | \"passthru\";\n proxyHeaders?: Record<string, string>;\n getLayout?: GetLayout;\n /** Response headers that should be consumed server-side and stripped before sending to the client. */\n layoutHeaders?: string[];\n /**\n * Fired when react render times out on the client in the wrapped proxy\n */\n onWrappedReactRenderTimeout?: (pageContext: PageContext) => void;\n }\n interface PageContext {\n proxyLayoutInfo?: ProxyLayoutInfo;\n }\n interface ProxyLayoutInfo {}\n }\n}\n\n// This is only used for fastify integration\nexport { type WrappedServerOnly } from \"../lib/type\";\n"],"mappings":";AAEA,IAAO,iBAAQ;AAAA,EACb,MAAM;AAAA,EACN,SAAS;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EAEA,eACE;AAAA,EACF,aACE;AAAA,EACF,eACE;AAAA,EACF,SAAS;AAAA,EAET,cAAc,CAAC,iBAAiB;AAAA,EAEhC,MAAM;AAAA,IACJ,gBAAgB;AAAA;AAAA,MAEd,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK;AAAA,MAClC,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,IACA,WAAW,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACjD,eAAe,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,IACtD,cAAc,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACpD,6BAA6B,EAAE,KAAK,EAAE,QAAQ,OAAO,QAAQ,KAAI,EAAE;AAAA,IACnE,WAAW;AAAA,MACT,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,MAChD,OAAO,EAAE,iBAAiB,YAAY,GAAG;AACvC,gBAAQ,aAAa;AAAA,UACnB,KAAK;AACH,mBAAO;AAAA,cACL,sBACE;AAAA,cACF,qBACE;AAAA,YACJ;AAAA,UACF,KAAK;AACH,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cACE;AAAA,cACF,oBACE;AAAA,cACF,gBACE;AAAA,cACF,sBACE;AAAA,cACF,qBACE;AAAA;AAAA;AAAA;AAAA;AAAA,cAKF,cAAc;AAAA,gBACZ,gBAAgB;AAAA,cAClB;AAAA,cACA,MAAM;AAAA,gBACJ,gBAAgB,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF,KAAK;AAEH,mBAAO;AAAA,cACL,cACE;AAAA,cACF,eAAe;AAAA,YACjB;AAAA,UACF;AACE,kBAAM,IAAI;AAAA,cACR,GAAG,eAAe;AAAA,YACpB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -27,4 +27,4 @@ function instrument(fnName, fn) {
27
27
  export {
28
28
  instrument
29
29
  };
30
- //# sourceMappingURL=chunk-NO3JVTT3.js.map
30
+ //# sourceMappingURL=chunk-K4IICQ55.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/diagnostic.client.ts"],"sourcesContent":["type InstrumentedFunctions = \"_vikeAfterRender\" | \"_vikeBeforeRender\" | \"_waitForHeadScripts\" | \"_waitForReload\" | \"wrappedOnBeforeRenderClient\" | \"wrappedOnAfterRenderClient\" | \"bifrostOnBeforeRenderClient\" | \"bifrostOnAfterRenderClient\" | \"recordExistingHeadScripts\" | \"_waitForDOMContentLoaded\";\n\ninterface DiagnosticEventDetail {\n /** Whether the instrumented function is starting or has finished. */\n type: \"start\" | \"end\";\n /** Which instrumented function fired the event. */\n fnName: InstrumentedFunctions;\n}\n\ntype DiagnosticEventName = `bifrost:diagnostic:${InstrumentedFunctions | \"*\"}`;\n\ndeclare global {\n type CustomEventMap = {\n [K in DiagnosticEventName]: CustomEvent<DiagnosticEventDetail>;\n };\n\n interface WindowEventMap extends CustomEventMap {}\n}\n\nfunction dispatchDiagnosticEvent(detail: DiagnosticEventDetail): void {\n const wildCardEvent : DiagnosticEventName = \"bifrost:diagnostic:*\"\n const specificEvent : DiagnosticEventName = `bifrost:diagnostic:${detail.fnName}`;\n window.dispatchEvent(new CustomEvent(specificEvent, { detail }));\n window.dispatchEvent(new CustomEvent(wildCardEvent, { detail }));\n}\n\n/**\n * Wraps `fn` so that it dispatches typed `CustomEvent`s on `window`\n * around each invocation. Works with both sync and async functions —\n * for promises, \"end\" fires in `.finally()`.\n *\n * Each call dispatches two events:\n * - `bifrost:diagnostic:<fnName>` — scoped to the function\n * - `bifrost:diagnostic:*` — wildcard, fires for all instrumented functions\n *\n * @example\n * // Listen for a specific function\n * window.addEventListener(\"bifrost:diagnostic:_vikeBeforeRender\", (e) => {\n * console.log(e.detail.type, e.detail.fnName);\n * });\n *\n * // Listen for all instrumented functions\n * window.addEventListener(\"bifrost:diagnostic:*\", (e) => {\n * console.log(e.detail.type, e.detail.fnName);\n * });\n */\nexport function instrument<N extends InstrumentedFunctions, T extends (...args: any[]) => any>(\n fnName: N,\n fn: T\n): T {\n return function (this: unknown, ...args: Parameters<T>): ReturnType<T> {\n dispatchDiagnosticEvent({ type: \"start\", fnName });\n try {\n const result = fn.apply(this, args);\n if (result instanceof Promise) {\n return result.finally(() => {\n dispatchDiagnosticEvent({ type: \"end\", fnName });\n }) as ReturnType<T>;\n }\n dispatchDiagnosticEvent({ type: \"end\", fnName });\n return result as ReturnType<T>;\n } catch (err) {\n dispatchDiagnosticEvent({ type: \"end\", fnName });\n throw err;\n }\n } as T;\n}\n"],"mappings":";AAmBA,SAAS,wBAAwB,QAAqC;AACpE,QAAM,gBAAsC;AAC5C,QAAM,gBAAsC,sBAAsB,OAAO,MAAM;AAC/E,SAAO,cAAc,IAAI,YAAY,eAAe,EAAE,OAAO,CAAC,CAAC;AAC/D,SAAO,cAAc,IAAI,YAAY,eAAe,EAAE,OAAO,CAAC,CAAC;AACjE;AAsBO,SAAS,WACd,QACA,IACG;AACH,SAAO,YAA4B,MAAoC;AACrE,4BAAwB,EAAE,MAAM,SAAS,OAAO,CAAC;AACjD,QAAI;AACF,YAAM,SAAS,GAAG,MAAM,MAAM,IAAI;AAClC,UAAI,kBAAkB,SAAS;AAC7B,eAAO,OAAO,QAAQ,MAAM;AAC1B,kCAAwB,EAAE,MAAM,OAAO,OAAO,CAAC;AAAA,QACjD,CAAC;AAAA,MACH;AACA,8BAAwB,EAAE,MAAM,OAAO,OAAO,CAAC;AAC/C,aAAO;AAAA,IACT,SAAS,KAAP;AACA,8BAAwB,EAAE,MAAM,OAAO,OAAO,CAAC;AAC/C,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  instrument
3
- } from "./chunk-NO3JVTT3.js";
3
+ } from "./chunk-K4IICQ55.js";
4
4
 
5
5
  // lib/turbolinks/lruCache.ts
6
6
  var LruCache = class {
@@ -818,4 +818,4 @@ export {
818
818
  createScriptElement,
819
819
  Turbolinks
820
820
  };
821
- //# sourceMappingURL=chunk-IM33TFPL.js.map
821
+ //# sourceMappingURL=chunk-SKQ56GUV.js.map
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { navigate as navigate$1 } from 'vike/client/router';
2
2
  export { prefetch } from 'vike/client/router';
3
3
 
4
- type InstrumentedFunctions = "_vikeAfterRender" | "_vikeBeforeRender" | "_waitForHeadScripts" | "_waitForReload";
4
+ type InstrumentedFunctions = "_vikeAfterRender" | "_vikeBeforeRender" | "_waitForHeadScripts" | "_waitForReload" | "wrappedOnBeforeRenderClient" | "wrappedOnAfterRenderClient" | "bifrostOnBeforeRenderClient" | "bifrostOnAfterRenderClient" | "recordExistingHeadScripts" | "_waitForDOMContentLoaded";
5
5
  interface DiagnosticEventDetail {
6
6
  /** Whether the instrumented function is starting or has finished. */
7
7
  type: "start" | "end";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-NO3JVTT3.js";
1
+ import "./chunk-K4IICQ55.js";
2
2
 
3
3
  // index.ts
4
4
  import { prefetch } from "vike/client/router";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  config_default
3
- } from "../chunk-HMWI2UKQ.js";
3
+ } from "../chunk-DI7YJ6WP.js";
4
4
  export {
5
5
  config_default as default
6
6
  };
@@ -4,15 +4,13 @@ import { usePageContext } from "vike-react/usePageContext";
4
4
  function Wrapper({ children }) {
5
5
  const pageContext = usePageContext();
6
6
  if (pageContext.isClientSide && pageContext._shouldEmitBeforeRender) {
7
- try {
8
- window.Turbolinks.controller.viewWillRender();
9
- } catch (error) {
10
- console.error("Error calling window.Turbolinks.controller.viewWillRender:", error);
11
- console.error("Turbolinks:", window.Turbolinks);
12
- throw error;
13
- }
7
+ window.Turbolinks.controller.viewWillRender();
14
8
  pageContext._shouldEmitBeforeRender = false;
15
9
  }
10
+ if (pageContext.isClientSide && pageContext._reactRenderTimeout) {
11
+ clearTimeout(pageContext._reactRenderTimeout);
12
+ pageContext._reactRenderTimeout = void 0;
13
+ }
16
14
  return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
17
15
  }
18
16
  export {
@@ -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 if (pageContext.isClientSide && pageContext._shouldEmitBeforeRender) {\n try {\n window.Turbolinks.controller.viewWillRender();\n } catch (error) {\n // Some logging to diagnose `window.Turbolinks.controller.viewWillRender is not a function`. Remove this after fixing\n console.error(\"Error calling window.Turbolinks.controller.viewWillRender:\", error);\n console.error(\"Turbolinks:\", window.Turbolinks);\n\n throw error;\n }\n \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,QAAI;AACF,aAAO,WAAW,WAAW,eAAe;AAAA,IAC9C,SAAS,OAAP;AAEA,cAAQ,MAAM,8DAA8D,KAAK;AACjF,cAAQ,MAAM,eAAe,OAAO,UAAU;AAE9C,YAAM;AAAA,IACR;AAEA,gBAAY,0BAA0B;AAAA,EACxC;AAEA,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 if (pageContext.isClientSide && pageContext._reactRenderTimeout) {\n clearTimeout(pageContext._reactRenderTimeout);\n pageContext._reactRenderTimeout = undefined;\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,MAAI,YAAY,gBAAgB,YAAY,qBAAqB;AAC/D,iBAAa,YAAY,mBAAmB;AAC5C,gBAAY,sBAAsB;AAAA,EACpC;AAEA,SAAO,0DAAG,QAAS;AACrB;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import { PageContextClient } from 'vike/types';
2
- import '../../type-490a74eb.js';
2
+ import '../../type-5bab0608.js';
3
3
  import '../../controller-962fb27d.js';
4
4
 
5
- declare function bifrostOnAfterRenderClient(pageContext: PageContextClient): void;
5
+ declare const _default: (pageContext: PageContextClient) => void;
6
6
 
7
- export { bifrostOnAfterRenderClient as default };
7
+ export { _default as default };
@@ -1,15 +1,17 @@
1
1
  import {
2
2
  Turbolinks
3
- } from "../../chunk-IM33TFPL.js";
4
- import "../../chunk-NO3JVTT3.js";
3
+ } from "../../chunk-SKQ56GUV.js";
4
+ import {
5
+ instrument
6
+ } from "../../chunk-K4IICQ55.js";
5
7
 
6
8
  // renderer/bifrost/onAfterRenderClient.ts
7
- function bifrostOnAfterRenderClient(pageContext) {
9
+ var onAfterRenderClient_default = instrument("bifrostOnAfterRenderClient", function bifrostOnAfterRenderClient(pageContext) {
8
10
  if (!pageContext.isHydration && !pageContext.errorWhileRendering) {
9
11
  Turbolinks._vikeAfterRender(pageContext._turbolinksVisit, false);
10
12
  }
11
- }
13
+ });
12
14
  export {
13
- bifrostOnAfterRenderClient as default
15
+ onAfterRenderClient_default as default
14
16
  };
15
17
  //# sourceMappingURL=onAfterRenderClient.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../renderer/bifrost/onAfterRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport \"../../lib/type\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\n\nexport default function bifrostOnAfterRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration && !pageContext.errorWhileRendering) {\n Turbolinks._vikeAfterRender(pageContext._turbolinksVisit, false);\n }\n}\n"],"mappings":";;;;;;AAIe,SAAR,2BACL,aACA;AACA,MAAI,CAAC,YAAY,eAAe,CAAC,YAAY,qBAAqB;AAChE,eAAW,iBAAiB,YAAY,kBAAkB,KAAK;AAAA,EACjE;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../renderer/bifrost/onAfterRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport \"../../lib/type\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport { instrument } from \"../../lib/diagnostic.client\";\n\nexport default instrument(\"bifrostOnAfterRenderClient\", function bifrostOnAfterRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration && !pageContext.errorWhileRendering) {\n Turbolinks._vikeAfterRender(pageContext._turbolinksVisit, false);\n }\n});\n"],"mappings":";;;;;;;;AAKA,IAAO,8BAAQ,WAAW,8BAA8B,SAAS,2BAC/D,aACA;AACA,MAAI,CAAC,YAAY,eAAe,CAAC,YAAY,qBAAqB;AAChE,eAAW,iBAAiB,YAAY,kBAAkB,KAAK;AAAA,EACjE;AACF,CAAC;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { PageContextClient } from 'vike/types';
2
2
 
3
- declare function bifrostOnBeforeRenderClient(pageContext: PageContextClient): Promise<void>;
3
+ declare const _default: (pageContext: PageContextClient) => Promise<void>;
4
4
 
5
- export { bifrostOnBeforeRenderClient as default };
5
+ export { _default as default };
@@ -3,11 +3,13 @@ import {
3
3
  } from "../../chunk-7Y5VBDG6.js";
4
4
  import {
5
5
  Turbolinks
6
- } from "../../chunk-IM33TFPL.js";
7
- import "../../chunk-NO3JVTT3.js";
6
+ } from "../../chunk-SKQ56GUV.js";
7
+ import {
8
+ instrument
9
+ } from "../../chunk-K4IICQ55.js";
8
10
 
9
11
  // renderer/bifrost/onBeforeRenderClient.ts
10
- async function bifrostOnBeforeRenderClient(pageContext) {
12
+ var onBeforeRenderClient_default = instrument("bifrostOnBeforeRenderClient", async function bifrostOnBeforeRenderClient(pageContext) {
11
13
  if (!pageContext.isHydration && !pageContext.errorWhileRendering) {
12
14
  pageContext._shouldEmitBeforeRender = true;
13
15
  await Turbolinks._vikeBeforeRender(pageContext._turbolinksVisit);
@@ -19,8 +21,8 @@ async function bifrostOnBeforeRenderClient(pageContext) {
19
21
  )
20
22
  );
21
23
  }
22
- }
24
+ });
23
25
  export {
24
- bifrostOnBeforeRenderClient as default
26
+ onBeforeRenderClient_default as default
25
27
  };
26
28
  //# sourceMappingURL=onBeforeRenderClient.js.map
@@ -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 && !pageContext.errorWhileRendering) {\n pageContext._shouldEmitBeforeRender = true;\n await Turbolinks._vikeBeforeRender(pageContext._turbolinksVisit);\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,eAAe,CAAC,YAAY,qBAAqB;AAChE,gBAAY,0BAA0B;AACtC,UAAM,WAAW,kBAAkB,YAAY,gBAAgB;AAG/D,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\";\nimport { instrument } from \"../../lib/diagnostic.client\";\n\nexport default instrument(\"bifrostOnBeforeRenderClient\", async function bifrostOnBeforeRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration && !pageContext.errorWhileRendering) {\n pageContext._shouldEmitBeforeRender = true;\n await Turbolinks._vikeBeforeRender(pageContext._turbolinksVisit);\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":";;;;;;;;;;;AAKA,IAAO,+BAAQ,WAAW,+BAA+B,eAAe,4BACtE,aACA;AACA,MAAI,CAAC,YAAY,eAAe,CAAC,YAAY,qBAAqB;AAChE,gBAAY,0BAA0B;AACtC,UAAM,WAAW,kBAAkB,YAAY,gBAAgB;AAG/D,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,CAAC;","names":[]}
@@ -1,4 +1,4 @@
1
- export { W as WrappedServerOnly } from '../type-490a74eb.js';
1
+ export { W as WrappedServerOnly } from '../type-5bab0608.js';
2
2
  import '../controller-962fb27d.js';
3
3
  import 'vike/types';
4
4
 
@@ -40,6 +40,12 @@ declare const _default: {
40
40
  client: true;
41
41
  };
42
42
  };
43
+ onWrappedReactRenderTimeout: {
44
+ env: {
45
+ server: false;
46
+ client: true;
47
+ };
48
+ };
43
49
  proxyMode: {
44
50
  env: {
45
51
  server: true;
@@ -56,6 +62,7 @@ declare const _default: {
56
62
  onRenderHtml?: undefined;
57
63
  onBeforeRenderHtml?: undefined;
58
64
  onBeforeRender?: undefined;
65
+ hooksTimeout?: undefined;
59
66
  meta?: undefined;
60
67
  clientRouting?: undefined;
61
68
  } | {
@@ -65,6 +72,9 @@ declare const _default: {
65
72
  onBeforeRender: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default";
66
73
  onBeforeRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default";
67
74
  onAfterRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default";
75
+ hooksTimeout: {
76
+ onRenderClient: false;
77
+ };
68
78
  meta: {
69
79
  onBeforeRender: {
70
80
  env: {
@@ -82,6 +92,7 @@ declare const _default: {
82
92
  Page?: undefined;
83
93
  onBeforeRenderHtml?: undefined;
84
94
  onBeforeRender?: undefined;
95
+ hooksTimeout?: undefined;
85
96
  meta?: undefined;
86
97
  };
87
98
  };
@@ -100,6 +111,10 @@ declare global {
100
111
  getLayout?: GetLayout;
101
112
  /** Response headers that should be consumed server-side and stripped before sending to the client. */
102
113
  layoutHeaders?: string[];
114
+ /**
115
+ * Fired when react render times out on the client in the wrapped proxy
116
+ */
117
+ onWrappedReactRenderTimeout?: (pageContext: PageContext) => void;
103
118
  }
104
119
  interface PageContext {
105
120
  proxyLayoutInfo?: ProxyLayoutInfo;
@@ -1,5 +1,5 @@
1
1
  import { PageContextServer } from 'vike/types';
2
- import '../type-490a74eb.js';
2
+ import '../type-5bab0608.js';
3
3
  import '../controller-962fb27d.js';
4
4
 
5
5
  declare function headHtmlEnd(pageContext: PageContextServer): string;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Turbolinks
3
- } from "../chunk-IM33TFPL.js";
4
- import "../chunk-NO3JVTT3.js";
3
+ } from "../chunk-SKQ56GUV.js";
4
+ import "../chunk-K4IICQ55.js";
5
5
 
6
6
  // renderer/turbolinksStart.ts
7
7
  Turbolinks.start();
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import '../config.js';
3
- import '../../type-490a74eb.js';
3
+ import '../../type-5bab0608.js';
4
4
  import '../../controller-962fb27d.js';
5
5
  import 'vike/types';
6
6
 
@@ -1,4 +1,4 @@
1
- import "../../chunk-HMWI2UKQ.js";
1
+ import "../../chunk-DI7YJ6WP.js";
2
2
 
3
3
  // renderer/wrapped/Page.tsx
4
4
  import React from "react";
@@ -1,7 +1,7 @@
1
- import '../../type-490a74eb.js';
1
+ import '../../type-5bab0608.js';
2
2
  import { PageContextClient } from 'vike/types';
3
3
  import '../../controller-962fb27d.js';
4
4
 
5
- declare function wrappedOnAfterRenderClient(pageContext: PageContextClient): Promise<void>;
5
+ declare const _default: (pageContext: PageContextClient) => Promise<void>;
6
6
 
7
- export { wrappedOnAfterRenderClient as default };
7
+ export { _default as default };
@@ -1,16 +1,18 @@
1
1
  import {
2
2
  Turbolinks
3
- } from "../../chunk-IM33TFPL.js";
4
- import "../../chunk-NO3JVTT3.js";
3
+ } from "../../chunk-SKQ56GUV.js";
4
+ import {
5
+ instrument
6
+ } from "../../chunk-K4IICQ55.js";
5
7
 
6
8
  // renderer/wrapped/onAfterRenderClient.ts
7
- async function wrappedOnAfterRenderClient(pageContext) {
9
+ var onAfterRenderClient_default = instrument("wrappedOnAfterRenderClient", async function wrappedOnAfterRenderClient(pageContext) {
8
10
  if (!pageContext.isHydration) {
9
11
  await pageContext._waitForHeadScripts?.();
10
12
  Turbolinks._vikeAfterRender(pageContext._turbolinksVisit, true);
11
13
  }
12
- }
14
+ });
13
15
  export {
14
- wrappedOnAfterRenderClient as default
16
+ onAfterRenderClient_default as default
15
17
  };
16
18
  //# sourceMappingURL=onAfterRenderClient.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../renderer/wrapped/onAfterRenderClient.ts"],"sourcesContent":["import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\n\nexport default async function wrappedOnAfterRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration) {\n // On client navigation, tell turbolinks to run scripts and fire events\n await pageContext._waitForHeadScripts?.();\n Turbolinks._vikeAfterRender(pageContext._turbolinksVisit, true);\n }\n}\n"],"mappings":";;;;;;AAIA,eAAO,2BACL,aACA;AACA,MAAI,CAAC,YAAY,aAAa;AAE5B,UAAM,YAAY,sBAAsB;AACxC,eAAW,iBAAiB,YAAY,kBAAkB,IAAI;AAAA,EAChE;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../renderer/wrapped/onAfterRenderClient.ts"],"sourcesContent":["import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport { instrument } from \"../../lib/diagnostic.client\";\n\nexport default instrument(\"wrappedOnAfterRenderClient\", async function wrappedOnAfterRenderClient(\n pageContext: PageContextClient\n) {\n if (!pageContext.isHydration) {\n // On client navigation, tell turbolinks to run scripts and fire events\n await pageContext._waitForHeadScripts?.();\n Turbolinks._vikeAfterRender(pageContext._turbolinksVisit, true);\n }\n});\n"],"mappings":";;;;;;;;AAKA,IAAO,8BAAQ,WAAW,8BAA8B,eAAe,2BACrE,aACA;AACA,MAAI,CAAC,YAAY,aAAa;AAE5B,UAAM,YAAY,sBAAsB;AACxC,eAAW,iBAAiB,YAAY,kBAAkB,IAAI;AAAA,EAChE;AACF,CAAC;","names":[]}
@@ -1,4 +1,4 @@
1
- import '../../type-490a74eb.js';
1
+ import '../../type-5bab0608.js';
2
2
  import { PageContextClient } from 'vike/types';
3
3
  import '../../controller-962fb27d.js';
4
4
 
@@ -1,7 +1,7 @@
1
- import '../../type-490a74eb.js';
1
+ import '../../type-5bab0608.js';
2
2
  import { PageContextClient } from 'vike/types';
3
3
  import '../../controller-962fb27d.js';
4
4
 
5
- declare function wrappedOnBeforeRenderClient(pageContext: PageContextClient): Promise<void>;
5
+ declare const _default: (pageContext: PageContextClient) => Promise<void>;
6
6
 
7
- export { wrappedOnBeforeRenderClient as default };
7
+ export { _default as default };
@@ -5,16 +5,16 @@ import {
5
5
  import {
6
6
  Turbolinks,
7
7
  createScriptElement
8
- } from "../../chunk-IM33TFPL.js";
8
+ } from "../../chunk-SKQ56GUV.js";
9
9
  import {
10
10
  instrument
11
- } from "../../chunk-NO3JVTT3.js";
11
+ } from "../../chunk-K4IICQ55.js";
12
12
 
13
13
  // lib/turbolinks/mergeHead.ts
14
14
  var allHeadScriptsEverRun = {};
15
15
  var firstMerge = true;
16
16
  var lastTrackedScriptSignature;
17
- function recordExistingHeadScripts(categorizedHead) {
17
+ var recordExistingHeadScripts = instrument("recordExistingHeadScripts", function recordExistingHeadScripts2(categorizedHead) {
18
18
  categorizedHead || (categorizedHead = categorizeHead(document.head));
19
19
  for (const element of categorizedHead.scripts) {
20
20
  allHeadScriptsEverRun[element.outerHTML] = {
@@ -23,7 +23,7 @@ function recordExistingHeadScripts(categorizedHead) {
23
23
  }
24
24
  lastTrackedScriptSignature = lastTrackedScriptSignature || trackedElementSignature(categorizedHead);
25
25
  firstMerge = false;
26
- }
26
+ });
27
27
  function mergeHead(head) {
28
28
  const newHead = categorizeHead(head);
29
29
  const oldHead = categorizeHead(document.head);
@@ -149,12 +149,12 @@ function categorizeHead(head) {
149
149
  }
150
150
 
151
151
  // renderer/wrapped/onBeforeRenderClient.ts
152
- async function wrappedOnBeforeRenderClient(pageContext) {
152
+ var onBeforeRenderClient_default = instrument("wrappedOnBeforeRenderClient", async function wrappedOnBeforeRenderClient(pageContext) {
153
153
  if (pageContext.isHydration) {
154
154
  if (document.readyState === "loading") {
155
- await new Promise(
156
- (resolve) => document.addEventListener("DOMContentLoaded", () => resolve(null))
157
- );
155
+ await instrument("_waitForDOMContentLoaded", () => new Promise(
156
+ (resolve) => document.addEventListener("DOMContentLoaded", () => resolve(null), { once: true })
157
+ ))();
158
158
  }
159
159
  const proxiedBody = document.getElementById("proxied-body");
160
160
  if (!proxiedBody) {
@@ -200,8 +200,11 @@ async function wrappedOnBeforeRenderClient(pageContext) {
200
200
  pageContext._waitForHeadScripts = waitForHeadScripts;
201
201
  if (bodyAttrs)
202
202
  setBodyAttributes(bodyAttrs);
203
- }
203
+ pageContext._reactRenderTimeout = setTimeout(() => {
204
+ pageContext.config.onWrappedReactRenderTimeout?.(pageContext);
205
+ }, 3e4);
206
+ });
204
207
  export {
205
- wrappedOnBeforeRenderClient as default
208
+ onBeforeRenderClient_default as default
206
209
  };
207
210
  //# sourceMappingURL=onBeforeRenderClient.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/turbolinks/mergeHead.ts","../../../renderer/wrapped/onBeforeRenderClient.ts"],"sourcesContent":["import { createScriptElement } from \"./util\";\nimport { instrument } from \"../diagnostic.client\";\n\ninterface ElementDetails {\n tracked: boolean;\n}\nconst allHeadScriptsEverRun: { [outerHTML: string]: ElementDetails } = {};\nlet firstMerge = true;\nlet lastTrackedScriptSignature: string;\n\nexport function recordExistingHeadScripts(categorizedHead?: CategorizedHead) {\n categorizedHead ||= categorizeHead(document.head);\n // record all existing head scripts as having been run, because they were run by browser, not mergeHead\n for (const element of categorizedHead.scripts) {\n allHeadScriptsEverRun[element.outerHTML] = {\n tracked: elementIsTracked(element),\n };\n }\n lastTrackedScriptSignature =\n lastTrackedScriptSignature || trackedElementSignature(categorizedHead);\n firstMerge = false;\n}\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: instrument(\"_waitForReload\", () => new Promise<void>(() => {})),\n waitForHeadScripts: instrument(\"_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 if (!firstMerge) {\n // IMPORTANT: we allow first merge to always proceed without reload\n const newTrackedScriptSignature = trackedElementSignature(newHead);\n if (lastTrackedScriptSignature !== newTrackedScriptSignature) {\n return reload();\n }\n }\n firstMerge = false;\n lastTrackedScriptSignature =\n lastTrackedScriptSignature || trackedElementSignature(newHead);\n\n copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);\n removeCurrentHeadProvisionalElements(oldHead.provisional);\n copyNewHeadProvisionalElements(newHead.provisional);\n\n return {\n waitForReload: instrument(\"_waitForReload\", () => Promise.resolve()),\n waitForHeadScripts: instrument(\"_waitForHeadScripts\", copyNewHeadScriptElements(newHead.scripts)),\n };\n}\n\nfunction trackedElementSignature(head: CategorizedHead) {\n return [...head.scripts, ...head.stylesheets]\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}\ntype CategorizedHead = ReturnType<typeof categorizeHead>;\n","import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport {\n mergeHead,\n recordExistingHeadScripts,\n} 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\n const proxiedBody = document.getElementById(\"proxied-body\");\n if (!proxiedBody) {\n throw new Error(\n \"proxied-body not found in DOM after SSR. This likely means the Layout threw during SSR (e.g. accessing `window` or `document`). Fix the SSR error in your Layout component.\"\n );\n }\n pageContext._turbolinksProxy = {\n body: proxiedBody,\n };\n Turbolinks._vpsCachePageContext({\n proxyLayoutInfo: pageContext.proxyLayoutInfo,\n });\n recordExistingHeadScripts();\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(pageContext._turbolinksVisit, {\n proxyLayoutInfo: pageContext.proxyLayoutInfo,\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":[]}
1
+ {"version":3,"sources":["../../../lib/turbolinks/mergeHead.ts","../../../renderer/wrapped/onBeforeRenderClient.ts"],"sourcesContent":["import { createScriptElement } from \"./util\";\nimport { instrument } from \"../diagnostic.client\";\n\ninterface ElementDetails {\n tracked: boolean;\n}\nconst allHeadScriptsEverRun: { [outerHTML: string]: ElementDetails } = {};\nlet firstMerge = true;\nlet lastTrackedScriptSignature: string;\n\nexport const recordExistingHeadScripts = instrument(\"recordExistingHeadScripts\", function recordExistingHeadScripts(categorizedHead?: CategorizedHead) {\n categorizedHead ||= categorizeHead(document.head);\n // record all existing head scripts as having been run, because they were run by browser, not mergeHead\n for (const element of categorizedHead.scripts) {\n allHeadScriptsEverRun[element.outerHTML] = {\n tracked: elementIsTracked(element),\n };\n }\n lastTrackedScriptSignature =\n lastTrackedScriptSignature || trackedElementSignature(categorizedHead);\n firstMerge = false;\n});\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: instrument(\"_waitForReload\", () => new Promise<void>(() => {})),\n waitForHeadScripts: instrument(\"_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 if (!firstMerge) {\n // IMPORTANT: we allow first merge to always proceed without reload\n const newTrackedScriptSignature = trackedElementSignature(newHead);\n if (lastTrackedScriptSignature !== newTrackedScriptSignature) {\n return reload();\n }\n }\n firstMerge = false;\n lastTrackedScriptSignature =\n lastTrackedScriptSignature || trackedElementSignature(newHead);\n\n copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);\n removeCurrentHeadProvisionalElements(oldHead.provisional);\n copyNewHeadProvisionalElements(newHead.provisional);\n\n return {\n waitForReload: instrument(\"_waitForReload\", () => Promise.resolve()),\n waitForHeadScripts: instrument(\"_waitForHeadScripts\", copyNewHeadScriptElements(newHead.scripts)),\n };\n}\n\nfunction trackedElementSignature(head: CategorizedHead) {\n return [...head.scripts, ...head.stylesheets]\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}\ntype CategorizedHead = ReturnType<typeof categorizeHead>;\n","import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\nimport {\n mergeHead,\n recordExistingHeadScripts,\n} from \"../../lib/turbolinks/mergeHead\";\nimport {\n setBodyAttributes,\n getElementAttributes,\n} from \"../../lib/elementUtils\";\nimport { instrument } from \"../../lib/diagnostic.client\";\n\nexport default instrument(\"wrappedOnBeforeRenderClient\", 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 instrument(\"_waitForDOMContentLoaded\", () => new Promise((resolve) =>\n document.addEventListener(\"DOMContentLoaded\", () => resolve(null), { once: true})\n ))();\n }\n\n const proxiedBody = document.getElementById(\"proxied-body\");\n if (!proxiedBody) {\n throw new Error(\n \"proxied-body not found in DOM after SSR. This likely means the Layout threw during SSR (e.g. accessing `window` or `document`). Fix the SSR error in your Layout component.\"\n );\n }\n pageContext._turbolinksProxy = {\n body: proxiedBody,\n };\n Turbolinks._vpsCachePageContext({\n proxyLayoutInfo: pageContext.proxyLayoutInfo,\n });\n recordExistingHeadScripts();\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(pageContext._turbolinksVisit, {\n proxyLayoutInfo: pageContext.proxyLayoutInfo,\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 pageContext._reactRenderTimeout = setTimeout(() => {\n pageContext.config.onWrappedReactRenderTimeout?.(pageContext);\n }, 30000);\n});\n"],"mappings":";;;;;;;;;;;;;AAMA,IAAM,wBAAiE,CAAC;AACxE,IAAI,aAAa;AACjB,IAAI;AAEG,IAAM,4BAA4B,WAAW,6BAA6B,SAASA,2BAA0B,iBAAmC;AACrJ,wCAAoB,eAAe,SAAS,IAAI;AAEhD,aAAW,WAAW,gBAAgB,SAAS;AAC7C,0BAAsB,QAAQ,SAAS,IAAI;AAAA,MACzC,SAAS,iBAAiB,OAAO;AAAA,IACnC;AAAA,EACF;AACA,+BACE,8BAA8B,wBAAwB,eAAe;AACvE,eAAa;AACf,CAAC;AAGM,SAAS,UAAU,MAAuB;AAC/C,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,UAAU,eAAe,SAAS,IAAI;AAC5C,QAAM,SAAS,MAAM;AACnB,WAAO,WAAW,WAAW,gBAAgB;AAC7C,WAAO;AAAA,MACL,eAAe,WAAW,kBAAkB,MAAM,IAAI,QAAc,MAAM;AAAA,MAAC,CAAC,CAAC;AAAA,MAC7E,oBAAoB,WAAW,uBAAuB,MAAM,IAAI,QAAc,MAAM;AAAA,MAAC,CAAC,CAAC;AAAA,IACzF;AAAA,EACF;AAEA,MACE,KACG,cAAc,uCAAuC,GACpD,aAAa,SAAS,MAAM,UAChC;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,CAAC,YAAY;AAEf,UAAM,4BAA4B,wBAAwB,OAAO;AACjE,QAAI,+BAA+B,2BAA2B;AAC5D,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACA,eAAa;AACb,+BACE,8BAA8B,wBAAwB,OAAO;AAE/D,gCAA8B,QAAQ,aAAa,QAAQ,WAAW;AACtE,uCAAqC,QAAQ,WAAW;AACxD,iCAA+B,QAAQ,WAAW;AAElD,SAAO;AAAA,IACL,eAAe,WAAW,kBAAkB,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACnE,oBAAoB,WAAW,uBAAuB,0BAA0B,QAAQ,OAAO,CAAC;AAAA,EAClG;AACF;AAEA,SAAS,wBAAwB,MAAuB;AACtD,SAAO,CAAC,GAAG,KAAK,SAAS,GAAG,KAAK,WAAW,EACzC,OAAO,gBAAgB,EACvB,IAAI,CAAC,MAAM,EAAE,SAAS,EACtB,KAAK;AACV;AAEA,SAAS,8BAA8B,MAAiB,MAAiB;AACvE,QAAM,WAAW,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS;AAC5C,aAAW,WAAW,MAAM;AAC1B,QAAI,CAAC,SAAS,SAAS,QAAQ,SAAS,GAAG;AACzC,eAAS,KAAK,YAAY,OAAO;AAAA,IACnC;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,MAAsC;AACvE,QAAM,kBAA6B,CAAC;AACpC,MAAI,iBAA4B,CAAC;AACjC,QAAM,uBAAuB,IAAI,QAAc,CAAC,oBAAoB;AAClE,eAAW,WAAW,MAA6B;AACjD,YAAM,YAAY,QAAQ,aAAa;AACvC,UAAI,CAAC,WAAW;AACd,YAAI;AACJ,YAAI,CAAC,QAAQ,SAAS,QAAQ,KAAK;AACjC,gBAAM,MAAM,eAAe;AAC3B,eAAK,MAAM;AACT,2BAAe,GAAG,IAAI;AACtB,gBAAI,eAAe,MAAM,CAAC,MAAM,CAAC,GAAG;AAClC,8BAAgB;AAAA,YAClB;AAAA,UACF;AACA,yBAAe,KAAK,KAAK;AAAA,QAC3B;AACA,cAAM,aAAa,oBAAoB,SAAS,EAAE;AAClD,YAAI,QAAQ,OAAO;AACjB,0BAAgB,KAAK,UAAU;AAAA,QACjC,OAAO;AACL,mBAAS,KAAK,YAAY,UAAU;AAAA,QACtC;AACA,8BAAsB,QAAQ,SAAS,IAAI;AAAA,UACzC,SAAS,iBAAiB,OAAO;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AACA,QAAI,eAAe,WAAW,GAAG;AAE/B,sBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AACD,SAAO,MAAM;AACX,oBAAgB,QAAQ,CAAC,MAAM,SAAS,KAAK,YAAY,CAAC,CAAC;AAC3D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qCAAqC,MAAiB;AAC7D,aAAW,WAAW,MAAM;AAC1B,aAAS,KAAK,YAAY,OAAO;AAAA,EACnC;AACF;AAEA,SAAS,+BAA+B,MAAiB;AACvD,aAAW,WAAW,MAAM;AAC1B,aAAS,KAAK,YAAY,OAAO;AAAA,EACnC;AACF;AAEA,SAAS,iBAAiB,SAAkB;AAC1C,SAAO,QAAQ,aAAa,uBAAuB,KAAK;AAC1D;AAEA,SAAS,gBAAgB,SAAkB;AACzC,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,SAAO,WAAW;AACpB;AAEA,SAAS,oBAAoB,SAAkB;AAC7C,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,SACE,WAAW,WACV,WAAW,UAAU,QAAQ,aAAa,KAAK,KAAK;AAEzD;AAEA,SAAS,iBAAiB,SAAkB;AAC1C,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAE5C,SAAO,WAAW,UAAU,QAAQ,aAAa,KAAK,KAAK;AAC7D;AAEA,SAAS,eAAe,MAAkB;AACxC,QAAM,UAAU,CAAC;AACjB,QAAM,cAAc,CAAC;AACrB,QAAM,cAAc,CAAC;AACrB,aAAW,WAAW,KAAK,UAAU;AAEnC,QAAI,iBAAiB,OAAO,GAAG;AAC7B;AAAA,IACF;AAEA,QAAI,gBAAgB,OAAO,GAAG;AAC5B,cAAQ,KAAK,OAAO;AAAA,IACtB,WAAW,oBAAoB,OAAO,GAAG;AACvC,kBAAY,KAAK,OAAO;AAAA,IAC1B,OAAO;AACL,kBAAY,KAAK,OAAO;AAAA,IAC1B;AAAA,EACF;AACA,SAAO,EAAE,SAAS,aAAa,YAAY;AAC7C;;;ACjKA,IAAO,+BAAQ,WAAW,+BAA+B,eAAe,4BACtE,aACA;AACA,MAAI,YAAY,aAAa;AAG3B,QAAI,SAAS,eAAe,WAAW;AACrC,YAAM,WAAW,4BAA4B,MAAM,IAAI;AAAA,QAAQ,CAAC,YAC9D,SAAS,iBAAiB,oBAAoB,MAAM,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAI,CAAC;AAAA,MAClF,CAAC,EAAE;AAAA,IACL;AAEA,UAAM,cAAc,SAAS,eAAe,cAAc;AAC1D,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,gBAAY,mBAAmB;AAAA,MAC7B,MAAM;AAAA,IACR;AACA,eAAW,qBAAqB;AAAA,MAC9B,iBAAiB,YAAY;AAAA,IAC/B,CAAC;AACD,8BAA0B;AAC1B;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,QAAI,YAAY,aAAa;AAC3B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,gBAAgB,IAAI,YAAY,UAAU;AAClD,UAAM,EAAE,QAAQ,OAAO,IAAI,YAAY;AACvC,UAAM,cAAc,OAAO,cAAc,eAAe;AACxD,QAAI,CAAC,eAAe,EAAE,uBAAuB,cAAc;AACzD,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,gBAAY,kBAAkB;AAC9B,gBAAY,mBAAmB;AAAA,MAC7B,WAAW,qBAAqB,MAAM;AAAA,MACtC,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,EAAE,MAAM,UAAU,IAAI,YAAY;AACxC,cAAY,0BAA0B;AAEtC,QAAM,WAAW,kBAAkB,YAAY,kBAAkB;AAAA,IAC/D,iBAAiB,YAAY;AAAA,EAC/B,CAAC;AACD,QAAM,EAAE,eAAe,mBAAmB,IAAI,UAAU,IAAK;AAG7D,QAAM,cAAc;AACpB,cAAY,sBAAsB;AAElC,MAAI;AAAW,sBAAkB,SAAS;AAE1C,cAAY,sBAAsB,WAAW,MAAM;AACjD,gBAAY,OAAO,8BAA8B,WAAW;AAAA,EAC9D,GAAG,GAAK;AACV,CAAC;","names":["recordExistingHeadScripts"]}
@@ -23,6 +23,7 @@ declare global {
23
23
  _waitForHeadScripts?: () => Promise<void>;
24
24
  _turbolinksVisit?: Visit;
25
25
  _shouldEmitBeforeRender?: boolean;
26
+ _reactRenderTimeout?: NodeJS.Timeout;
26
27
  }
27
28
  }
28
29
  }
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.29",
4
+ "version": "1.0.31",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../renderer/config.ts"],"sourcesContent":["import { type Config } from \"vike/types\";\n\nexport default {\n name: \"@alignable/bifrost\",\n require: {\n vike: \">=0.4.244\",\n \"vike-react\": \">=0.6.11\",\n },\n\n headHtmlBegin:\n \"import:@alignable/bifrost/__internal/renderer/headHtmlBegin:default\",\n headHtmlEnd:\n \"import:@alignable/bifrost/__internal/renderer/headHtmlEnd:default\",\n onBeforeRoute:\n \"import:@alignable/bifrost/__internal/renderer/onBeforeRoute:default\",\n Wrapper: \"import:@alignable/bifrost/__internal/renderer/Wrapper:default\",\n\n passToClient: [\"proxyLayoutInfo\"],\n\n meta: {\n bodyAttributes: {\n // vike-react bodyAttributes are server-only, but legacy backend may change bodyAttributes and we need to reset on return to bifrost pages\n env: { server: true, client: true },\n global: true,\n cumulative: true,\n },\n getLayout: { env: { server: true, client: true } },\n layoutHeaders: { env: { server: true, client: false } },\n proxyHeaders: { env: { server: true, client: true } },\n proxyMode: {\n env: { server: true, client: true, config: true },\n effect({ configDefinedAt, configValue }) {\n switch (configValue) {\n case false:\n return {\n onBeforeRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/bifrost/onBeforeRenderClient:default\",\n onAfterRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/bifrost/onAfterRenderClient:default\",\n };\n case \"wrapped\":\n return {\n Page: \"import:@alignable/bifrost/__internal/renderer/wrapped/Page:default\" as any,\n onRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onRenderHtml:default\",\n onBeforeRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderHtml:default\",\n onBeforeRender:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default\",\n onBeforeRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default\",\n onAfterRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default\",\n meta: {\n onBeforeRender: { env: { client: true, server: false } },\n },\n };\n case \"passthru\":\n // tell Vike to hit the server for all passthru pages (which will get load balanced to legacy backend)\n return {\n onRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/passthru/onRenderHtml:default\",\n clientRouting: false,\n };\n default:\n throw new Error(\n `${configDefinedAt} should be one of: false, \"wrapped\", \"passthru\"`\n );\n }\n },\n },\n },\n} satisfies Config;\n\n/**\n * Returning null tells Bifrost to run passthru proxy\n */\nexport type GetLayout = (\n headers: Record<string, number | string | string[] | undefined>\n) => Vike.ProxyLayoutInfo | null;\n\ndeclare global {\n namespace Vike {\n interface Config {\n proxyMode?: false | \"wrapped\" | \"passthru\";\n proxyHeaders?: Record<string, string>;\n getLayout?: GetLayout;\n /** Response headers that should be consumed server-side and stripped before sending to the client. */\n layoutHeaders?: string[];\n }\n interface PageContext {\n proxyLayoutInfo?: ProxyLayoutInfo;\n }\n interface ProxyLayoutInfo {}\n }\n}\n\n// This is only used for fastify integration\nexport { type WrappedServerOnly } from \"../lib/type\";\n"],"mappings":";AAEA,IAAO,iBAAQ;AAAA,EACb,MAAM;AAAA,EACN,SAAS;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EAEA,eACE;AAAA,EACF,aACE;AAAA,EACF,eACE;AAAA,EACF,SAAS;AAAA,EAET,cAAc,CAAC,iBAAiB;AAAA,EAEhC,MAAM;AAAA,IACJ,gBAAgB;AAAA;AAAA,MAEd,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK;AAAA,MAClC,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,IACA,WAAW,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACjD,eAAe,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,IACtD,cAAc,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACpD,WAAW;AAAA,MACT,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,MAChD,OAAO,EAAE,iBAAiB,YAAY,GAAG;AACvC,gBAAQ,aAAa;AAAA,UACnB,KAAK;AACH,mBAAO;AAAA,cACL,sBACE;AAAA,cACF,qBACE;AAAA,YACJ;AAAA,UACF,KAAK;AACH,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,cACE;AAAA,cACF,oBACE;AAAA,cACF,gBACE;AAAA,cACF,sBACE;AAAA,cACF,qBACE;AAAA,cACF,MAAM;AAAA,gBACJ,gBAAgB,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF,KAAK;AAEH,mBAAO;AAAA,cACL,cACE;AAAA,cACF,eAAe;AAAA,YACjB;AAAA,UACF;AACE,kBAAM,IAAI;AAAA,cACR,GAAG,eAAe;AAAA,YACpB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../lib/diagnostic.client.ts"],"sourcesContent":["type InstrumentedFunctions = \"_vikeAfterRender\" | \"_vikeBeforeRender\" | \"_waitForHeadScripts\" | \"_waitForReload\";\n\ninterface DiagnosticEventDetail {\n /** Whether the instrumented function is starting or has finished. */\n type: \"start\" | \"end\";\n /** Which instrumented function fired the event. */\n fnName: InstrumentedFunctions;\n}\n\ntype DiagnosticEventName = `bifrost:diagnostic:${InstrumentedFunctions | \"*\"}`;\n\ndeclare global {\n type CustomEventMap = {\n [K in DiagnosticEventName]: CustomEvent<DiagnosticEventDetail>;\n };\n\n interface WindowEventMap extends CustomEventMap {}\n}\n\nfunction dispatchDiagnosticEvent(detail: DiagnosticEventDetail): void {\n const wildCardEvent : DiagnosticEventName = \"bifrost:diagnostic:*\"\n const specificEvent : DiagnosticEventName = `bifrost:diagnostic:${detail.fnName}`;\n window.dispatchEvent(new CustomEvent(specificEvent, { detail }));\n window.dispatchEvent(new CustomEvent(wildCardEvent, { detail }));\n}\n\n/**\n * Wraps `fn` so that it dispatches typed `CustomEvent`s on `window`\n * around each invocation. Works with both sync and async functions —\n * for promises, \"end\" fires in `.finally()`.\n *\n * Each call dispatches two events:\n * - `bifrost:diagnostic:<fnName>` — scoped to the function\n * - `bifrost:diagnostic:*` — wildcard, fires for all instrumented functions\n *\n * @example\n * // Listen for a specific function\n * window.addEventListener(\"bifrost:diagnostic:_vikeBeforeRender\", (e) => {\n * console.log(e.detail.type, e.detail.fnName);\n * });\n *\n * // Listen for all instrumented functions\n * window.addEventListener(\"bifrost:diagnostic:*\", (e) => {\n * console.log(e.detail.type, e.detail.fnName);\n * });\n */\nexport function instrument<N extends InstrumentedFunctions, T extends (...args: any[]) => any>(\n fnName: N,\n fn: T\n): T {\n return function (this: unknown, ...args: Parameters<T>): ReturnType<T> {\n dispatchDiagnosticEvent({ type: \"start\", fnName });\n try {\n const result = fn.apply(this, args);\n if (result instanceof Promise) {\n return result.finally(() => {\n dispatchDiagnosticEvent({ type: \"end\", fnName });\n }) as ReturnType<T>;\n }\n dispatchDiagnosticEvent({ type: \"end\", fnName });\n return result as ReturnType<T>;\n } catch (err) {\n dispatchDiagnosticEvent({ type: \"end\", fnName });\n throw err;\n }\n } as T;\n}\n"],"mappings":";AAmBA,SAAS,wBAAwB,QAAqC;AACpE,QAAM,gBAAsC;AAC5C,QAAM,gBAAsC,sBAAsB,OAAO,MAAM;AAC/E,SAAO,cAAc,IAAI,YAAY,eAAe,EAAE,OAAO,CAAC,CAAC;AAC/D,SAAO,cAAc,IAAI,YAAY,eAAe,EAAE,OAAO,CAAC,CAAC;AACjE;AAsBO,SAAS,WACd,QACA,IACG;AACH,SAAO,YAA4B,MAAoC;AACrE,4BAAwB,EAAE,MAAM,SAAS,OAAO,CAAC;AACjD,QAAI;AACF,YAAM,SAAS,GAAG,MAAM,MAAM,IAAI;AAClC,UAAI,kBAAkB,SAAS;AAC7B,eAAO,OAAO,QAAQ,MAAM;AAC1B,kCAAwB,EAAE,MAAM,OAAO,OAAO,CAAC;AAAA,QACjD,CAAC;AAAA,MACH;AACA,8BAAwB,EAAE,MAAM,OAAO,OAAO,CAAC;AAC/C,aAAO;AAAA,IACT,SAAS,KAAP;AACA,8BAAwB,EAAE,MAAM,OAAO,OAAO,CAAC;AAC/C,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}