allow external domain override for user-facing links (#9057)

* feat: allow external domain override for user-facing links

* refactor: use plain var + setter for externalDomain

* chore: expose externalDomain in package exports
This commit is contained in:
Ruben Fiszel
2026-05-07 13:21:23 +00:00
committed by GitHub
parent 23e081b078
commit aafe23dda6
3 changed files with 27 additions and 2 deletions
+4
View File
@@ -379,6 +379,10 @@
"types": "./package/stores.d.ts",
"default": "./package/stores.js"
},
"./externalDomain": {
"types": "./package/externalDomain.d.ts",
"default": "./package/externalDomain.js"
},
"./gen": {
"types": "./package/gen/index.d.ts",
"default": "./package/gen/index.js"
+6 -2
View File
@@ -15,6 +15,7 @@
import { Button, Drawer, DrawerContent } from './common'
import { copyToClipboard } from '$lib/utils'
import { base } from '$lib/base'
import { withExternalDomain } from '$lib/externalDomain'
import { workspaceStore } from '$lib/stores'
import { AnsiUp } from 'ansi_up'
import NoWorkerWithTagWarning from './runs/NoWorkerWithTagWarning.svelte'
@@ -204,6 +205,9 @@
scroll = true
}
})
let downloadHref = $derived(
withExternalDomain(`${base}/api/w/${$workspaceStore}/jobs_u/get_logs/${jobId}`)
)
let truncatedContent = $derived(truncateContent(content, loadedFromObjectStore, LOG_LIMIT))
let prefixInfo = $derived(findPrefixInfo(truncatedContent))
let downloadStartUrl = $derived(findStartUrl(truncatedContent, prefixInfo))
@@ -244,7 +248,7 @@
{#snippet actions()}
{#if jobId && download}
<Button
href="{base}/api/w/{$workspaceStore}/jobs_u/get_logs/{jobId}"
href={downloadHref}
download="windmill_logs_{jobId}.txt"
color="light"
size="xs"
@@ -323,7 +327,7 @@
<a
class="text-primary pb-0.5"
target="_blank"
href="{base}/api/w/{$workspaceStore}/jobs_u/get_logs/{jobId}"
href={downloadHref}
download="windmill_logs_{jobId}.txt"
><Download size="14" />
</a>
+17
View File
@@ -0,0 +1,17 @@
// Optional external domain (e.g. "https://app.windmill.dev") used to build
// absolute URLs for user-facing links when the Windmill UI is embedded on a
// different host than the API. Undefined = same-origin (default behavior).
// Intended to be set once at boot by SDK consumers (e.g. windmill-react-sdk),
// before any component that builds links has rendered — there is no
// reactivity, so changing it after mount won't update already-rendered hrefs.
let externalDomain: string | undefined = undefined
export function setExternalDomain(domain: string | undefined): void {
externalDomain = domain
}
export function withExternalDomain(path: string): string {
if (!externalDomain) return path
const trimmed = externalDomain.replace(/\/$/, '')
return `${trimmed}${path.startsWith('/') ? path : `/${path}`}`
}