@alignable/bifrost 1.0.9 → 1.0.11
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.
- package/dist/{chunk-T3SUUF4M.js → chunk-7NFPFMDU.js} +26 -27
- package/dist/{chunk-T3SUUF4M.js.map → chunk-7NFPFMDU.js.map} +1 -1
- package/dist/chunk-7Y5VBDG6.js +22 -0
- package/dist/chunk-7Y5VBDG6.js.map +1 -0
- package/dist/{chunk-VDSLA7HV.js → chunk-C4LFRUST.js} +7 -1
- package/dist/chunk-C4LFRUST.js.map +1 -0
- package/dist/renderer/+config.js +1 -1
- package/dist/renderer/bifrost/onAfterRenderClient.d.ts +1 -1
- package/dist/renderer/bifrost/onAfterRenderClient.js +1 -1
- package/dist/renderer/bifrost/onBeforeRenderClient.js +11 -1
- package/dist/renderer/bifrost/onBeforeRenderClient.js.map +1 -1
- package/dist/renderer/config.d.ts +9 -1
- package/dist/renderer/headHtmlEnd.d.ts +1 -1
- package/dist/renderer/turbolinksStart.js +1 -1
- package/dist/renderer/wrapped/Page.d.ts +1 -1
- package/dist/renderer/wrapped/Page.js +1 -1
- package/dist/renderer/wrapped/onAfterRenderClient.d.ts +1 -1
- package/dist/renderer/wrapped/onAfterRenderClient.js +2 -13
- package/dist/renderer/wrapped/onAfterRenderClient.js.map +1 -1
- package/dist/renderer/wrapped/onBeforeRender.client.d.ts +1 -1
- package/dist/renderer/wrapped/onBeforeRender.client.js +6 -1
- package/dist/renderer/wrapped/onBeforeRender.client.js.map +1 -1
- package/dist/renderer/wrapped/onBeforeRenderClient.d.ts +1 -1
- package/dist/renderer/wrapped/onBeforeRenderClient.js +24 -27
- package/dist/renderer/wrapped/onBeforeRenderClient.js.map +1 -1
- package/dist/{type-08c122b9.d.ts → type-813ffb18.d.ts} +1 -0
- package/package.json +1 -1
- package/dist/chunk-VDSLA7HV.js.map +0 -1
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
// lib/turbolinks/lruCache.ts
|
|
2
|
+
var LruCache = class {
|
|
3
|
+
constructor(maxEntries) {
|
|
4
|
+
this.values = /* @__PURE__ */ new Map();
|
|
5
|
+
this.maxEntries = maxEntries;
|
|
6
|
+
}
|
|
7
|
+
get(key) {
|
|
8
|
+
const hasKey = this.values.has(key);
|
|
9
|
+
let entry;
|
|
10
|
+
if (hasKey) {
|
|
11
|
+
entry = this.values.get(key);
|
|
12
|
+
this.values.delete(key);
|
|
13
|
+
this.values.set(key, entry);
|
|
14
|
+
}
|
|
15
|
+
return entry;
|
|
16
|
+
}
|
|
17
|
+
put(key, value) {
|
|
18
|
+
if (this.values.size >= this.maxEntries) {
|
|
19
|
+
const keyToDelete = this.values.keys().next().value;
|
|
20
|
+
this.values.delete(keyToDelete);
|
|
21
|
+
}
|
|
22
|
+
this.values.set(key, value);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
1
26
|
// lib/turbolinks/util.ts
|
|
2
27
|
function array(values) {
|
|
3
28
|
return Array.prototype.slice.call(values);
|
|
@@ -110,31 +135,6 @@ function focusFirstAutofocusableElement() {
|
|
|
110
135
|
}
|
|
111
136
|
}
|
|
112
137
|
|
|
113
|
-
// lib/turbolinks/lruCache.ts
|
|
114
|
-
var LruCache = class {
|
|
115
|
-
constructor(maxEntries) {
|
|
116
|
-
this.values = /* @__PURE__ */ new Map();
|
|
117
|
-
this.maxEntries = maxEntries;
|
|
118
|
-
}
|
|
119
|
-
get(key) {
|
|
120
|
-
const hasKey = this.values.has(key);
|
|
121
|
-
let entry;
|
|
122
|
-
if (hasKey) {
|
|
123
|
-
entry = this.values.get(key);
|
|
124
|
-
this.values.delete(key);
|
|
125
|
-
this.values.set(key, entry);
|
|
126
|
-
}
|
|
127
|
-
return entry;
|
|
128
|
-
}
|
|
129
|
-
put(key, value) {
|
|
130
|
-
if (this.values.size >= this.maxEntries) {
|
|
131
|
-
const keyToDelete = this.values.keys().next().value;
|
|
132
|
-
this.values.delete(keyToDelete);
|
|
133
|
-
}
|
|
134
|
-
this.values.set(key, value);
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
|
|
138
138
|
// lib/turbolinks/progress_bar.ts
|
|
139
139
|
var _ProgressBar = class _ProgressBar {
|
|
140
140
|
constructor() {
|
|
@@ -820,7 +820,6 @@ var Turbolinks = {
|
|
|
820
820
|
|
|
821
821
|
export {
|
|
822
822
|
createScriptElement,
|
|
823
|
-
copyElementAttributes,
|
|
824
823
|
Turbolinks
|
|
825
824
|
};
|
|
826
|
-
//# sourceMappingURL=chunk-
|
|
825
|
+
//# sourceMappingURL=chunk-7NFPFMDU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/turbolinks/util.ts","../lib/turbolinks/lruCache.ts","../lib/turbolinks/progress_bar.ts","../lib/turbolinks/browser_adapter.ts","../lib/turbolinks/location.ts","../lib/turbolinks/types.ts","../lib/turbolinks/visit.ts","../lib/turbolinks/controller.ts","../lib/turbolinks/index.ts"],"sourcesContent":["export function array<T>(values: ArrayLike<T>): T[] {\n return Array.prototype.slice.call(values);\n}\n\nexport const closest = (() => {\n const html = document.documentElement;\n\n type MatchesSelector = (this: Element, selector: string) => boolean;\n const match: MatchesSelector =\n html.matches ||\n (html as any).webkitMatchesSelector ||\n (html as any).msMatchesSelector ||\n (html as any).mozMatchesSelector;\n\n type Closest = (this: Element, selector: string) => Element | null;\n const closest: Closest =\n html.closest ||\n function (selector: string) {\n let element: Element | null = this;\n while (element) {\n if (match.call(element, selector)) {\n return element;\n } else {\n element = element.parentElement;\n }\n }\n };\n\n return function (element: Element, selector: string) {\n return closest.call(element, selector);\n };\n})();\n\nexport function defer(callback: () => any) {\n setTimeout(callback, 1);\n}\n\nexport type DispatchOptions = {\n target: EventTarget;\n cancelable: boolean;\n data: any;\n};\n\nexport function dispatch(\n eventName: string,\n { target, cancelable, data }: Partial<DispatchOptions> = {}\n) {\n const event = document.createEvent(\"Events\") as Event & { data: any };\n event.initEvent(eventName, true, cancelable == true);\n event.data = data || {};\n\n // Fix setting `defaultPrevented` when `preventDefault()` is called\n // http://stackoverflow.com/questions/23349191/event-preventdefault-is-not-working-in-ie-11-for-custom-events\n if (event.cancelable && !preventDefaultSupported) {\n const { preventDefault } = event;\n event.preventDefault = function () {\n if (!this.defaultPrevented) {\n Object.defineProperty(this, \"defaultPrevented\", { get: () => true });\n }\n preventDefault.call(this);\n };\n }\n\n (target || document).dispatchEvent(event);\n return event;\n}\n\nconst preventDefaultSupported = (() => {\n const event = document.createEvent(\"Events\");\n event.initEvent(\"test\", true, true);\n event.preventDefault();\n return event.defaultPrevented;\n})();\n\nexport function unindent(\n strings: TemplateStringsArray,\n ...values: any[]\n): string {\n const lines = trimLeft(interpolate(strings, values)).split(\"\\n\");\n const match = lines[0].match(/^\\s+/);\n const indent = match ? match[0].length : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\n\nfunction trimLeft(string: string) {\n return string.replace(/^\\n/, \"\");\n}\n\nfunction interpolate(strings: TemplateStringsArray, values: any[]) {\n return strings.reduce((result, string, i) => {\n const value = values[i] == undefined ? \"\" : values[i];\n return result + string + value;\n }, \"\");\n}\n\nexport function uuid() {\n return Array.apply(null, { length: 36 } as any)\n .map((_, i) => {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n return \"-\";\n } else if (i == 14) {\n return \"4\";\n } else if (i == 19) {\n return (Math.floor(Math.random() * 4) + 8).toString(16);\n } else {\n return Math.floor(Math.random() * 15).toString(16);\n }\n })\n .join(\"\");\n}\n\nexport function createScriptElement(element: Element, cb?: () => void) {\n if (element.getAttribute(\"data-turbolinks-eval\") == \"false\") {\n return element;\n } else {\n const createdScriptElement = document.createElement(\"script\");\n createdScriptElement.textContent = element.textContent;\n // async false makes scripts run in-order. it wont block js execution (thankfully)\n // https://github.com/turbolinks/turbolinks/issues/282#issuecomment-355731712\n createdScriptElement.async = false;\n copyElementAttributes(createdScriptElement, element);\n if (cb) {\n createdScriptElement.addEventListener(\"load\", cb);\n }\n return createdScriptElement;\n }\n}\n\nexport function copyElementAttributes(\n destinationElement: Element,\n sourceElement: Element\n) {\n for (const { name, value } of array(sourceElement.attributes)) {\n destinationElement.setAttribute(name, value);\n }\n}\n\nfunction replaceElementWithElement(fromElement: Element, toElement: Element) {\n const parentElement = fromElement.parentElement;\n if (parentElement) {\n return parentElement.replaceChild(toElement, fromElement);\n }\n}\nexport function activateNewBodyScriptElements(\n newScriptElements: HTMLScriptElement[]\n) {\n for (const inertScriptElement of newScriptElements) {\n const activatedScriptElement = createScriptElement(inertScriptElement);\n replaceElementWithElement(inertScriptElement, activatedScriptElement);\n }\n}\n\nexport function focusFirstAutofocusableElement() {\n const element = document.body.querySelector(\"[autofocus]\");\n if (element && \"focus\" in element && typeof element.focus === \"function\") {\n element.focus();\n }\n}\n","export class LruCache<T> {\n private values: Map<string, T> = new Map<string, T>();\n private maxEntries;\n\n constructor(maxEntries: number) {\n this.maxEntries = maxEntries;\n }\n\n public get(key: string): T | undefined {\n const hasKey = this.values.has(key);\n let entry: T | undefined;\n if (hasKey) {\n // peek the entry, re-insert for LRU strategy\n entry = this.values.get(key)!;\n this.values.delete(key);\n this.values.set(key, entry);\n }\n\n return entry;\n }\n\n public put(key: string, value: T) {\n if (this.values.size >= this.maxEntries) {\n // least-recently used cache eviction strategy\n const keyToDelete = this.values.keys().next().value;\n\n this.values.delete(keyToDelete);\n }\n\n this.values.set(key, value);\n }\n}\n","import { unindent } from \"./util\";\n\nexport class ProgressBar {\n static animationDuration = 300; /*ms*/\n\n static get defaultCSS() {\n return unindent`\n .turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition:\n width ${ProgressBar.animationDuration}ms ease-out,\n opacity ${ProgressBar.animationDuration / 2}ms ${\n ProgressBar.animationDuration / 2\n }ms ease-in;\n transform: translate3d(0, 0, 0);\n }\n `;\n }\n\n readonly stylesheetElement = this.createStylesheetElement();\n readonly progressElement = this.createProgressElement();\n\n hiding = false;\n trickleInterval?: number;\n value = 0;\n visible = false;\n\n show() {\n if (!this.visible) {\n this.visible = true;\n this.installStylesheetElement();\n this.installProgressElement();\n this.startTrickling();\n }\n }\n\n hide() {\n if (this.visible && !this.hiding) {\n this.hiding = true;\n this.fadeProgressElement(() => {\n this.uninstallProgressElement();\n this.stopTrickling();\n this.visible = false;\n this.hiding = false;\n });\n }\n }\n\n setValue(value: number) {\n this.value = value;\n this.refresh();\n }\n\n // Private\n\n installStylesheetElement() {\n document.head.insertBefore(\n this.stylesheetElement,\n document.head.firstChild\n );\n }\n\n installProgressElement() {\n this.progressElement.style.width = \"0\";\n this.progressElement.style.opacity = \"1\";\n document.documentElement.insertBefore(this.progressElement, document.body);\n this.refresh();\n }\n\n fadeProgressElement(callback: () => void) {\n this.progressElement.style.opacity = \"0\";\n setTimeout(callback, ProgressBar.animationDuration * 1.5);\n }\n\n uninstallProgressElement() {\n if (this.progressElement.parentNode) {\n document.documentElement.removeChild(this.progressElement);\n }\n }\n\n startTrickling() {\n if (!this.trickleInterval) {\n this.trickleInterval = window.setInterval(\n this.trickle,\n ProgressBar.animationDuration\n );\n }\n }\n\n stopTrickling() {\n window.clearInterval(this.trickleInterval);\n delete this.trickleInterval;\n }\n\n trickle = () => {\n this.setValue(this.value + Math.random() / 100);\n };\n\n refresh() {\n requestAnimationFrame(() => {\n this.progressElement.style.width = `${10 + this.value * 90}%`;\n });\n }\n\n createStylesheetElement() {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n element.textContent = ProgressBar.defaultCSS;\n return element;\n }\n\n createProgressElement() {\n const element = document.createElement(\"div\");\n element.className = \"turbolinks-progress-bar\";\n return element;\n }\n}\n","import { Adapter } from \"./adapter\";\nimport { Controller } from \"./controller\";\nimport { Locatable } from \"./location\";\nimport { ProgressBar } from \"./progress_bar\";\nimport { Action } from \"./types\";\nimport { Visit } from \"./visit\";\n\nexport class BrowserAdapter implements Adapter {\n readonly controller: Controller;\n readonly progressBar = new ProgressBar();\n\n progressBarTimeout?: number;\n\n constructor(controller: Controller) {\n this.controller = controller;\n }\n\n visitProposedToLocationWithAction(location: Locatable, action: Action) {\n this.controller.startVisitToLocationWithAction(location, action);\n }\n\n visitStarted(visit: Visit) {\n visit.issueRequest();\n visit.changeHistory();\n visit.loadCachedSnapshot();\n }\n\n visitRequestStarted(visit: Visit) {\n this.progressBar.setValue(0);\n if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n this.showProgressBarAfterDelay();\n } else {\n this.showProgressBar();\n }\n }\n\n visitRequestProgressed(visit: Visit) {\n this.progressBar.setValue(visit.progress);\n }\n\n visitRequestCompleted(visit: Visit) {\n visit.loadResponse();\n }\n\n visitRequestFailedWithStatusCode(visit: Visit, statusCode: number) {\n switch (statusCode) {\n // TODO\n // case SystemStatusCode.networkFailure:\n // case SystemStatusCode.timeoutFailure:\n // case SystemStatusCode.contentTypeMismatch:\n // return this.reload()\n default:\n return visit.loadResponse();\n }\n }\n\n visitRequestFinished(visit: Visit) {\n this.hideProgressBar();\n }\n\n visitCompleted(visit: Visit) {\n visit.onCompleted();\n }\n\n pageInvalidated() {\n this.reload();\n }\n\n visitFailed(visit: Visit) {}\n\n visitRendered(visit: Visit) {}\n\n // Private\n\n showProgressBarAfterDelay() {\n this.progressBarTimeout = window.setTimeout(\n this.showProgressBar,\n this.controller.progressBarDelay\n );\n }\n\n showProgressBar = () => {\n this.progressBar.show();\n };\n\n hideProgressBar() {\n this.progressBar.hide();\n if (this.progressBarTimeout != null) {\n window.clearTimeout(this.progressBarTimeout);\n delete this.progressBarTimeout;\n }\n }\n\n reload() {\n window.location.reload();\n }\n}\n","export type Locatable = Location | string;\n\nexport class Location {\n static get currentLocation() {\n return this.wrap(window.location.toString());\n }\n\n static wrap(locatable: Locatable): Location;\n static wrap(locatable?: Locatable | null): Location | undefined;\n static wrap(locatable: Locatable) {\n if (typeof locatable == \"string\") {\n return new this(locatable);\n } else if (locatable != null) {\n return locatable;\n }\n }\n\n readonly absoluteURL: string;\n readonly requestURL: string;\n readonly anchor?: string;\n\n constructor(url: string) {\n const linkWithAnchor = document.createElement(\"a\");\n linkWithAnchor.href = url;\n\n this.absoluteURL = linkWithAnchor.href;\n\n const anchorLength = linkWithAnchor.hash.length;\n if (anchorLength < 2) {\n this.requestURL = this.absoluteURL;\n } else {\n this.requestURL = this.absoluteURL.slice(0, -anchorLength);\n this.anchor = linkWithAnchor.hash.slice(1);\n }\n }\n\n getOrigin() {\n return this.absoluteURL.split(\"/\", 3).join(\"/\");\n }\n\n getPath() {\n return (this.requestURL.match(/\\/\\/[^/]*(\\/[^?;]*)/) || [])[1] || \"/\";\n }\n\n getPathComponents() {\n return this.getPath().split(\"/\").slice(1);\n }\n\n getLastPathComponent() {\n return this.getPathComponents().slice(-1)[0];\n }\n\n getExtension() {\n return (this.getLastPathComponent().match(/\\.[^.]*$/) || [])[0] || \"\";\n }\n\n isHTML() {\n return this.getExtension().match(/^(?:|\\.(?:htm|html|xhtml))$/);\n }\n\n isPrefixedBy(location: Location): boolean {\n const prefixURL = getPrefixURL(location);\n return (\n this.isEqualTo(location) || stringStartsWith(this.absoluteURL, prefixURL)\n );\n }\n\n isEqualTo(location?: Location) {\n return location && this.absoluteURL === location.absoluteURL;\n }\n\n toCacheKey() {\n return this.requestURL;\n }\n\n toJSON() {\n return this.absoluteURL;\n }\n\n toString() {\n return this.absoluteURL;\n }\n\n valueOf() {\n return this.absoluteURL;\n }\n}\n\nfunction getPrefixURL(location: Location) {\n return addTrailingSlash(location.getOrigin() + location.getPath());\n}\n\nfunction addTrailingSlash(url: string) {\n return stringEndsWith(url, \"/\") ? url : url + \"/\";\n}\n\nfunction stringStartsWith(string: string, prefix: string) {\n return string.slice(0, prefix.length) === prefix;\n}\n\nfunction stringEndsWith(string: string, suffix: string) {\n return string.slice(-suffix.length) === suffix;\n}\n","export type Action = \"advance\" | \"replace\" | \"restore\";\n\nexport function isAction(action: any): action is Action {\n return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nexport type Position = { x: number; y: number };\n","import { navigate } from \"vike/client/router\";\nimport { Adapter } from \"./adapter\";\nimport { Controller } from \"./controller.js\";\nimport { Location } from \"./location\";\nimport { Action } from \"./types\";\nimport { uuid } from \"./util\";\n\nexport enum TimingMetric {\n visitStart = \"visitStart\",\n requestStart = \"requestStart\",\n requestEnd = \"requestEnd\",\n visitEnd = \"visitEnd\",\n}\n\nexport type TimingMetrics = Partial<{ [metric in TimingMetric]: any }>;\n\nexport enum VisitState {\n initialized = \"initialized\",\n started = \"started\",\n canceled = \"canceled\",\n failed = \"failed\",\n completed = \"completed\",\n}\n\nexport class Visit {\n readonly controller: Controller;\n readonly action: Action;\n readonly adapter: Adapter;\n readonly identifier = uuid();\n readonly restorationIdentifier: string;\n readonly timingMetrics: TimingMetrics = {};\n\n frame?: number;\n location: Location;\n progress = 0;\n referrer?: Location;\n redirectedToLocation?: Location;\n snapshotCached = false;\n state = VisitState.initialized;\n\n requestInFlight = false;\n renderFn?: () => void;\n cancelFn?: () => void;\n\n constructor(\n controller: Controller,\n location: Location,\n action: Action,\n restorationIdentifier: string = uuid()\n ) {\n this.controller = controller;\n this.location = location;\n this.action = action;\n this.adapter = controller.adapter;\n this.restorationIdentifier = restorationIdentifier;\n }\n\n start() {\n if (this.state == VisitState.initialized) {\n this.recordTimingMetric(TimingMetric.visitStart);\n this.state = VisitState.started;\n this.adapter.visitStarted(this);\n }\n }\n\n cancel() {\n if (this.state == VisitState.started) {\n this.requestInFlight = false;\n this.cancelFn?.();\n this.cancelRender();\n this.state = VisitState.canceled;\n }\n }\n\n complete() {\n if (this.state == VisitState.started) {\n this.recordTimingMetric(TimingMetric.visitEnd);\n this.state = VisitState.completed;\n this.adapter.visitCompleted(this);\n this.controller.visitCompleted(this);\n }\n }\n\n fail() {\n if (this.state == VisitState.started) {\n this.state = VisitState.failed;\n this.adapter.visitFailed(this);\n }\n }\n\n changeHistory() {\n // no-op since issueRequest calls navigate which handles all of this already\n return;\n }\n\n issueRequest() {\n if (!this.requestInFlight) {\n const url = new URL(this.location.toString(), this.location.getOrigin());\n navigate(url.pathname + url.hash + url.search, {\n overwriteLastHistoryEntry: this.action === \"replace\",\n }).catch(console.error);\n this.progress = 0;\n this.requestInFlight = true;\n }\n }\n\n getCachedSnapshot() {\n const snapshot = this.controller.getCachedSnapshotForLocation(\n this.location\n );\n if (snapshot) {\n if (this.action == \"restore\") {\n return snapshot;\n }\n }\n }\n\n hasCachedSnapshot() {\n return this.getCachedSnapshot() != null;\n }\n\n loadCachedSnapshot() {\n // no-op since issueRequest calls navigate which handles all of this already\n return;\n }\n\n loadResponse() {\n this.render(() => {\n if (!this.renderFn)\n throw new Error(\"Render details not set before rendering\");\n this.cacheSnapshot();\n this.renderFn();\n });\n }\n\n updateIfRedirect(url: string) {\n const newLocation = Location.wrap(url);\n if (this.location.isEqualTo(newLocation)) return;\n this.redirectedToLocation = newLocation;\n }\n\n onCompleted() {\n if (this.redirectedToLocation) {\n this.location = this.redirectedToLocation;\n this.controller.updateLocationAndRestorationIdentifier(\n this.redirectedToLocation,\n this.restorationIdentifier\n );\n }\n }\n\n // HTTP request delegate\n\n /*\n requestStarted() {\n this.recordTimingMetric(TimingMetric.requestStart);\n this.adapter.visitRequestStarted(this);\n }\n\n requestProgressed(progress: number) {\n this.progress = progress;\n if (this.adapter.visitRequestProgressed) {\n this.adapter.visitRequestProgressed(this);\n }\n }\n\n requestFailedWithStatusCode(statusCode: number, response?: string) {\n this.response = response;\n this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n }\n\n requestFinished() {\n this.recordTimingMetric(TimingMetric.requestEnd);\n this.adapter.visitRequestFinished(this);\n }\n */\n\n // Instrumentation\n\n recordTimingMetric(metric: TimingMetric) {\n this.timingMetrics[metric] = new Date().getTime();\n }\n\n getTimingMetrics(): TimingMetrics {\n return { ...this.timingMetrics };\n }\n\n // Private\n\n cacheSnapshot() {\n if (!this.snapshotCached) {\n this.controller.cacheSnapshot();\n this.snapshotCached = true;\n }\n }\n\n render(callback: () => void) {\n this.cancelRender();\n this.frame = requestAnimationFrame(() => {\n delete this.frame;\n callback.call(this);\n });\n }\n\n cancelRender() {\n if (this.frame) {\n cancelAnimationFrame(this.frame);\n delete this.frame;\n }\n }\n}\n","import { LruCache } from \"./lruCache\";\nimport { Adapter } from \"./adapter\";\nimport { BrowserAdapter } from \"./browser_adapter\";\nimport { Location, Locatable } from \"./location\";\nimport { Action, isAction } from \"./types\";\nimport { closest, defer, dispatch, uuid } from \"./util\";\nimport { Visit } from \"./visit\";\nimport { PageContextClient } from \"vike/types\";\n\nexport type TimingData = {};\nexport type VisitOptions = { action: Action };\n\nexport interface Snapshot {\n bodyEl: HTMLElement;\n headEl: HTMLHeadElement;\n pageContext: PageContextClient;\n}\n\nexport class Controller {\n adapter: Adapter = new BrowserAdapter(this);\n\n cache = new LruCache<Snapshot>(10);\n currentVisit?: Visit;\n enabled = true;\n lastRenderedLocation?: Location;\n location!: Location;\n progressBarDelay = 500;\n restorationIdentifier!: string; // This only exists for compatibility with iOS\n started = false;\n pageContext: any;\n\n start() {\n if (!this.started) {\n addEventListener(\"click\", this.clickCaptured, true);\n this.location = Location.currentLocation;\n this.restorationIdentifier = uuid();\n this.lastRenderedLocation = this.location;\n this.started = true;\n this.enabled = true;\n this.notifyApplicationStarted();\n }\n }\n\n disable() {\n this.enabled = false;\n }\n\n stop() {\n if (this.started) {\n removeEventListener(\"click\", this.clickCaptured, true);\n this.started = false;\n }\n }\n\n clearCache() {\n this.cache = new LruCache(10);\n }\n\n visit(location: Locatable, options: Partial<VisitOptions> = {}) {\n location = Location.wrap(location);\n if (this.applicationAllowsVisitingLocation(location)) {\n if (this.locationIsVisitable(location)) {\n const action = options.action || \"advance\";\n this.adapter.visitProposedToLocationWithAction(location, action);\n } else {\n window.location.href = location.toString();\n }\n }\n }\n\n startVisitToLocationWithAction(\n location: Locatable,\n action: Action,\n restorationIdentifier?: string\n ) {\n this.startVisit(Location.wrap(location), action);\n }\n\n setProgressBarDelay(delay: number) {\n this.progressBarDelay = delay;\n }\n\n // For after redirect, on page load we update this info for ios adapter\n updateLocationAndRestorationIdentifier(\n locatable: Locatable,\n restorationIdentifier: string\n ) {\n this.location = Location.wrap(locatable);\n this.restorationIdentifier = restorationIdentifier;\n }\n\n // History delegate\n\n historyPoppedToLocationWithRestorationIdentifier(\n location: Locatable,\n restorationIdentifier: string\n ) {\n if (this.enabled) {\n this.location = Location.wrap(location);\n this.restorationIdentifier = restorationIdentifier;\n this.startVisit(this.location, \"restore\", true);\n } else {\n this.adapter.pageInvalidated();\n }\n }\n\n // Snapshot cache\n\n getCachedSnapshotForLocation(location: Locatable) {\n return this.cache.get(Location.wrap(location).toCacheKey());\n }\n\n shouldCacheSnapshot() {\n return (\n document.querySelector(\"#proxied-body\") &&\n document.head\n .querySelector(\"meta[name='turbolinks-no-cache']\")\n ?.getAttribute(\"content\") != \"no-cache\"\n );\n }\n\n cacheSnapshot() {\n if (this.shouldCacheSnapshot()) {\n this.notifyApplicationBeforeCachingSnapshot();\n const snapshot = {\n bodyEl: document.body.cloneNode(true),\n headEl: document.head.cloneNode(true),\n pageContext: this.pageContext,\n };\n const location = this.lastRenderedLocation || Location.currentLocation;\n defer(() => this.cache.put(location.toCacheKey(), snapshot));\n }\n }\n\n // View\n viewInvalidated() {\n this.adapter.pageInvalidated();\n }\n\n viewWillRender() {\n this.notifyApplicationBeforeRender();\n }\n\n viewRendered() {\n this.lastRenderedLocation = this.currentVisit!.location;\n this.notifyApplicationAfterRender();\n }\n\n // Event handlers\n\n clickCaptured = () => {\n removeEventListener(\"click\", this.clickBubbled, false);\n addEventListener(\"click\", this.clickBubbled, false);\n };\n\n clickBubbled = (event: MouseEvent) => {\n if (this.enabled && this.clickEventIsSignificant(event)) {\n const link = this.getVisitableLinkForTarget(event.target);\n if (link) {\n const location = this.getVisitableLocationForLink(link);\n if (\n location &&\n this.applicationAllowsFollowingLinkToLocation(link, location)\n ) {\n event.preventDefault();\n event.stopPropagation();\n const action = this.getActionForLink(link);\n this.visit(location, { action });\n }\n }\n }\n };\n\n // Application events\n\n applicationAllowsFollowingLinkToLocation(link: Element, location: Location) {\n const event = this.notifyApplicationAfterClickingLinkToLocation(\n link,\n location\n );\n return !event.defaultPrevented;\n }\n\n applicationAllowsVisitingLocation(location: Location) {\n const event = this.notifyApplicationBeforeVisitingLocation(location);\n return !event.defaultPrevented;\n }\n\n notifyApplicationAfterClickingLinkToLocation(\n link: Element,\n location: Location\n ) {\n return dispatch(\"turbolinks:click\", {\n target: link,\n data: { url: location.absoluteURL },\n cancelable: true,\n });\n }\n\n notifyApplicationBeforeVisitingLocation(location: Location) {\n return dispatch(\"turbolinks:before-visit\", {\n data: { url: location.absoluteURL },\n cancelable: true,\n });\n }\n\n notifyApplicationStarted() {\n // non-standard event added by bifrost\n return dispatch(\"turbolinks:start\");\n }\n\n notifyApplicationAfterVisitingLocation(location: Location) {\n return dispatch(\"turbolinks:visit\", {\n data: { url: location.absoluteURL },\n });\n }\n\n notifyApplicationBeforeCachingSnapshot() {\n return dispatch(\"turbolinks:before-cache\");\n }\n\n notifyApplicationBeforeRender() {\n return dispatch(\"turbolinks:before-render\");\n }\n\n notifyApplicationAfterRender() {\n return dispatch(\"turbolinks:render\");\n }\n\n notifyApplicationAfterPageLoad(timing: TimingData = {}) {\n return dispatch(\"turbolinks:load\", {\n data: { url: this.location.absoluteURL, timing },\n });\n }\n\n // Private\n\n startVisit(\n location: Location,\n action: Action,\n requestInFlight: boolean = false\n ) {\n if (this.currentVisit) {\n this.currentVisit.cancel();\n }\n this.currentVisit = this.createVisit(location, action, requestInFlight);\n this.currentVisit.start();\n this.notifyApplicationAfterVisitingLocation(location);\n }\n\n createVisit(\n location: Location,\n action: Action,\n requestInFlight: boolean = false\n ): Visit {\n const visit = new Visit(this, location, action);\n visit.referrer = this.location;\n visit.requestInFlight = requestInFlight;\n return visit;\n }\n\n visitCompleted(visit: Visit) {\n this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n }\n\n clickEventIsSignificant(event: MouseEvent) {\n return !(\n (event.target && (event.target as any).isContentEditable) ||\n event.defaultPrevented ||\n event.which > 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n );\n }\n\n getVisitableLinkForTarget(target: EventTarget | null) {\n if (target instanceof Element && this.elementIsVisitable(target)) {\n return closest(target, \"a[href]:not([target]):not([download])\");\n }\n }\n\n getVisitableLocationForLink(link: Element) {\n const location = new Location(link.getAttribute(\"href\") || \"\");\n if (this.locationIsVisitable(location)) {\n return location;\n }\n }\n\n getActionForLink(link: Element): Action {\n const action = link.getAttribute(\"data-turbolinks-action\");\n return isAction(action) ? action : \"advance\";\n }\n\n elementIsVisitable(element: Element) {\n const container = closest(element, \"[data-turbolinks]\");\n if (container) {\n return container.getAttribute(\"data-turbolinks\") != \"false\";\n } else {\n return true;\n }\n }\n\n locationIsVisitable(location: Location) {\n return location.isPrefixedBy(new Location(\"/\")) && location.isHTML();\n }\n}\n","import { mergeHead } from \"./mergeHead\";\nimport { Controller, VisitOptions } from \"./controller\";\nimport { Locatable } from \"./location\";\nimport {\n activateNewBodyScriptElements,\n focusFirstAutofocusableElement,\n} from \"./util\";\nimport { Visit } from \"./visit\";\n\nconst controller = new Controller();\n\nexport const Turbolinks = {\n get supported() {\n return true;\n },\n\n controller,\n\n visit(location: Locatable, options?: Partial<VisitOptions>) {\n controller.visit(location, options);\n },\n\n clearCache() {\n controller.clearCache();\n },\n\n setProgressBarDelay(delay: number) {\n controller.setProgressBarDelay(delay);\n },\n\n start() {\n if (window.Turbolinks?.controller?.started) return;\n\n // because this runs after ios hooks, we have to recover. See onRenderHtml\n if (\n window.Turbolinks !== Turbolinks &&\n window.Turbolinks?.controller?.adapter\n ) {\n (window.Turbolinks.controller.adapter as any).controller = controller;\n controller.adapter = window.Turbolinks.controller.adapter;\n }\n // Tells vike not to do link interception\n (window as any)._disableAutomaticLinkInterception = true;\n window.Turbolinks = Turbolinks;\n controller.start();\n },\n\n _vpsCachePageContext(pageContext: any) {\n controller.pageContext = pageContext;\n },\n\n // Returns promise for turbolinks to be ready to render (runs requestAnimationFrame internally)\n async _vikeBeforeRender(\n visit: Visit | undefined,\n errorWhileRendering: unknown\n ): Promise<void> {\n if ((!visit || visit.state === \"completed\") && !errorWhileRendering) {\n throw new Error(\n `Bifrost does not support calling navigate() directly. Use navigate from \"@alignable/bifrost\" or Turbolinks.visit() instead.`\n );\n }\n if (visit) {\n return new Promise((resolve) => {\n visit.cancelFn = () => resolve();\n visit.renderFn = () => {\n resolve();\n };\n\n controller.adapter.visitRequestCompleted(visit);\n controller.adapter.visitRequestFinished(visit);\n });\n } else {\n console.error(\"visit should exist when onBeforeRenderClient fires\");\n }\n },\n\n async _vikeAfterRender(visit: Visit | undefined, activateBody: boolean) {\n if (visit) {\n if (activateBody) {\n activateNewBodyScriptElements(\n Array.from(document.body.querySelectorAll(\"script\"))\n );\n }\n\n focusFirstAutofocusableElement();\n\n controller.viewRendered(); // turbolinks:render\n controller.adapter.visitRendered(visit);\n visit.complete(); // turbolinks:load\n } else {\n console.error(\"visit should exist when onAfterRenderClient fires\");\n }\n },\n};\n\nexport type Turbolinks = typeof Turbolinks;\n"],"mappings":"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","names":["closest","controller","controller"]}
|
|
1
|
+
{"version":3,"sources":["../lib/turbolinks/lruCache.ts","../lib/turbolinks/util.ts","../lib/turbolinks/progress_bar.ts","../lib/turbolinks/browser_adapter.ts","../lib/turbolinks/location.ts","../lib/turbolinks/types.ts","../lib/turbolinks/visit.ts","../lib/turbolinks/controller.ts","../lib/turbolinks/index.ts"],"sourcesContent":["export class LruCache<T> {\n private values: Map<string, T> = new Map<string, T>();\n private maxEntries;\n\n constructor(maxEntries: number) {\n this.maxEntries = maxEntries;\n }\n\n public get(key: string): T | undefined {\n const hasKey = this.values.has(key);\n let entry: T | undefined;\n if (hasKey) {\n // peek the entry, re-insert for LRU strategy\n entry = this.values.get(key)!;\n this.values.delete(key);\n this.values.set(key, entry);\n }\n\n return entry;\n }\n\n public put(key: string, value: T) {\n if (this.values.size >= this.maxEntries) {\n // least-recently used cache eviction strategy\n const keyToDelete = this.values.keys().next().value;\n\n this.values.delete(keyToDelete);\n }\n\n this.values.set(key, value);\n }\n}\n","export function array<T>(values: ArrayLike<T>): T[] {\n return Array.prototype.slice.call(values);\n}\n\nexport const closest = (() => {\n const html = document.documentElement;\n\n type MatchesSelector = (this: Element, selector: string) => boolean;\n const match: MatchesSelector =\n html.matches ||\n (html as any).webkitMatchesSelector ||\n (html as any).msMatchesSelector ||\n (html as any).mozMatchesSelector;\n\n type Closest = (this: Element, selector: string) => Element | null;\n const closest: Closest =\n html.closest ||\n function (selector: string) {\n let element: Element | null = this;\n while (element) {\n if (match.call(element, selector)) {\n return element;\n } else {\n element = element.parentElement;\n }\n }\n };\n\n return function (element: Element, selector: string) {\n return closest.call(element, selector);\n };\n})();\n\nexport function defer(callback: () => any) {\n setTimeout(callback, 1);\n}\n\nexport type DispatchOptions = {\n target: EventTarget;\n cancelable: boolean;\n data: any;\n};\n\nexport function dispatch(\n eventName: string,\n { target, cancelable, data }: Partial<DispatchOptions> = {}\n) {\n const event = document.createEvent(\"Events\") as Event & { data: any };\n event.initEvent(eventName, true, cancelable == true);\n event.data = data || {};\n\n // Fix setting `defaultPrevented` when `preventDefault()` is called\n // http://stackoverflow.com/questions/23349191/event-preventdefault-is-not-working-in-ie-11-for-custom-events\n if (event.cancelable && !preventDefaultSupported) {\n const { preventDefault } = event;\n event.preventDefault = function () {\n if (!this.defaultPrevented) {\n Object.defineProperty(this, \"defaultPrevented\", { get: () => true });\n }\n preventDefault.call(this);\n };\n }\n\n (target || document).dispatchEvent(event);\n return event;\n}\n\nconst preventDefaultSupported = (() => {\n const event = document.createEvent(\"Events\");\n event.initEvent(\"test\", true, true);\n event.preventDefault();\n return event.defaultPrevented;\n})();\n\nexport function unindent(\n strings: TemplateStringsArray,\n ...values: any[]\n): string {\n const lines = trimLeft(interpolate(strings, values)).split(\"\\n\");\n const match = lines[0].match(/^\\s+/);\n const indent = match ? match[0].length : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\n\nfunction trimLeft(string: string) {\n return string.replace(/^\\n/, \"\");\n}\n\nfunction interpolate(strings: TemplateStringsArray, values: any[]) {\n return strings.reduce((result, string, i) => {\n const value = values[i] == undefined ? \"\" : values[i];\n return result + string + value;\n }, \"\");\n}\n\nexport function uuid() {\n return Array.apply(null, { length: 36 } as any)\n .map((_, i) => {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n return \"-\";\n } else if (i == 14) {\n return \"4\";\n } else if (i == 19) {\n return (Math.floor(Math.random() * 4) + 8).toString(16);\n } else {\n return Math.floor(Math.random() * 15).toString(16);\n }\n })\n .join(\"\");\n}\n\nexport function createScriptElement(element: Element, cb?: () => void) {\n if (element.getAttribute(\"data-turbolinks-eval\") == \"false\") {\n return element;\n } else {\n const createdScriptElement = document.createElement(\"script\");\n createdScriptElement.textContent = element.textContent;\n // async false makes scripts run in-order. it wont block js execution (thankfully)\n // https://github.com/turbolinks/turbolinks/issues/282#issuecomment-355731712\n createdScriptElement.async = false;\n copyElementAttributes(createdScriptElement, element);\n if (cb) {\n createdScriptElement.addEventListener(\"load\", cb);\n }\n return createdScriptElement;\n }\n}\n\nexport function copyElementAttributes(\n destinationElement: Element,\n sourceElement: Element\n) {\n for (const { name, value } of array(sourceElement.attributes)) {\n destinationElement.setAttribute(name, value);\n }\n}\n\nfunction replaceElementWithElement(fromElement: Element, toElement: Element) {\n const parentElement = fromElement.parentElement;\n if (parentElement) {\n return parentElement.replaceChild(toElement, fromElement);\n }\n}\nexport function activateNewBodyScriptElements(\n newScriptElements: HTMLScriptElement[]\n) {\n for (const inertScriptElement of newScriptElements) {\n const activatedScriptElement = createScriptElement(inertScriptElement);\n replaceElementWithElement(inertScriptElement, activatedScriptElement);\n }\n}\n\nexport function focusFirstAutofocusableElement() {\n const element = document.body.querySelector(\"[autofocus]\");\n if (element && \"focus\" in element && typeof element.focus === \"function\") {\n element.focus();\n }\n}\n","import { unindent } from \"./util\";\n\nexport class ProgressBar {\n static animationDuration = 300; /*ms*/\n\n static get defaultCSS() {\n return unindent`\n .turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition:\n width ${ProgressBar.animationDuration}ms ease-out,\n opacity ${ProgressBar.animationDuration / 2}ms ${\n ProgressBar.animationDuration / 2\n }ms ease-in;\n transform: translate3d(0, 0, 0);\n }\n `;\n }\n\n readonly stylesheetElement = this.createStylesheetElement();\n readonly progressElement = this.createProgressElement();\n\n hiding = false;\n trickleInterval?: number;\n value = 0;\n visible = false;\n\n show() {\n if (!this.visible) {\n this.visible = true;\n this.installStylesheetElement();\n this.installProgressElement();\n this.startTrickling();\n }\n }\n\n hide() {\n if (this.visible && !this.hiding) {\n this.hiding = true;\n this.fadeProgressElement(() => {\n this.uninstallProgressElement();\n this.stopTrickling();\n this.visible = false;\n this.hiding = false;\n });\n }\n }\n\n setValue(value: number) {\n this.value = value;\n this.refresh();\n }\n\n // Private\n\n installStylesheetElement() {\n document.head.insertBefore(\n this.stylesheetElement,\n document.head.firstChild\n );\n }\n\n installProgressElement() {\n this.progressElement.style.width = \"0\";\n this.progressElement.style.opacity = \"1\";\n document.documentElement.insertBefore(this.progressElement, document.body);\n this.refresh();\n }\n\n fadeProgressElement(callback: () => void) {\n this.progressElement.style.opacity = \"0\";\n setTimeout(callback, ProgressBar.animationDuration * 1.5);\n }\n\n uninstallProgressElement() {\n if (this.progressElement.parentNode) {\n document.documentElement.removeChild(this.progressElement);\n }\n }\n\n startTrickling() {\n if (!this.trickleInterval) {\n this.trickleInterval = window.setInterval(\n this.trickle,\n ProgressBar.animationDuration\n );\n }\n }\n\n stopTrickling() {\n window.clearInterval(this.trickleInterval);\n delete this.trickleInterval;\n }\n\n trickle = () => {\n this.setValue(this.value + Math.random() / 100);\n };\n\n refresh() {\n requestAnimationFrame(() => {\n this.progressElement.style.width = `${10 + this.value * 90}%`;\n });\n }\n\n createStylesheetElement() {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n element.textContent = ProgressBar.defaultCSS;\n return element;\n }\n\n createProgressElement() {\n const element = document.createElement(\"div\");\n element.className = \"turbolinks-progress-bar\";\n return element;\n }\n}\n","import { Adapter } from \"./adapter\";\nimport { Controller } from \"./controller\";\nimport { Locatable } from \"./location\";\nimport { ProgressBar } from \"./progress_bar\";\nimport { Action } from \"./types\";\nimport { Visit } from \"./visit\";\n\nexport class BrowserAdapter implements Adapter {\n readonly controller: Controller;\n readonly progressBar = new ProgressBar();\n\n progressBarTimeout?: number;\n\n constructor(controller: Controller) {\n this.controller = controller;\n }\n\n visitProposedToLocationWithAction(location: Locatable, action: Action) {\n this.controller.startVisitToLocationWithAction(location, action);\n }\n\n visitStarted(visit: Visit) {\n visit.issueRequest();\n visit.changeHistory();\n visit.loadCachedSnapshot();\n }\n\n visitRequestStarted(visit: Visit) {\n this.progressBar.setValue(0);\n if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n this.showProgressBarAfterDelay();\n } else {\n this.showProgressBar();\n }\n }\n\n visitRequestProgressed(visit: Visit) {\n this.progressBar.setValue(visit.progress);\n }\n\n visitRequestCompleted(visit: Visit) {\n visit.loadResponse();\n }\n\n visitRequestFailedWithStatusCode(visit: Visit, statusCode: number) {\n switch (statusCode) {\n // TODO\n // case SystemStatusCode.networkFailure:\n // case SystemStatusCode.timeoutFailure:\n // case SystemStatusCode.contentTypeMismatch:\n // return this.reload()\n default:\n return visit.loadResponse();\n }\n }\n\n visitRequestFinished(visit: Visit) {\n this.hideProgressBar();\n }\n\n visitCompleted(visit: Visit) {\n visit.onCompleted();\n }\n\n pageInvalidated() {\n this.reload();\n }\n\n visitFailed(visit: Visit) {}\n\n visitRendered(visit: Visit) {}\n\n // Private\n\n showProgressBarAfterDelay() {\n this.progressBarTimeout = window.setTimeout(\n this.showProgressBar,\n this.controller.progressBarDelay\n );\n }\n\n showProgressBar = () => {\n this.progressBar.show();\n };\n\n hideProgressBar() {\n this.progressBar.hide();\n if (this.progressBarTimeout != null) {\n window.clearTimeout(this.progressBarTimeout);\n delete this.progressBarTimeout;\n }\n }\n\n reload() {\n window.location.reload();\n }\n}\n","export type Locatable = Location | string;\n\nexport class Location {\n static get currentLocation() {\n return this.wrap(window.location.toString());\n }\n\n static wrap(locatable: Locatable): Location;\n static wrap(locatable?: Locatable | null): Location | undefined;\n static wrap(locatable: Locatable) {\n if (typeof locatable == \"string\") {\n return new this(locatable);\n } else if (locatable != null) {\n return locatable;\n }\n }\n\n readonly absoluteURL: string;\n readonly requestURL: string;\n readonly anchor?: string;\n\n constructor(url: string) {\n const linkWithAnchor = document.createElement(\"a\");\n linkWithAnchor.href = url;\n\n this.absoluteURL = linkWithAnchor.href;\n\n const anchorLength = linkWithAnchor.hash.length;\n if (anchorLength < 2) {\n this.requestURL = this.absoluteURL;\n } else {\n this.requestURL = this.absoluteURL.slice(0, -anchorLength);\n this.anchor = linkWithAnchor.hash.slice(1);\n }\n }\n\n getOrigin() {\n return this.absoluteURL.split(\"/\", 3).join(\"/\");\n }\n\n getPath() {\n return (this.requestURL.match(/\\/\\/[^/]*(\\/[^?;]*)/) || [])[1] || \"/\";\n }\n\n getPathComponents() {\n return this.getPath().split(\"/\").slice(1);\n }\n\n getLastPathComponent() {\n return this.getPathComponents().slice(-1)[0];\n }\n\n getExtension() {\n return (this.getLastPathComponent().match(/\\.[^.]*$/) || [])[0] || \"\";\n }\n\n isHTML() {\n return this.getExtension().match(/^(?:|\\.(?:htm|html|xhtml))$/);\n }\n\n isPrefixedBy(location: Location): boolean {\n const prefixURL = getPrefixURL(location);\n return (\n this.isEqualTo(location) || stringStartsWith(this.absoluteURL, prefixURL)\n );\n }\n\n isEqualTo(location?: Location) {\n return location && this.absoluteURL === location.absoluteURL;\n }\n\n toCacheKey() {\n return this.requestURL;\n }\n\n toJSON() {\n return this.absoluteURL;\n }\n\n toString() {\n return this.absoluteURL;\n }\n\n valueOf() {\n return this.absoluteURL;\n }\n}\n\nfunction getPrefixURL(location: Location) {\n return addTrailingSlash(location.getOrigin() + location.getPath());\n}\n\nfunction addTrailingSlash(url: string) {\n return stringEndsWith(url, \"/\") ? url : url + \"/\";\n}\n\nfunction stringStartsWith(string: string, prefix: string) {\n return string.slice(0, prefix.length) === prefix;\n}\n\nfunction stringEndsWith(string: string, suffix: string) {\n return string.slice(-suffix.length) === suffix;\n}\n","export type Action = \"advance\" | \"replace\" | \"restore\";\n\nexport function isAction(action: any): action is Action {\n return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nexport type Position = { x: number; y: number };\n","import { navigate } from \"vike/client/router\";\nimport { Adapter } from \"./adapter\";\nimport { Controller } from \"./controller.js\";\nimport { Location } from \"./location\";\nimport { Action } from \"./types\";\nimport { uuid } from \"./util\";\n\nexport enum TimingMetric {\n visitStart = \"visitStart\",\n requestStart = \"requestStart\",\n requestEnd = \"requestEnd\",\n visitEnd = \"visitEnd\",\n}\n\nexport type TimingMetrics = Partial<{ [metric in TimingMetric]: any }>;\n\nexport enum VisitState {\n initialized = \"initialized\",\n started = \"started\",\n canceled = \"canceled\",\n failed = \"failed\",\n completed = \"completed\",\n}\n\nexport class Visit {\n readonly controller: Controller;\n readonly action: Action;\n readonly adapter: Adapter;\n readonly identifier = uuid();\n readonly restorationIdentifier: string;\n readonly timingMetrics: TimingMetrics = {};\n\n frame?: number;\n location: Location;\n progress = 0;\n referrer?: Location;\n redirectedToLocation?: Location;\n snapshotCached = false;\n state = VisitState.initialized;\n\n requestInFlight = false;\n renderFn?: () => void;\n cancelFn?: () => void;\n\n constructor(\n controller: Controller,\n location: Location,\n action: Action,\n restorationIdentifier: string = uuid()\n ) {\n this.controller = controller;\n this.location = location;\n this.action = action;\n this.adapter = controller.adapter;\n this.restorationIdentifier = restorationIdentifier;\n }\n\n start() {\n if (this.state == VisitState.initialized) {\n this.recordTimingMetric(TimingMetric.visitStart);\n this.state = VisitState.started;\n this.adapter.visitStarted(this);\n }\n }\n\n cancel() {\n if (this.state == VisitState.started) {\n this.requestInFlight = false;\n this.cancelFn?.();\n this.cancelRender();\n this.state = VisitState.canceled;\n }\n }\n\n complete() {\n if (this.state == VisitState.started) {\n this.recordTimingMetric(TimingMetric.visitEnd);\n this.state = VisitState.completed;\n this.adapter.visitCompleted(this);\n this.controller.visitCompleted(this);\n }\n }\n\n fail() {\n if (this.state == VisitState.started) {\n this.state = VisitState.failed;\n this.adapter.visitFailed(this);\n }\n }\n\n changeHistory() {\n // no-op since issueRequest calls navigate which handles all of this already\n return;\n }\n\n issueRequest() {\n if (!this.requestInFlight) {\n const url = new URL(this.location.toString(), this.location.getOrigin());\n navigate(url.pathname + url.hash + url.search, {\n overwriteLastHistoryEntry: this.action === \"replace\",\n }).catch(console.error);\n this.progress = 0;\n this.requestInFlight = true;\n }\n }\n\n getCachedSnapshot() {\n const snapshot = this.controller.getCachedSnapshotForLocation(\n this.location\n );\n if (snapshot) {\n if (this.action == \"restore\") {\n return snapshot;\n }\n }\n }\n\n hasCachedSnapshot() {\n return this.getCachedSnapshot() != null;\n }\n\n loadCachedSnapshot() {\n // no-op since issueRequest calls navigate which handles all of this already\n return;\n }\n\n loadResponse() {\n this.render(() => {\n if (!this.renderFn)\n throw new Error(\"Render details not set before rendering\");\n this.cacheSnapshot();\n this.renderFn();\n });\n }\n\n updateIfRedirect(url: string) {\n const newLocation = Location.wrap(url);\n if (this.location.isEqualTo(newLocation)) return;\n this.redirectedToLocation = newLocation;\n }\n\n onCompleted() {\n if (this.redirectedToLocation) {\n this.location = this.redirectedToLocation;\n this.controller.updateLocationAndRestorationIdentifier(\n this.redirectedToLocation,\n this.restorationIdentifier\n );\n }\n }\n\n // HTTP request delegate\n\n /*\n requestStarted() {\n this.recordTimingMetric(TimingMetric.requestStart);\n this.adapter.visitRequestStarted(this);\n }\n\n requestProgressed(progress: number) {\n this.progress = progress;\n if (this.adapter.visitRequestProgressed) {\n this.adapter.visitRequestProgressed(this);\n }\n }\n\n requestFailedWithStatusCode(statusCode: number, response?: string) {\n this.response = response;\n this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n }\n\n requestFinished() {\n this.recordTimingMetric(TimingMetric.requestEnd);\n this.adapter.visitRequestFinished(this);\n }\n */\n\n // Instrumentation\n\n recordTimingMetric(metric: TimingMetric) {\n this.timingMetrics[metric] = new Date().getTime();\n }\n\n getTimingMetrics(): TimingMetrics {\n return { ...this.timingMetrics };\n }\n\n // Private\n\n cacheSnapshot() {\n if (!this.snapshotCached) {\n this.controller.cacheSnapshot();\n this.snapshotCached = true;\n }\n }\n\n render(callback: () => void) {\n this.cancelRender();\n this.frame = requestAnimationFrame(() => {\n delete this.frame;\n callback.call(this);\n });\n }\n\n cancelRender() {\n if (this.frame) {\n cancelAnimationFrame(this.frame);\n delete this.frame;\n }\n }\n}\n","import { LruCache } from \"./lruCache\";\nimport { Adapter } from \"./adapter\";\nimport { BrowserAdapter } from \"./browser_adapter\";\nimport { Location, Locatable } from \"./location\";\nimport { Action, isAction } from \"./types\";\nimport { closest, defer, dispatch, uuid } from \"./util\";\nimport { Visit } from \"./visit\";\nimport { PageContextClient } from \"vike/types\";\n\nexport type TimingData = {};\nexport type VisitOptions = { action: Action };\n\nexport interface Snapshot {\n bodyEl: HTMLElement;\n headEl: HTMLHeadElement;\n pageContext: PageContextClient;\n}\n\nexport class Controller {\n adapter: Adapter = new BrowserAdapter(this);\n\n cache = new LruCache<Snapshot>(10);\n currentVisit?: Visit;\n enabled = true;\n lastRenderedLocation?: Location;\n location!: Location;\n progressBarDelay = 500;\n restorationIdentifier!: string; // This only exists for compatibility with iOS\n started = false;\n pageContext: any;\n\n start() {\n if (!this.started) {\n addEventListener(\"click\", this.clickCaptured, true);\n this.location = Location.currentLocation;\n this.restorationIdentifier = uuid();\n this.lastRenderedLocation = this.location;\n this.started = true;\n this.enabled = true;\n this.notifyApplicationStarted();\n }\n }\n\n disable() {\n this.enabled = false;\n }\n\n stop() {\n if (this.started) {\n removeEventListener(\"click\", this.clickCaptured, true);\n this.started = false;\n }\n }\n\n clearCache() {\n this.cache = new LruCache(10);\n }\n\n visit(location: Locatable, options: Partial<VisitOptions> = {}) {\n location = Location.wrap(location);\n if (this.applicationAllowsVisitingLocation(location)) {\n if (this.locationIsVisitable(location)) {\n const action = options.action || \"advance\";\n this.adapter.visitProposedToLocationWithAction(location, action);\n } else {\n window.location.href = location.toString();\n }\n }\n }\n\n startVisitToLocationWithAction(\n location: Locatable,\n action: Action,\n restorationIdentifier?: string\n ) {\n this.startVisit(Location.wrap(location), action);\n }\n\n setProgressBarDelay(delay: number) {\n this.progressBarDelay = delay;\n }\n\n // For after redirect, on page load we update this info for ios adapter\n updateLocationAndRestorationIdentifier(\n locatable: Locatable,\n restorationIdentifier: string\n ) {\n this.location = Location.wrap(locatable);\n this.restorationIdentifier = restorationIdentifier;\n }\n\n // History delegate\n\n historyPoppedToLocationWithRestorationIdentifier(\n location: Locatable,\n restorationIdentifier: string\n ) {\n if (this.enabled) {\n this.location = Location.wrap(location);\n this.restorationIdentifier = restorationIdentifier;\n this.startVisit(this.location, \"restore\", true);\n } else {\n this.adapter.pageInvalidated();\n }\n }\n\n // Snapshot cache\n\n getCachedSnapshotForLocation(location: Locatable) {\n return this.cache.get(Location.wrap(location).toCacheKey());\n }\n\n shouldCacheSnapshot() {\n return (\n document.querySelector(\"#proxied-body\") &&\n document.head\n .querySelector(\"meta[name='turbolinks-no-cache']\")\n ?.getAttribute(\"content\") != \"no-cache\"\n );\n }\n\n cacheSnapshot() {\n if (this.shouldCacheSnapshot()) {\n this.notifyApplicationBeforeCachingSnapshot();\n const snapshot = {\n bodyEl: document.body.cloneNode(true),\n headEl: document.head.cloneNode(true),\n pageContext: this.pageContext,\n };\n const location = this.lastRenderedLocation || Location.currentLocation;\n defer(() => this.cache.put(location.toCacheKey(), snapshot));\n }\n }\n\n // View\n viewInvalidated() {\n this.adapter.pageInvalidated();\n }\n\n viewWillRender() {\n this.notifyApplicationBeforeRender();\n }\n\n viewRendered() {\n this.lastRenderedLocation = this.currentVisit!.location;\n this.notifyApplicationAfterRender();\n }\n\n // Event handlers\n\n clickCaptured = () => {\n removeEventListener(\"click\", this.clickBubbled, false);\n addEventListener(\"click\", this.clickBubbled, false);\n };\n\n clickBubbled = (event: MouseEvent) => {\n if (this.enabled && this.clickEventIsSignificant(event)) {\n const link = this.getVisitableLinkForTarget(event.target);\n if (link) {\n const location = this.getVisitableLocationForLink(link);\n if (\n location &&\n this.applicationAllowsFollowingLinkToLocation(link, location)\n ) {\n event.preventDefault();\n event.stopPropagation();\n const action = this.getActionForLink(link);\n this.visit(location, { action });\n }\n }\n }\n };\n\n // Application events\n\n applicationAllowsFollowingLinkToLocation(link: Element, location: Location) {\n const event = this.notifyApplicationAfterClickingLinkToLocation(\n link,\n location\n );\n return !event.defaultPrevented;\n }\n\n applicationAllowsVisitingLocation(location: Location) {\n const event = this.notifyApplicationBeforeVisitingLocation(location);\n return !event.defaultPrevented;\n }\n\n notifyApplicationAfterClickingLinkToLocation(\n link: Element,\n location: Location\n ) {\n return dispatch(\"turbolinks:click\", {\n target: link,\n data: { url: location.absoluteURL },\n cancelable: true,\n });\n }\n\n notifyApplicationBeforeVisitingLocation(location: Location) {\n return dispatch(\"turbolinks:before-visit\", {\n data: { url: location.absoluteURL },\n cancelable: true,\n });\n }\n\n notifyApplicationStarted() {\n // non-standard event added by bifrost\n return dispatch(\"turbolinks:start\");\n }\n\n notifyApplicationAfterVisitingLocation(location: Location) {\n return dispatch(\"turbolinks:visit\", {\n data: { url: location.absoluteURL },\n });\n }\n\n notifyApplicationBeforeCachingSnapshot() {\n return dispatch(\"turbolinks:before-cache\");\n }\n\n notifyApplicationBeforeRender() {\n return dispatch(\"turbolinks:before-render\");\n }\n\n notifyApplicationAfterRender() {\n return dispatch(\"turbolinks:render\");\n }\n\n notifyApplicationAfterPageLoad(timing: TimingData = {}) {\n return dispatch(\"turbolinks:load\", {\n data: { url: this.location.absoluteURL, timing },\n });\n }\n\n // Private\n\n startVisit(\n location: Location,\n action: Action,\n requestInFlight: boolean = false\n ) {\n if (this.currentVisit) {\n this.currentVisit.cancel();\n }\n this.currentVisit = this.createVisit(location, action, requestInFlight);\n this.currentVisit.start();\n this.notifyApplicationAfterVisitingLocation(location);\n }\n\n createVisit(\n location: Location,\n action: Action,\n requestInFlight: boolean = false\n ): Visit {\n const visit = new Visit(this, location, action);\n visit.referrer = this.location;\n visit.requestInFlight = requestInFlight;\n return visit;\n }\n\n visitCompleted(visit: Visit) {\n this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n }\n\n clickEventIsSignificant(event: MouseEvent) {\n return !(\n (event.target && (event.target as any).isContentEditable) ||\n event.defaultPrevented ||\n event.which > 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n );\n }\n\n getVisitableLinkForTarget(target: EventTarget | null) {\n if (target instanceof Element && this.elementIsVisitable(target)) {\n return closest(target, \"a[href]:not([target]):not([download])\");\n }\n }\n\n getVisitableLocationForLink(link: Element) {\n const location = new Location(link.getAttribute(\"href\") || \"\");\n if (this.locationIsVisitable(location)) {\n return location;\n }\n }\n\n getActionForLink(link: Element): Action {\n const action = link.getAttribute(\"data-turbolinks-action\");\n return isAction(action) ? action : \"advance\";\n }\n\n elementIsVisitable(element: Element) {\n const container = closest(element, \"[data-turbolinks]\");\n if (container) {\n return container.getAttribute(\"data-turbolinks\") != \"false\";\n } else {\n return true;\n }\n }\n\n locationIsVisitable(location: Location) {\n return location.isPrefixedBy(new Location(\"/\")) && location.isHTML();\n }\n}\n","import { mergeHead } from \"./mergeHead\";\nimport { Controller, VisitOptions } from \"./controller\";\nimport { Locatable } from \"./location\";\nimport {\n activateNewBodyScriptElements,\n focusFirstAutofocusableElement,\n} from \"./util\";\nimport { Visit } from \"./visit\";\n\nconst controller = new Controller();\n\nexport const Turbolinks = {\n get supported() {\n return true;\n },\n\n controller,\n\n visit(location: Locatable, options?: Partial<VisitOptions>) {\n controller.visit(location, options);\n },\n\n clearCache() {\n controller.clearCache();\n },\n\n setProgressBarDelay(delay: number) {\n controller.setProgressBarDelay(delay);\n },\n\n start() {\n if (window.Turbolinks?.controller?.started) return;\n\n // because this runs after ios hooks, we have to recover. See onRenderHtml\n if (\n window.Turbolinks !== Turbolinks &&\n window.Turbolinks?.controller?.adapter\n ) {\n (window.Turbolinks.controller.adapter as any).controller = controller;\n controller.adapter = window.Turbolinks.controller.adapter;\n }\n // Tells vike not to do link interception\n (window as any)._disableAutomaticLinkInterception = true;\n window.Turbolinks = Turbolinks;\n controller.start();\n },\n\n _vpsCachePageContext(pageContext: any) {\n controller.pageContext = pageContext;\n },\n\n // Returns promise for turbolinks to be ready to render (runs requestAnimationFrame internally)\n async _vikeBeforeRender(\n visit: Visit | undefined,\n errorWhileRendering: unknown\n ): Promise<void> {\n if ((!visit || visit.state === \"completed\") && !errorWhileRendering) {\n throw new Error(\n `Bifrost does not support calling navigate() directly. Use navigate from \"@alignable/bifrost\" or Turbolinks.visit() instead.`\n );\n }\n if (visit) {\n return new Promise((resolve) => {\n visit.cancelFn = () => resolve();\n visit.renderFn = () => {\n resolve();\n };\n\n controller.adapter.visitRequestCompleted(visit);\n controller.adapter.visitRequestFinished(visit);\n });\n } else {\n console.error(\"visit should exist when onBeforeRenderClient fires\");\n }\n },\n\n async _vikeAfterRender(visit: Visit | undefined, activateBody: boolean) {\n if (visit) {\n if (activateBody) {\n activateNewBodyScriptElements(\n Array.from(document.body.querySelectorAll(\"script\"))\n );\n }\n\n focusFirstAutofocusableElement();\n\n controller.viewRendered(); // turbolinks:render\n controller.adapter.visitRendered(visit);\n visit.complete(); // turbolinks:load\n } else {\n console.error(\"visit should exist when onAfterRenderClient fires\");\n }\n },\n};\n\nexport type Turbolinks = typeof Turbolinks;\n"],"mappings":"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","names":["closest","controller","controller"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// lib/elementUtils.ts
|
|
2
|
+
function getElementAttributes(element) {
|
|
3
|
+
const bodyAttrs = {};
|
|
4
|
+
element.getAttributeNames().forEach((name) => {
|
|
5
|
+
bodyAttrs[name] = element.getAttribute(name);
|
|
6
|
+
});
|
|
7
|
+
return bodyAttrs;
|
|
8
|
+
}
|
|
9
|
+
function setBodyAttributes(attrs) {
|
|
10
|
+
document.body.getAttributeNames().forEach((n) => document.body.removeAttribute(n));
|
|
11
|
+
for (const [name, value] of Object.entries(attrs)) {
|
|
12
|
+
if (value !== false && value !== null && value !== void 0) {
|
|
13
|
+
document.body.setAttribute(name, String(value));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
getElementAttributes,
|
|
20
|
+
setBodyAttributes
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=chunk-7Y5VBDG6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../lib/elementUtils.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\n/**\n * clears attributes on document body and sets new ones\n * @param attrs attributes to set on body\n */\nexport function setBodyAttributes(\n attrs: Record<string, string | number | boolean | null | undefined>\n) {\n document.body\n .getAttributeNames()\n .forEach((n) => document.body.removeAttribute(n));\n for (const [name, value] of Object.entries(attrs)) {\n if (value !== false && value !== null && value !== undefined) {\n document.body.setAttribute(name, String(value));\n }\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;AAMO,SAAS,kBACd,OACA;AACA,WAAS,KACN,kBAAkB,EAClB,QAAQ,CAAC,MAAM,SAAS,KAAK,gBAAgB,CAAC,CAAC;AAClD,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,QAAI,UAAU,SAAS,UAAU,QAAQ,UAAU,QAAW;AAC5D,eAAS,KAAK,aAAa,MAAM,OAAO,KAAK,CAAC;AAAA,IAChD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -11,6 +11,12 @@ var config_default = {
|
|
|
11
11
|
Wrapper: "import:@alignable/bifrost/__internal/renderer/Wrapper:default",
|
|
12
12
|
passToClient: ["proxyLayoutInfo"],
|
|
13
13
|
meta: {
|
|
14
|
+
bodyAttributes: {
|
|
15
|
+
// vike-react bodyAttributes are server-only, but legacy backend may change bodyAttributes and we need to reset on return to bifrost pages
|
|
16
|
+
env: { server: true, client: true },
|
|
17
|
+
global: true,
|
|
18
|
+
cumulative: true
|
|
19
|
+
},
|
|
14
20
|
getLayout: { env: { server: true, client: true } },
|
|
15
21
|
proxyHeaders: { env: { server: true, client: true } },
|
|
16
22
|
proxyMode: {
|
|
@@ -51,4 +57,4 @@ var config_default = {
|
|
|
51
57
|
export {
|
|
52
58
|
config_default
|
|
53
59
|
};
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-C4LFRUST.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 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 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 }\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,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,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":[]}
|
package/dist/renderer/+config.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
setBodyAttributes
|
|
3
|
+
} from "../../chunk-7Y5VBDG6.js";
|
|
1
4
|
import {
|
|
2
5
|
Turbolinks
|
|
3
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-7NFPFMDU.js";
|
|
4
7
|
|
|
5
8
|
// renderer/bifrost/onBeforeRenderClient.ts
|
|
6
9
|
async function bifrostOnBeforeRenderClient(pageContext) {
|
|
@@ -12,6 +15,13 @@ async function bifrostOnBeforeRenderClient(pageContext) {
|
|
|
12
15
|
pageContext._turbolinksVisit,
|
|
13
16
|
pageContext.errorWhileRendering
|
|
14
17
|
);
|
|
18
|
+
if (pageContext.config.bodyAttributes)
|
|
19
|
+
setBodyAttributes(
|
|
20
|
+
pageContext.config.bodyAttributes.reduce(
|
|
21
|
+
(acc, attrs) => ({ ...acc, ...attrs }),
|
|
22
|
+
{}
|
|
23
|
+
)
|
|
24
|
+
);
|
|
15
25
|
}
|
|
16
26
|
}
|
|
17
27
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../renderer/bifrost/onBeforeRenderClient.ts"],"sourcesContent":["import { PageContextClient } from \"vike/types\";\nimport { Turbolinks } from \"../../lib/turbolinks\";\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}\n"],"mappings":"
|
|
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,4 +1,4 @@
|
|
|
1
|
-
export { W as WrappedServerOnly } from '../type-
|
|
1
|
+
export { W as WrappedServerOnly } from '../type-813ffb18.js';
|
|
2
2
|
import '../controller-01a828bc.js';
|
|
3
3
|
import 'vike/types';
|
|
4
4
|
|
|
@@ -14,6 +14,14 @@ declare const _default: {
|
|
|
14
14
|
Wrapper: "import:@alignable/bifrost/__internal/renderer/Wrapper:default";
|
|
15
15
|
passToClient: string[];
|
|
16
16
|
meta: {
|
|
17
|
+
bodyAttributes: {
|
|
18
|
+
env: {
|
|
19
|
+
server: true;
|
|
20
|
+
client: true;
|
|
21
|
+
};
|
|
22
|
+
global: true;
|
|
23
|
+
cumulative: true;
|
|
24
|
+
};
|
|
17
25
|
getLayout: {
|
|
18
26
|
env: {
|
|
19
27
|
server: true;
|
|
@@ -1,23 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Turbolinks
|
|
3
|
-
} from "../../chunk-
|
|
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
|
-
}
|
|
3
|
+
} from "../../chunk-7NFPFMDU.js";
|
|
13
4
|
|
|
14
5
|
// renderer/wrapped/onAfterRenderClient.ts
|
|
15
6
|
async function wrappedOnAfterRenderClient(pageContext) {
|
|
16
7
|
const { proxyLayoutInfo } = pageContext;
|
|
17
|
-
const bodyEl = document.getElementById("proxied-body");
|
|
18
8
|
Turbolinks._vpsCachePageContext({
|
|
19
|
-
proxyLayoutInfo
|
|
20
|
-
bodyAttrs: getElementAttributes(bodyEl)
|
|
9
|
+
proxyLayoutInfo
|
|
21
10
|
});
|
|
22
11
|
if (!pageContext.isHydration) {
|
|
23
12
|
await pageContext._waitForHeadScripts?.();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../
|
|
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 const { proxyLayoutInfo } = pageContext;\n Turbolinks._vpsCachePageContext({\n proxyLayoutInfo,\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(pageContext._turbolinksVisit, true);\n }\n}\n"],"mappings":";;;;;AAIA,eAAO,2BACL,aACA;AACA,QAAM,EAAE,gBAAgB,IAAI;AAC5B,aAAW,qBAAqB;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,MAAI,CAAC,YAAY,aAAa;AAE5B,UAAM,YAAY,sBAAsB;AACxC,UAAM,WAAW,iBAAiB,YAAY,kBAAkB,IAAI;AAAA,EACtE;AACF;","names":[]}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getElementAttributes
|
|
3
|
+
} from "../../chunk-7Y5VBDG6.js";
|
|
4
|
+
|
|
1
5
|
// renderer/wrapped/onBeforeRender.client.ts
|
|
2
6
|
import { redirect } from "vike/abort";
|
|
3
7
|
async function wrappedOnBeforeRender(pageContext) {
|
|
@@ -30,7 +34,8 @@ async function wrappedOnBeforeRender(pageContext) {
|
|
|
30
34
|
pageContext.proxyLayoutInfo = layoutInfo;
|
|
31
35
|
pageContext._turbolinksProxy = {
|
|
32
36
|
body: bodyEl,
|
|
33
|
-
head: headEl
|
|
37
|
+
head: headEl,
|
|
38
|
+
bodyAttrs: getElementAttributes(bodyEl)
|
|
34
39
|
};
|
|
35
40
|
}
|
|
36
41
|
}
|
|
@@ -1 +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":"
|
|
1
|
+
{"version":3,"sources":["../../../renderer/wrapped/onBeforeRender.client.ts"],"sourcesContent":["import \"../../lib/type\";\nimport type { PageContextClient } from \"vike/types\";\nimport { redirect } from \"vike/abort\";\nimport { getElementAttributes } from \"../../lib/elementUtils\";\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 bodyAttrs: getElementAttributes(bodyEl),\n };\n }\n}\n"],"mappings":";;;;;AAEA,SAAS,gBAAgB;AAMzB,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,MACN,WAAW,qBAAqB,MAAM;AAAA,IACxC;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getElementAttributes,
|
|
3
|
+
setBodyAttributes
|
|
4
|
+
} from "../../chunk-7Y5VBDG6.js";
|
|
1
5
|
import {
|
|
2
6
|
Turbolinks,
|
|
3
|
-
copyElementAttributes,
|
|
4
7
|
createScriptElement
|
|
5
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-7NFPFMDU.js";
|
|
6
9
|
|
|
7
10
|
// lib/turbolinks/mergeHead.ts
|
|
8
11
|
var allHeadScriptsEverRun = {};
|
|
@@ -128,6 +131,11 @@ function categorizeHead(head) {
|
|
|
128
131
|
// renderer/wrapped/onBeforeRenderClient.ts
|
|
129
132
|
async function wrappedOnBeforeRenderClient(pageContext) {
|
|
130
133
|
if (pageContext.isHydration) {
|
|
134
|
+
if (document.readyState === "loading") {
|
|
135
|
+
await new Promise(
|
|
136
|
+
(resolve) => document.addEventListener("DOMContentLoaded", () => resolve(null))
|
|
137
|
+
);
|
|
138
|
+
}
|
|
131
139
|
pageContext._turbolinksProxy = {
|
|
132
140
|
body: document.getElementById("proxied-body")
|
|
133
141
|
};
|
|
@@ -147,33 +155,22 @@ async function wrappedOnBeforeRenderClient(pageContext) {
|
|
|
147
155
|
}
|
|
148
156
|
pageContext.proxyLayoutInfo = proxyLayoutInfo;
|
|
149
157
|
pageContext._turbolinksProxy = {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
pageContext._waitForHeadScripts = mergeHead(headEl);
|
|
154
|
-
Turbolinks.controller.viewWillRender();
|
|
158
|
+
bodyAttrs: getElementAttributes(bodyEl),
|
|
159
|
+
body: proxyBodyEl,
|
|
160
|
+
head: headEl
|
|
155
161
|
};
|
|
156
|
-
await Turbolinks._vikeBeforeRender(
|
|
157
|
-
pageContext._turbolinksVisit,
|
|
158
|
-
pageContext.errorWhileRendering
|
|
159
|
-
);
|
|
160
|
-
copyBody(bodyEl);
|
|
161
|
-
} else {
|
|
162
|
-
const { head, body } = pageContext._turbolinksProxy;
|
|
163
|
-
pageContext._beforeRender = () => {
|
|
164
|
-
pageContext._waitForHeadScripts = mergeHead(head);
|
|
165
|
-
Turbolinks.controller.viewWillRender();
|
|
166
|
-
};
|
|
167
|
-
await Turbolinks._vikeBeforeRender(
|
|
168
|
-
pageContext._turbolinksVisit,
|
|
169
|
-
pageContext.errorWhileRendering
|
|
170
|
-
);
|
|
171
|
-
copyBody(body);
|
|
172
162
|
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
163
|
+
const { head, bodyAttrs } = pageContext._turbolinksProxy;
|
|
164
|
+
pageContext._beforeRender = () => {
|
|
165
|
+
pageContext._waitForHeadScripts = mergeHead(head);
|
|
166
|
+
Turbolinks.controller.viewWillRender();
|
|
167
|
+
};
|
|
168
|
+
await Turbolinks._vikeBeforeRender(
|
|
169
|
+
pageContext._turbolinksVisit,
|
|
170
|
+
pageContext.errorWhileRendering
|
|
171
|
+
);
|
|
172
|
+
if (bodyAttrs)
|
|
173
|
+
setBodyAttributes(bodyAttrs);
|
|
177
174
|
}
|
|
178
175
|
export {
|
|
179
176
|
wrappedOnBeforeRenderClient as default
|
|
@@ -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\";\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 pageContext._beforeRender = () => {\n pageContext._waitForHeadScripts = mergeHead(headEl);\n Turbolinks.controller.viewWillRender(); // turbolinks:before-render\n };\n\n await Turbolinks._vikeBeforeRender(\n pageContext._turbolinksVisit,\n pageContext.errorWhileRendering\n );\n copyBody(bodyEl);\n } else {\n const { head, body } = pageContext._turbolinksProxy!;\n\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 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":";;;;;;;AAKA,IAAM,wBAAiE,CAAC;AACxE,IAAI,YAAY;AAChB,IAAI;AAGG,SAAS,UAAU,MAAuB;AAC/C,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,UAAU,eAAe,SAAS,IAAI;AAC5C,QAAM,SAAS,MAAM,OAAO,WAAW,WAAW,gBAAgB;AAElE,MACE,KACG,cAAc,uCAAuC,GACpD,aAAa,SAAS,MAAM,UAChC;AACA,WAAO;AAAA,EACT;AAEA,+BACE,8BACA,wBAAwB,CAAC,GAAG,QAAQ,SAAS,GAAG,QAAQ,WAAW,CAAC;AACtE,MACE,+BACA,wBAAwB,CAAC,GAAG,QAAQ,SAAS,GAAG,QAAQ,WAAW,CAAC,GACpE;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AAEb,eAAW,WAAW,QAAQ,SAAS;AACrC,4BAAsB,QAAQ,SAAS,IAAI;AAAA,QACzC,SAAS,iBAAiB,OAAO;AAAA,MACnC;AAAA,IACF;AACA,gBAAY;AAAA,EACd;AAEA,gCAA8B,QAAQ,aAAa,QAAQ,WAAW;AACtE,uCAAqC,QAAQ,WAAW;AACxD,iCAA+B,QAAQ,WAAW;AAElD,SAAO,0BAA0B,QAAQ,OAAO;AAClD;AAEA,SAAS,wBAAwB,SAAoB;AACnD,SAAO,QACJ,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;;;AC1JA,eAAO,4BACL,aACA;AACA,MAAI,YAAY,aAAa;AAC3B,gBAAY,mBAAmB;AAAA,MAC7B,MAAM,SAAS,eAAe,cAAc;AAAA,IAC9C;AACA;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,MAAM;AAAA,IACR;AACA,gBAAY,gBAAgB,MAAM;AAChC,kBAAY,sBAAsB,UAAU,MAAM;AAClD,iBAAW,WAAW,eAAe;AAAA,IACvC;AAEA,UAAM,WAAW;AAAA,MACf,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AACA,aAAS,MAAM;AAAA,EACjB,OAAO;AACL,UAAM,EAAE,MAAM,KAAK,IAAI,YAAY;AAEnC,gBAAY,gBAAgB,MAAM;AAChC,kBAAY,sBAAsB,UAAU,IAAK;AACjD,iBAAW,WAAW,eAAe;AAAA,IACvC;AAEA,UAAM,WAAW;AAAA,MACf,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AACA,aAAS,IAAI;AAAA,EACf;AACF;AAGA,SAAS,SAAS,QAAqB;AACrC,WAAS,KACN,kBAAkB,EAClB,QAAQ,CAAC,MAAM,SAAS,KAAK,gBAAgB,CAAC,CAAC;AAClD,wBAAsB,SAAS,MAAM,MAAM;AAC7C;","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 = () => 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 // 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._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":[]}
|
package/package.json
CHANGED
|
@@ -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 getLayout: { env: { server: true, client: true } },\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 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 }\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,WAAW,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACjD,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,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":[]}
|