Preview: Dev-Modus nur mit dev-Skript waehlbar

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-09-30 22:47:54 +00:00
1 parent a5cb668853
commit 04b45e4207
5 files changed
+159 -7

No files matched your search

+4 -1
View File
@@ -540,6 +540,7 @@ export async function syncPreviewTlsOnStartup({
// ---- Preview-Runner (PREVIEW_RUNNER=on) ----
// Zeiten des Hintergrund-Verfolgers (fuer Tests ueberschreibbar)
const NO_DEV_SCRIPT_ERROR = 'Kein dev-Skript in package.json'
export const runnerTiming = { pollMs: 2000, maxMs: 60 * 60 * 1000, unreachableMs: 5 * 60 * 1000 }
// Neuester Lauf je Repo: aeltere Verfolger schreiben nichts mehr (R14)
const latestRun = new Map()
@@ -679,7 +680,9 @@ async function followRun({ repoFullName, project, token, runId, subdomain, job,
} else {
await patchProject(repoFullName, project, {
previewState: 'failed',
previewError: maskLog(failure || run?.error || 'Preview-Build fehlgeschlagen', env),
previewError: run?.error === NO_DEV_SCRIPT_ERROR && !failure
? 'Dev-Modus hier nicht möglich – statische Version ist online'
: maskLog(failure || run?.error || 'Preview-Build fehlgeschlagen', env),
})
}
if (!current()) return
+35
View File
@@ -0,0 +1,35 @@
// Prueft, ob ein Repo-Branch ein dev-Skript in package.json hat (Dev-Modus nur dann sinnvoll).
import { giteaFetch, splitRepo } from './giteaClient.js'
export const cacheTtlMs = 60 * 1000
const cache = new Map()
export function clearDevScriptCache() { cache.clear() }
/** true = dev-Skript vorhanden, false = kein package.json oder kein dev-Skript, null = unbekannt (Gitea-Fehler). */
export async function repoHasDevScript(repoFullName, branch) {
const key = `${repoFullName}@${branch}`
const hit = cache.get(key)
if (hit && Date.now() - hit.at < cacheTtlMs) return hit.value
const value = await lookup(repoFullName, branch)
cache.set(key, { at: Date.now(), value })
return value
}
async function lookup(repoFullName, branch) {
const [owner, repo] = splitRepo(repoFullName)
if (!owner || !repo) return null
let data
try {
data = await giteaFetch(`/repos/${owner}/${repo}/contents/package.json?ref=${encodeURIComponent(branch)}`)
} catch (err) {
return err?.status === 404 ? false : null
}
try {
const pkg = JSON.parse(Buffer.from(data?.content || '', 'base64').toString('utf8'))
const dev = pkg?.scripts?.dev
return typeof dev === 'string' && dev.trim() !== ''
} catch {
return null
}
}