From 56abf82472caca842b0493af24a40e4ec6a728e7 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Tue, 7 Jul 2026 15:19:32 -0500 Subject: [PATCH 01/10] Add local Lume docs run support --- .codex/environments/environment.toml | 26 ++- docs/_config.ts | 49 ++++ docs/_includes/layouts/base.vto | 21 +- docs/_includes/layouts/docs.vto | 32 +-- docs/deno.json | 9 +- docs/deno.lock | 49 ++++ docs/public/assets/css/search.css | 71 ++++++ docs/public/assets/js/docs-layout.js | 9 + docs/public/assets/js/search.js | 219 ++++++++++++++++++ docs/public/assets/js/site.js | 14 ++ docs/scripts/browser/exceptionless-client.ts | 35 +++ docs/scripts/postbuild.ts | 2 +- docs/scripts/serve.ts | 26 ++- docs/search.md | 28 ++- docs/site-migration-plan.md | 79 ++++++- .../Extensions/WorktreeScope.cs | 8 +- src/Exceptionless.AppHost/Program.cs | 18 ++ 17 files changed, 632 insertions(+), 63 deletions(-) create mode 100644 docs/public/assets/css/search.css create mode 100644 docs/public/assets/js/docs-layout.js create mode 100644 docs/public/assets/js/search.js create mode 100644 docs/public/assets/js/site.js create mode 100644 docs/scripts/browser/exceptionless-client.ts diff --git a/.codex/environments/environment.toml b/.codex/environments/environment.toml index df9fe419ab..063467dc65 100644 --- a/.codex/environments/environment.toml +++ b/.codex/environments/environment.toml @@ -25,6 +25,11 @@ if ! command -v npm >/dev/null 2>&1; then exit 1 fi +if ! command -v deno >/dev/null 2>&1; then + echo "deno is not installed or not on PATH. The Lume docs site requires Deno." >&2 + exit 1 +fi + echo "dotnet:" dotnet --version @@ -34,6 +39,9 @@ node --version echo "npm:" npm --version +echo "deno:" +deno --version + echo "Restoring .NET workloads..." dotnet workload restore @@ -46,7 +54,7 @@ npm ci --prefix src/Exceptionless.Web/ClientApp --prefer-offline --no-audit echo "Installing legacy Angular frontend dependencies..." npm ci --prefix src/Exceptionless.Web/ClientApp.angular --prefer-offline --no-audit -echo "Setup complete. Use the Run Aspire action to start the app." +echo "Setup complete. Use the Run Aspire action to start the app, or Run Lume Docs to test the static site." ''' [cleanup] @@ -62,6 +70,8 @@ echo "Removing repo-local temp/test output only..." rm -rf .cache/tmp rm -rf .aspire rm -rf TestResults +rm -rf docs/_site +rm -rf docs/_cache find . -type d \( -name TestResults -o -name .vite -o -name .svelte-kit \) -exec rm -rf {} + @@ -88,6 +98,20 @@ else fi ''' +[[actions]] +name = "Run Lume Docs" +icon = "run" +command = ''' +set -e + +cd "${CODEX_WORKTREE_PATH:?CODEX_WORKTREE_PATH is required}/docs" + +export PORT="${PORT:-7141}" + +echo "Starting Lume docs at http://127.0.0.1:$PORT/" +deno task serve -- --port "$PORT" +''' + [[actions]] name = "Stop Aspire Containers, keep data" icon = "tool" diff --git a/docs/_config.ts b/docs/_config.ts index d31c755189..3c908ae826 100644 --- a/docs/_config.ts +++ b/docs/_config.ts @@ -63,9 +63,58 @@ site.hooks.markdownIt((markdownIt: any) => { site.data("docsNavHtml", docsNavHtml) site.data("siteDataJson", siteDataJson) site.data("copyrightYear", new Date().getFullYear()) +site.data("exceptionlessClientScriptSrc", exceptionlessClientScriptSrc()) export default site +function exceptionlessClientScriptSrc(): string { + const apiKey = firstNonEmpty( + Deno.env.get("EXCEPTIONLESS_SITE_API_KEY"), + Deno.env.get("PUBLIC_EXCEPTIONLESS_API_KEY"), + ) + if (!apiKey) { + return "" + } + + const params = new URLSearchParams({ apiKey }) + const serverUrl = firstNonEmpty( + Deno.env.get("EXCEPTIONLESS_SITE_SERVER_URL"), + Deno.env.get("PUBLIC_EXCEPTIONLESS_SERVER_URL"), + ) + + if (serverUrl) { + params.set("serverUrl", serverUrl) + } + + const environment = firstNonEmpty( + Deno.env.get("EXCEPTIONLESS_SITE_ENVIRONMENT"), + Deno.env.get("EX_AppMode"), + ) + if (isNonProduction(environment)) { + params.set("environment", environment) + } + + const version = firstNonEmpty( + Deno.env.get("EXCEPTIONLESS_SITE_VERSION"), + Deno.env.get("PUBLIC_APP_VERSION"), + Deno.env.get("GITHUB_SHA"), + ) + if (version) { + params.set("version", version) + } + + return `/assets/js/exceptionless-client.js?${params}` +} + +function isNonProduction(environment: string): boolean { + const normalizedEnvironment = environment.trim().toLowerCase() + return normalizedEnvironment !== "" && normalizedEnvironment !== "production" && normalizedEnvironment !== "prod" +} + +function firstNonEmpty(...values: Array): string { + return values.find((value) => value && value.trim())?.trim() ?? "" +} + function uniqueHeadingSlug(value: string, env: Record): string { const counts = getHeadingSlugCounts(env) const baseSlug = slugifyHeading(value) || "section" diff --git a/docs/_includes/layouts/base.vto b/docs/_includes/layouts/base.vto index 2e8171a9a5..c73d5dfc16 100644 --- a/docs/_includes/layouts/base.vto +++ b/docs/_includes/layouts/base.vto @@ -74,7 +74,9 @@ - {{ content }} +
+ {{ content }} +
+ + {{ if exceptionlessClientScriptSrc }} + + {{ /if }} {{ for script of extraScripts || [] }} {{ /for }} - + {{ for script of extraModuleScripts || [] }} + + {{ /for }} diff --git a/docs/_includes/layouts/docs.vto b/docs/_includes/layouts/docs.vto index 19cdd14025..fde317816e 100644 --- a/docs/_includes/layouts/docs.vto +++ b/docs/_includes/layouts/docs.vto @@ -2,19 +2,21 @@ layout: layouts/base.vto extraStyles: - /assets/css/prism.css +extraModuleScripts: + - /assets/js/docs-layout.js --- - -
+
{{ content }}
+ +