function isFirstPageParamValue(raw: string): boolean { const normalized = raw.trim() if (!normalized) { return false } if (/^\+?0*1(?:\.0+)?$/.test(normalized)) { return true } const parsed = Number(normalized) return Number.isFinite(parsed) && parsed === 1 } export function buildPublicCanonicalUrl(siteUrlRaw: unknown, currentFullPath: unknown): string | null { if (typeof siteUrlRaw !== 'string') { return null } const siteUrl = siteUrlRaw.trim() if (!siteUrl) { return null } try { const base = new URL(siteUrl) const path = typeof currentFullPath === 'string' && currentFullPath.trim() ? currentFullPath.split('#', 1)[0]! : '/' const canonical = new URL(path, `${base.origin}/`) const pageValues = canonical.searchParams.getAll('page') if (pageValues.length > 0 && pageValues.every(isFirstPageParamValue)) { canonical.searchParams.delete('page') } return canonical.href } catch { return null } }